实现架构:安全
组件描述:架构
Active NN和Standby NN:两台 NameNode 造成互备,一台处于 Active 状态,另一台处于 Standby 状态,只有主 NameNode 才能对外提供读写服务。spa
主备切换控制器 ZKFC:ZKFailoverController 做为独立的进程运行,对 NameNode 的主备切换进行整体控制。ZKFC能及时检测到 NameNode 健康情况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换,固然 NameNode 目前也支持不依赖于 Zookeeper 的手动主备切换。线程
Zookeeper 集群:为主备切换控制器提供主备选举支持。接口
共享存储系统:共享存储系统保存了 NameNode 在运行过程当中所产生的 HDFS 元数据。Active NN 和standby NN 经过共享存储系统实现元数据同步。在进行主备切换的时候,新的主 NameNode 在确认元数据彻底同步以后才能继续对外提供服务。进程
DataNode 节点:两NN之间除了共享HDFS 元数据信息以外,还须要共享 HDFS 的数据块和 DataNode 之间的映射关系。DataNode 会同时向主 NameNode 和备 NameNode 上报数据块的位置信息。内存
实现架构:同步
切换流程:it
基于QJM的共享存储的数据同步机制:集群
机制描述:
基于 QJM 的共享存储主要用于保存 EditLog,FSImage 文件仍是在 NameNode 的本地磁盘上。多个JournalNode 构成的集群来存储 EditLog,每一个 JournalNode 保存一样的 EditLog 副本。每次 NameNode 写 EditLog 的时候,除了向本地磁盘写入 EditLog 以外,也会并行地向 JournalNode 集群之中的每个 JournalNode 发送写请求,只要大多数 (majority) 的 JournalNode 节点返回成功就认为向 JournalNode 集群写入 EditLog 成功。若是有 2N+1 台 JournalNode,那么根据大多数的原则,最多能够容忍有 N 台 JournalNode 节点挂掉。
基于QJM的共享存储的数据恢复机制:
处于 Standby 状态的 NameNode 转换为 Active 状态的时候,有可能上一个 Active NameNode 发生了异常退出,那么 JournalNode 集群中各个 JournalNode 上的 EditLog 就可能会处于不一致的状态,因此首先要作的事情就是让 JournalNode 集群中各个节点上的 EditLog 恢复为一致。另外如前所述,当前处于 Standby 状态的 NameNode 的内存中的文件系统镜像有很大的多是落后于旧的 Active NameNode 的,因此在 JournalNode 集群中各个节点上的 EditLog 达成一致以后,接下来要作的事情就是从 JournalNode 集群上补齐落后的 EditLog。只有在这两步完成以后,当前新的 Active NameNode 才能安全地对外提供服务。