一、 为什么会存在这样的工作机制?
1.NameNode中的元数据是存储在哪里的?
(1)若是存储在NN节点的磁盘中,因为经常需要进行随机访问,或者是不断的被访问,还有要响应客户请求,效率必然很低,所以元数据需要存放在内存中,但如果存在内存中。一旦遇到突发状况,比如断电,元数据信息丢失,会造成集群瘫痪。
因此产生在磁盘中备份元数据的FsImage。
(2)可是又有新的问题,就是在NN做对客户的访问和响应客户的请求,同时还要更新fsimage,就会导致效率极其低,但是不更新,又会回到原来的断电数据丢失的情况。
因此,引入Edits文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。
,这样一来,一旦NN节点突然挂掉,可以通过fsimage和edit的合并,合成元数据。
(3)但是,如果长时间添加数据道edits中,会导致该文件数据过于庞大,效率就会降低,而且断电后,恢复元数据需要时间就会很长很长(因为合并的过程时fsimage通过edits的操作数进行一步一步恢复,后面会讲),因此需要定期进行fsimage和edits的合并,而且这个操作不能交给NN节点完成,不然效率会降低。
因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并。
二、NameNode和SceondaryNameNode的工作机制图解析
-
第一阶段:NameNode启动
- 在对NN第一次启动服务后,会创建fsimage文件和edits文件(
做初始化-format的时候edits文件是不会生成,并不会初始化创建,只会创建一个fsimage
),如果不是第一次启动,则会加载NN节点中存在的fsimage和edits进行合并操作(CheckPoint)。 - 客户端对元数据进行增删改的请求。
- NN中的edits记录操作数,并在
2NN的请求是否需要CheckPoint后更新滚动日志
- NN在内存中对数据进行增删改
- 在对NN第一次启动服务后,会创建fsimage文件和edits文件(
-
第二阶段:Secondary NameNode工作
- 第一次启动的时候2NN的时候,
节点内只有一个在NN初始化后第一次启动服务会在NN中拷贝一个空fsimage&
- 第一次启动的时候2NN的时候,