HDFS HA是如何实现主备NameNode自动切换的?
HDFS HA(高可用)实现主备 NameNode 自动切换的核心,是依赖于 ZooKeeper (ZK) 和一个独立的进程 ZKFC (ZooKeeperFailoverController)。
整个自动切换的过程设计非常严密,主要是为了在保证高可用的同时,绝对避免脑裂(Split-Brain)现象导致的数据损坏。
以下是 HDFS HA 实现主备自动切换的详细机制:
1. 核心组件
实现自动切换主要依赖以下三个组件:
- ZooKeeper 集群:负责分布式协调,提供主节点选举机制和状态存储。
- ZKFC (ZooKeeper Failover Controller):每个 NameNode 节点上都会运行一个 ZKFC 进程。它作为一个轻量级的守护进程,负责监控本地 NameNode 的健康状态,并与 ZooKeeper 交互。
- JournalNodes (JNs) 集群:用于在 Active 和 Standby NameNode 之间共享 EditLog(编辑日志),保证两者元数据的一致性。
2. ZKFC 的三大核心职责
ZKFC 是自动切换的“大脑”,它的工作包含三个部分:
- 健康监控 (Health Monitoring):ZKFC 定期通过 RPC 向本地的 NameNode 发送心跳指令,检查其状态(如是否存活、是否进入死锁等)。
- ZooKeeper 会话管理 (ZooKeeper Session Management):如果本地 NN 健康,ZKFC 会在 ZK 中保持一个打开的 Session。如果本地 NN 是 Active 状态,ZKFC 会在 ZK 中创建一个临时节点 (Ephemeral Node) 作为锁(Lock)。
- 基于 ZK 的选举 (ZooKeeper-based Election):如果 ZK 集群中没有代表 Active 的临时节点,ZKFC 会尝试创建该节点进行“抢锁”。
3. 自动切换的完整流程
当 Active NameNode (ANN) 发生故障时,切换流程如下:
第一步:故障发现
- 情形A(NameNode进程挂了):本地的 ZKFC 探测到 NameNode 停止响应,ZKFC 会主动断开与 ZooKeeper 的连接,或者主动删除在 ZK 上的临时节点(排他锁)。
- 情形B(整个节点宕机或断网):本地 ZKFC 无法与 ZooKeeper 通信。经过一个 Session 超时时间后,ZooKeeper 会自动删除代表该 NameNode 的临时节点。
第二步:触发选举 (Watcher 回调)
- Standby NameNode (SBN) 所在机器的 ZKFC 一直在监听(Watch)ZK 上的那个临时节点。
- 一旦临时节点消失,Standby 端的 ZKFC 会立即收到 ZooKeeper 的通知。
第三步:尝试抢锁 (Active Election)
- Standby 端的 ZKFC 收到通知后,立刻尝试在 ZooKeeper 中创建临时节点(抢锁)。
- 抢锁成功后,该 ZKFC 会认为自己应该将本地的 NameNode 提升为 Active。
第四步:执行隔离机制 (Fencing) —— 极其关键!
为了防止“脑裂”(即原来的 Active NN 其实没死,只是网络卡顿,现在有两个 NN 都认为自己是 Active),在真正切换前,必须把原来的 Active NN 隔离掉。
ZKFC 会依次尝试以下 Fencing 策略:
- 尝试优雅隔离:向原来的 Active NN 发送 RPC 请求,要求其降级为 Standby。
- SSH 隔离 (sshfence):如果 RPC 失败,ZKFC 会通过 SSH 登录到旧 Active 所在的机器,执行
kill命令强制杀掉 NameNode 进程。 - 自定义脚本隔离 (shellfence):如果 SSH 也失败,可以调用用户自定义的脚本(例如直接调用智能电源管理 IPMI 切断旧服务器的电源)。
- QJM 级别的隔离 (Epoch Number):这是底线的保障。JournalNode 采用了类似 Paxos 的 Epoch(纪元)机制。新的 Active NN 产生后,会生成一个更高的 Epoch 编号发给 JNs。JNs 会拒绝接收来自旧 Epoch(即旧 Active NN)的写入请求。这样彻底从存储层切断了脑裂的可能。
第五步:状态转换 (Transition to Active)
确认旧 NameNode 已经被彻底隔离后,Standby 端的 ZKFC 会向本地的 Standby NameNode 发送指令,要求其切换为 Active。
- Standby NN 会去 JournalNodes 读取所有未同步的 EditLog,应用到内存中。
- 完成后,Standby NN 退出安全模式(SafeMode)。
- 正式对外提供读写服务。
总结
HDFS HA 的主备自动切换是通过 ZKFC 监控本地 NN 状态 -> ZooKeeper 临时节点+监听机制实现选举 -> 严格的 Fencing 机制防止脑裂 -> JournalNode Epoch 机制保证数据一致性,最终安全地将 Standby 提升为 Active,从而实现无缝的故障转移。整个过程对客户端是透明的(客户端配置了 HA 代理,会自动重试连接新的 Active NN)。
右滑查看面试常问