NameNode HA的实现原理

1. NameNode HA架构概述

实现架构:安全

组件描述:架构

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 上报数据块的位置信息。内存

2. NameNode HA实现原理

实现架构:同步

切换流程:it

  1. HealthMonitor 初始化完成以后会启动内部的线程来定时调用对应 NameNode 的 HAServiceProtocol RPC 接口的方法,对 NameNode 的健康状态进行检测。
  2. HealthMonitor 若是检测到 NameNode 的健康状态发生变化,会回调 ZKFailoverController 注册的相应方法进行处理。
  3. 若是 ZKFailoverController 判断须要进行主备切换,会首先使用 ActiveStandbyElector 来进行自动的主备选举。
  4. ActiveStandbyElector 与 Zookeeper 进行交互完成自动的主备选举。
  5. ActiveStandbyElector 在主备选举完成后,会回调 ZKFailoverController 的相应方法来通知当前的 NameNode 成为主 NameNode 或备 NameNode。
  6. ZKFailoverController 调用对应 NameNode 的 HAServiceProtocol RPC 接口的方法将 NameNode 转换为 Active 状态或 Standby 状态。

3. NameNode 共享存储

基于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 才能安全地对外提供服务。

相关文章
相关标签/搜索