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

更多推荐



所有评论(0)