HA架构核心组件

  • Active NameNode:对外提供服务(处理客户端读写请求、管理元数据),与默认 NN 功能一致。
  • Standby NameNode:实时同步 Active NN 的元数据,处于 “待命” 状态;当 Active NN 故障时,立即切换为 Active,接管服务。
  • QJM(群体日志管理器)
    • 定义: QJM是由一组日志节点(Journal node)组成的高可用共享日志管理器
    • 职责:
      • 存储 Active NN 的 edits 日志(替代原有的本地 edits 文件)
      • Standby NN 实时从 JN 读取 edits 日志,更新自身内存中的元数据,保证与 Active NN 的元数据一致
    • 特性
      • Active NN 修改元数据时,将 edits 日志写入 JN (为了避免“脑裂”,JN在任何时候只允许一个NameNode进行写入操作)
      • JN 至少需要 3(奇数) 个节点,保证自身高可用
      • 每一次编辑,必须写入多数 JN,这样即使丢失一个节点仍然可以使用
  • ZooKeeper(ZK):负责 HA 的 “故障检测” 和 “自动切换”:
  • DataNode: 会设置所有的NameNode的位置,并将数据块位置信息和心跳发送给所有的NameNode

ZKFC(ZK故障转移控制器)

  • 定义
    • 是Zookeeper的客户端,负责监控和管理NameNode的状态,每台NameNode都会运行一个ZKFC
  • 负责:
    • 健康检测:会向本地NameNode发送心跳,只要NameNode能及时回复健康状态,ZKFC就会认为该节点健康
    • Zookeeper会话管理:当本地的NameNode处于健康状态,ZKFC会在Zookeeper中保持会话打开的状态,如果本地节点为活跃节点,还会持有一个特殊的锁znode,用于活跃节点的支持,如果会话过期,锁节点自动删除
    • 基于Zookeeper选举:如果本地NameNode处于健康状态,并且发现没有其他节点持有znode,它将尝试自行获取锁,若成功获取,那么它将负责执行故障转移,并使本地的nameNode成为活跃节点

故障切换完整流程

  1. 假设一个场景:Active NameNode所在的机器突然宕机(断电)。
  2. 健康检测失败:该机器上的ZKFC进程因为机器宕机而终止,或者无法再ping通NameNode。
  3. 会话过期:由于ZKFC进程终止,它在ZooKeeper集群上持有的会话因无法续约而超时过期。
  4. 锁被释放:会话过期后,与该会话关联的ephemeral znode(代表Active锁)会被ZooKeeper集群自动删除。
  5. 通知与抢锁:另一个Standby NameNode的ZKFC一直在监控着这个锁。它收到ZK的通知,得知锁已被删除,意识到Active NN已下线。
  6. 新的Active诞生:Standby的ZKFC检查本地NameNode是健康的,于是它在ZK上成功创建新的ephemeral节点,抢锁成功。
  7. 状态切换:Standby NN正式转换为Active状态,并接管所有服务。它会首先从QJM中读取所有最新的编辑日志,确保元数据是最新的,然后开始响应客户端的请求。

HDFS HA 整体架构原理图

在这里插入图片描述

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐