NN和2NN工作机制
元数据存储在NameNode中备份在Fsimage中。为了提高效率和保持一致性,因此引入Edits文件(只进行追加操作,效率很高)当元数据更新或者添加时,修改内存中的元数据并追加到Edits中。这样一旦NameNode节点断电可以通过FsImage和Edits的合并,合成元数据。
但是,如果长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时 间过长。因此,需要定期进行FsImage和Edits合并,如果这个操作由NameNode节点完成,又会效率过低。因此引入一个新的节点SeconddaryNanmeNode,专门用于FsImage和Edits的合并。
第一阶段:NameNode启动
1.第一次启动NamdeNode格式化后,创建FsImage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
2.客户端对元数据进行增删改的请求。
3.NameNode记录操作日志,更新滚动日志。
4.NameNode在内存中对元数据进行增删改。
第二阶段: SecondaryNameNode工作
1.SecondaryNameNode询问NameNode是否要CheckPoint。直接带回NameNode是否检查结果。
2.SecondaryNameNode请求执行CheckPoint。
3.NameNode滚动正在写的Edits.
4.将滚动前的编辑日志和镜像文件拷贝到SecondayNameNode。
5.SecondayNameNode加载编辑日志和镜像文件到内存并进行合并。
6.生成新的镜像文件fsimage.chkpoint。
7.拷贝fsimage.chkpoint到NameNode。
8.NameNode将fsimage.chkpoint重新命名成fsimage。
NN和2NN工作机制详解
Fsimage:NameNode内存中元数据序列化后形成的文件。
Edits:记录客户端更新元数据信息的每一步操作(可通过Edits运算出元数据)。
NameNode启动时,先滚动Edits并生成一个空的edits.inprogress,然后加载Edits和Fsimage到内存中,此时NameNode内存就持有最新的元数据信息。Client开始对NameNode发送元数据的增删改的请求,这些请求的操作首先会被记录到edits.inprogress中(查询元数据的操作不会被记录在Edits中,因为查询操作不会更改元数据信息),如果此时NameNode挂掉,重启后会从Edits中读取元数据的信息。然后,NameNode会在内存中执行元数据的增删改的操作。
由于Edits中记录的操作会越来越多,Edits文件会越来越大,导致NameNode在启动加载Edits时会很慢,所以需要对Edits和Fsimage进行合并(所谓合并,就是将Edits和Fsimage加载到内存中,照着Edits中的操作一步步执行,最终形成新的Fsimage)。SecondaryNameNode的作用就是帮助NameNode进行Edits和Fsimage的合并工作。
SecondaryNameNode首先会询问NameNode是否需要CheckPoint(触发CheckPoint需要满足两个条件中的任意一个,定时时间到和Edits中数据写满了)。直接带回NameNode是否检查结果。SecondaryNameNode执行CheckPoint操作,首先会让NameNode滚动Edits并生成一个空的edits.inprogress,滚动Edits的目的是给Edits打个标记,以后所有新的操作都写入edits.inprogress,其他未合并的Edits和Fsimage会拷贝到SecondaryNameNode的本地,然后将拷贝的Edits和Fsimage加载到内存中进行合并,生成fsimage.chkpoint,然后将fsimage.chkpoint拷贝给NameNode,重命名为Fsimage后替换掉原来的Fsimage。NameNode在启动时就只需要加载之前未合并的Edits和Fsimage即可,因为合并过的Edits中的元数据信息已经被记录在Fsimage中。
CheckPoint时间设置
1.通常情况下,SecondaryNameNode每隔一小时执行一次。
2.一分钟检查一次操作次数,当操作次数达到1百万时, SecondaryNameNode执行一次。
集群安全模式
1.NameNode启动
NameNode启动时,首先将镜像文件FsImage载入内存,并执行编辑日志Edits中的各项操作。一旦在内存中成功创建文件系统元数据的镜像,则创建一个新的FsImage文件和一个空的编辑日志。此时,NameNode开始监听DataNode请求。这个过程期间,NameNode一直运行在安全模式。即NameNode的文件系统对于客户端来说是只读。
2.DataNode启动
系统中的数据块的位置并不是由NameNode维护的,而是以块列表的形式存储在DataNode中。在系统的正常操作期间,NameNode会在内存中保留所有块位置的映射信息。在安全模式下,各个DataNode会向NameNode发送最新的块表信息,NameNode了解到足够多的块的位置信息后,即可运行高效的文件系统。
3.安全模式推出判断
如果满足”最小副本条件”, NameNode会在30秒后退出安全模式。最小副本条件就是在整个文件系统中99.9%的块满足最小副本级别(默认值:dfs.repliaction.min=1)。在启动一个刚刚格式的HDFS集群时,因为系统中还没任何块,所以NameNode不会进入安全模式。
