1 NameNode 和 DataNode 之间的心跳机制
1)NameNode 启动时,会启动一个 IPC server 服务,
2)DataNode 启动后会被动连贯 NameNode 的 IP server 服务,默认每隔 3 秒连贯一次,也就是心跳。
这个工夫能够通过 dfs.heartbeat.interval 参数设置,也就是心跳工夫。
3)DataNode 通过心跳在 NameNode 注册汇报本人的状态,NameNode 通过心跳获取 DataNode 的状态和下达指令。
4)当 NameNode 长时间没有收到 DataNode 的心跳,就认为 DataNode 挂掉了。
这种心跳机制同样存在于 Yarn 中 ResourceManager 和 NodeManager 中。
这个就是 Hadoop 的 Master/Slave 架构,NameNode 和 ResourceManager 就是 Master,DataNode 和 NodeManager 就是 Slave。
2 NameNode 和 SecondaryNameNode 的工作机制
第一个问题,NameNode 元数据怎么保留的?
首先 NaomNode 的元数据须要放在内存中,因为咱们须要常常拜访 NameNode 节点获取元数据,若是放在磁盘中,那效率会非常低。
既然放在内存中,那必要要有一个机制保障内存数据的平安,因为内存中数据一旦断电就丢了,所以内存中的元数据也必须要落地到磁盘,这个就是 FstImage.
但这样还没有到高枕无忧的境地,内存中的元数据随时可能更新,这时是否要同步更新 FsImage 呢?如果咱们更新,必然会导致效率底下,如果咱们不更新,那内存中的元数据和 FsImage 就会不统一,一旦呈现 NameNode 节点断电之类的状况,就会呈现局部数据失落。
那么咱们引入这样一个记录文件 Edits,只有内存中的元数据减少或者更新,那么就同步把这个操作记录追加到 Edits,这样即使 NameNode 断电,咱们还能够依据 Edits 和 FsImage 来复原元数据。
新的问题又来了,内存中的元数据可是常常发生变化的,那一直的追加记录到 Edits 中,那必然会导致这个文件越来越大,那么将来咱们须要复原元数据时,须要破费的工夫也必然大大增加,影响咱们效率,所以咱们须要定期对 FsImage 和 Edits 进行合并。
好了,工作来了,定义把 FsImage 和 Edits 进行合并,那这个工作谁来做呢?NameNode 能够吗?当然能够,但这会导致 NameNode 工作过重,影响效率,那为了保障效率,就把这个工作交给另外一个人来做,那就是 Secondary NameNode。
从这里能够明确 Secondary NameNode 并不是 NameNode 的热备,当 NameNode 挂了的时候,它并不能代替 NameNode 工作,但它能够用帮忙复原 NameNode。
具体 NameNode 和 Secondary NameNode 的工作流程如下
阶段 1:
1)首次启动集群后,咱们须要对 NameNode 格式化,这时会创立 FsImage 和 Edits,这些文件就在 $HADOOP_HOME/data/name/current 下.
之后启动,间接加载 Edits 和 FsImage 到内存中。
2)Client 也就是客户端对元数据进行增删改的操作申请。
3)NameNode 先记录操作,更新日志,而后在内存中对元数据进行增删改的操作。
阶段 2:
SecondaryNameNode 执行合并的操作,叫 CheckPoint,这个操作有两个触发条件。
第一个,就是间隔时间到,默认是 1 小时,这个能够调整。
第二个,就是 SecondaryNameNode 会一分钟查看一次操作次数,当操作数达到设置的下限,就会触发。
1)首先 SecondaryNameNode 会询问 NameNode 是否须要执行 CheckPoint
2)拿到 NameNode 的返回后果,就开始申请执行 CheckPoint
3)NameNode 滚动更新正在的 Edits 日志,将滚动前的 Edits 和 FsImage 文件拷贝到 SecondaryNameNode 上。
4)SecondaryNameNode 将两个文件加载到内存进行合并,生成新的 fsImage.chkpoint,拷贝到 NameNode 上。
5)NameNode 将 fsimage.chkpoint 命名为 fsimage。
当然在有了 HA 后,也很少应用 SecondaryName 了。
3 平安模式
后面讲了,当 NameNode 启动后,首先是将 FsImage 和 Edits 文件退出内存,这个是为保障失去最新的元数据,这个其实也是合并,之后生成一个新的 FsImage 和一个空白的 Edits,而后启动 IPC Server 服务,监听 DataNode 的申请,在这个期间,NameNode 的文件系统对外界处于只读状态,也就是平安模式。
之后 DataNode 启动,在各个 DataNode 通过 NameNode 的 IPCServer 发送他们最新的块列表信息。
当达到 dfs.replication.min 设定的值,NameNode 会退出平安模式,这个参数设置的值就是最小正本条件,指的是文件系统中块满足的最小正本级别。