基于本文回答
0
评论

HDFS HA中ZKFC(Zookeeper Failover Controller)的作用是什么?

知识点图片

在 HDFS HA(高可用)架构中,ZKFC(ZooKeeper Failover Controller) 是实现 NameNode 自动故障转移(Automatic Failover) 的核心组件。

简单来说,NameNode 自身并不会主动和 ZooKeeper 交互来进行选主,这个工作是交由 ZKFC 来代理完成的。每个运行 NameNode 的节点上都会同时运行一个 ZKFC 进程。

ZKFC 的主要作用可以归纳为以下四个方面:

1. 健康状态监控(Health Monitoring)

  • 作用:ZKFC 会定期通过 RPC 调用向本地的 NameNode 发送健康检查命令(Ping)。
  • 机制:只要 NameNode 及时响应并且状态正常,ZKFC 就认为该 NameNode 是健康的。如果 NameNode 宕机、死锁或无响应,ZKFC 就会将其标记为不健康状态。

2. ZooKeeper 会话管理(ZooKeeper Session Management)

  • 作用:ZKFC 负责维护与 ZooKeeper 集群的通信会话。
  • 机制:当本地 NameNode 健康时,ZKFC 会在 ZooKeeper 中保持打开一个临时节点(Ephemeral Node)。如果本地 NameNode 发生故障,或者 ZKFC 自身挂掉,与 ZooKeeper 的心跳会话就会超时,ZooKeeper 会自动删除这个临时节点。

3. 基于 ZooKeeper 的选举(Leader Election)

  • 作用:决定哪一个 NameNode 应该成为 Active(活跃)状态,哪一个成为 Standby(备用)状态。
  • 机制
    • ZooKeeper 中存在一个用于互斥锁的特殊节点(类似于一把锁)。
    • 如果当前集群没有 Active NameNode(即 ZK 中的锁节点不存在),各个健康的 ZKFC 会尝试在 ZooKeeper 中创建这个锁节点。
    • ZooKeeper 保证只有一个 ZKFC 能创建成功。创建成功的 ZKFC 所在的 NameNode 就会被提升为 Active 状态,而失败的 ZKFC 会监控这个锁节点,其对应的 NameNode 保持 Standby 状态。

4. 脑裂防护与隔离(Fencing & Split-Brain Prevention)

  • 作用:防止 HDFS 集群中同时出现两个 Active NameNode(即“脑裂”现象,这会导致数据严重损坏)。
  • 机制
    • 当原来的 Active NameNode 发生假死(例如网络延迟、频繁 GC)导致其在 ZK 中的临时节点消失时,Standby 端的 ZKFC 会尝试接管并成为新的 Active。
    • 但在真正让本地 NameNode 切换为 Active 之前,新的 ZKFC 会触发隔离(Fencing)机制
    • ZKFC 会尝试通过 RPC 请求将原 Active NameNode 降级为 Standby。如果请求失败,ZKFC 会调用预先配置的隔离脚本(通常是 SSH Fencing),直接登录到原 Active 节点将其进程杀死(Kill),确保旧的 NameNode 绝对不再提供服务后,才允许本地 NameNode 升级为 Active。

总结工作流程(故障发生时):

  1. Active NameNode 故障 ->
  2. 它的 ZKFC 发现故障(或 ZKFC 一起挂了) ->
  3. ZooKeeper 上的临时锁节点被释放 ->
  4. Standby 的 ZKFC 感知到锁释放,尝试去 ZK 抢锁 ->
  5. 抢锁成功,触发 Fencing 机制确保旧 Active 彻底死亡 ->
  6. 通知本地 Standby NameNode 转换为 Active

通过这种机制,ZKFC 将 ZooKeeper 的分布式协调能力与 NameNode 的状态管理完美结合,实现了 HDFS 集群的无缝、自动高可用切换。

右滑查看面试常问