一、为什么需要 NameNode HA?
在传统非 HA 架构中:
单点故障:单个 NameNode 是集群的唯一元数据中心,一旦宕机,整个 HDFS 集群将不可用。
计划内维护:升级或维护 NameNode 会导致集群服务中断。
HA 机制通过引入备用 NameNode 解决了这些问题。
二、HA 核心组件与角色
1. NameNode 角色
Active NameNode:
处理所有客户端的读写请求。
管理所有数据块的元数据(文件系统命名空间)。
向 JournalNodes 写入 EditLog。
Standby NameNode:
热备份。它持续地与 Active NameNode 保持元数据同步。
不处理客户端请求,但随时准备切换为 Active 状态。
在 HA 架构中,Standby NameNode 取代了 SecondaryNameNode 的检查点功能。
2. JournalNodes (JNs) - 共享编辑存储
一组(通常为 3 个或 5 个,奇数个)独立的守护进程。
构成一个高可用的共享存储系统,用于存储 EditLog(编辑日志)。
Active NameNode 将 EditLog 写入多数 JournalNodes。
Standby NameNode 持续地从 JournalNodes 读取并应用 这些 EditLog,从而与 Active NameNode 保持状态同步。
3. ZooKeeper (ZK) - 协调者
提供分布式协调服务,用于故障检测和领导者选举。
维护一个** ephemeral**(临时)节点,表示当前的 Active NameNode。
4. ZKFC (ZooKeeper Failover Controller) - 故障转移控制器
在每个 NameNode 节点上运行的独立进程。
它的核心职责是:
健康监控:定期向其本地的 NameNode 发送健康检查命令(如 hdfs haadmin -checkHealth)。
ZooKeeper Session 管理:与 ZooKeeper 集群维持一个 Session。
基于 ZooKeeper 的选举:如果本地 NameNode 是健康的,并且 ZKFC 发现当前没有 Active NameNode
(即 ZK 中的 ephemeral 节点不存在),它会尝试在 ZK 中创建该节点,从而将其本地 NameNode 推举为 Active。
三、详细工作流程与机制
1. 元数据同步机制(核心)
这是 HA 能够正常工作的基础。
写操作:
客户端向 Active NameNode 发送写请求。
Active NameNode 将此次操作记录到 EditLog。
Active NameNode 将 EditLog 同时写入所有 JournalNode。只要多数(Quorum)JournalNode 写入成功,就认为写操作持久化成功。
Active NameNode 然后才响应客户端。
同步操作:
Standby NameNode 持续监控 JournalNodes 中 EditLog 的变化。
一旦发现有新的 EditLog,它立即将其拉取到本地。
Standby NameNode 在内存中重放(Replay) 这些 EditLog,从而更新自己的元数据。
同时,Standby NameNode 也会定期将内存中的元数据合并并持久化为新的 FsImage。
通过这个过程,Standby NameNode 几乎实时地与 Active NameNode 保持元数据一致。
2. 故障转移流程
当 Active NameNode 发生故障时(如进程崩溃、机器宕机、网络断开),自动切换过程如下:
检测:
Active NameNode 本地的 ZKFC 检测到其健康状况恶化(或无响应)。
或者,由于网络问题,Active NameNode 与 ZooKeeper 的 Session 超时。
释放锁:
ZooKeeper 检测到 Session 超时,自动删除与之关联的 ephemeral 节点(这个节点代表 Active NameNode 的身份)。
选举新的 Active:
Standby NameNode 的 ZKFC 一直监视着那个 ephemeral 节点。它发现该节点被删除,意识到当前没有 Active NameNode。
Standby 的 ZKFC 立即尝试在 ZooKeeper 中创建同一个 ephemeral 节点。
如果创建成功,意味着它赢得了选举。
隔离(Fencing)与切换:
新的 Active NameNode(原 Standby)会执行 Fencing 操作,确保旧的 Active NameNode 不能再进行任何操作
(例如,通过 SSH 远程杀死旧的 NameNode 进程,或收回其对存储的访问权限)。这是防止 "脑裂" 的关键步骤。
完成隔离后,新的 Active NameNode 开始加载最新的元数据(它本身已经几乎同步),并开始监听客户端请求。
它会通知所有 DataNode 自己已成为新的 Active,DataNode 之后会向新的 Active 发送块报告和心跳。
客户端透明重连:
客户端配置了逻辑名称(如 mycluster)来访问集群,这个逻辑名称背后对应着两个 NameNode 的物理地址。
当客户端与旧的 Active 连接失败时,它会自动尝试连接到新的 Active NameNode。
整个过程通常在 几十秒 内完成,对上层应用的影响很小。
四、关键特性与优势
高可用性:消除了单点故障,实现了快速自动故障恢复(RTO 恢复时间目标 很短)。
数据一致性:通过基于 Quorum 的 JournalNode 和 Fencing 机制,保证了元数据在故障切换时不会丢失或损坏。
透明性:对客户端和 DataNode 基本透明,它们能自动感知到 Active NameNode 的变更。
运维友好:支持计划内的优雅故障转移,便于系统升级和维护。
总结
NameNode HA 是一个经典的基于 主从复制 和 分布式共识 的高可用解决方案。它通过将 元数据状态同步(JournalNodes)
和 故障检测与领导者选举(ZooKeeper + ZKFC) 这两个核心问题解耦,构建了一个健壮、可靠的主备系统。
理解其机制对于运维大规模 HDFS 集群至关重要。
NameNodeHA运行机制
最新推荐文章于 2025-11-20 10:15:16 发布
1358

被折叠的 条评论
为什么被折叠?



