订阅更新

ZooKeeper挂了半个集群不工作了——ZK在Hadoop中的角色

Hadoop手册 第 18 题 约 8 分钟读完

本文目录
  1. 先说结论
  2. ZK在Hadoop各组件中的角色
  3. ZK的基本原理——ZAB协议
  4. ZK在HDFS HA中的具体工作方式
  5. ZK的运维要点
  6. 实战经验:ZK Session超时导致的HDFS HA切换风暴
  7. KRaft——Kafka不再需要ZK
  8. 面试高频追问
  9. 总结

先说结论

ZooKeeper是分布式协调服务,在Hadoop生态中负责三件事:① 选举(NameNode Active/Standby选举、YARN RM选举);② 配置管理(存储和分发配置信息);③ 分布式锁(保证同一时间只有一个进程做某件事)。ZK自身是一个3或5节点的小集群,基于ZAB协议保证数据一致性。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

ZooKeeper是Hadoop生态的'隐形管家'——平时感知不到它的存在,但它一挂,HDFS的高可用、YARN的高可用、HBase的全部服务都会受影响。在某元宇宙社交公司搭建Kafka+Flink+Doris平台时,Kafka也依赖ZooKeeper做Broker管理和Leader选举。ZK虽然不直接处理数据,但它是整个分布式系统协调的核心。面试官问ZK,考的是你对分布式协调服务的理解。

ZK在Hadoop各组件中的角色

组件ZK的作用ZK挂了的影响
HDFS HANameNode Active/Standby选举无法故障切换(当前Active挂了就完了)
YARN HAResourceManager选举无法故障切换
HBaseRegionServer管理、Master选举、元数据存储HBase完全不可用
Kafka(老版本)Broker注册、Topic元数据、Consumer OffsetKafka不可用
Kafka(KRaft)不再依赖ZKKafka独立运行
Hive Metastore HAMetastore选举无法故障切换

关键认知:ZK挂了不会导致正在运行的服务立即停止——HDFS的Active NameNode还在工作、YARN的Active RM还在工作。但如果Active挂了,就没有ZK来做故障切换了,整个服务就真的瘫痪了。所以ZK是'平时没事,出事就是大事'。

ZK的基本原理——ZAB协议

# ZooKeeper集群架构
#
# ZK集群通常3或5个节点
# 基于ZAB(ZooKeeper Atomic Broadcast)协议
#
#  ┌────┐  ┌────┐  ┌────┐
#  │ ZK │  │ ZK │  │ ZK │
#  │Lead│  │Fol │  │Fol │
#  └────┘  └────┘  └────┘
#
# Leader:处理所有写请求
# Follower:处理读请求,参与投票
#
# 写入流程(类似两阶段提交):
# 1. 客户端发写请求给Leader
# 2. Leader把请求广播给所有Follower
# 3. 超过半数(Quorum)确认后,Leader提交
# 4. 返回客户端成功
#
# 为什么要奇数个节点?
# Quorum = N/2 + 1
# 3节点:可以容忍1个挂  (Quorum=2)
# 5节点:可以容忍2个挂  (Quorum=3)
# 4节点:也只能容忍1个挂(Quorum=3),和3节点一样
# 所以4节点没有比3节点更高可用,白浪费一台

ZK在HDFS HA中的具体工作方式

# HDFS NameNode HA依赖ZK做故障切换
#
# 1. 每个NameNode上运行一个ZKFC(ZK Failover Controller)
# 2. ZKFC定期检查本机NN的健康状态
# 3. Active NN的ZKFC在ZK上持有一个临时节点(Ephemeral Node)
# 4. 如果Active NN挂了:
#    a. ZKFC检测到NN无响应
#    b. ZK上的临时节点自动删除(Session过期)
#    c. Standby NN的ZKFC监测到节点消失
#    d. Standby ZKFC在ZK上创建新的临时节点(抢锁)
#    e. 抢到锁的Standby NN变为Active
#    f. 先Fencing旧Active(确保它真的死了)
#    g. 开始处理请求
#
# ZK的临时节点(Ephemeral Node)是关键机制:
# 创建者的Session断开后节点自动删除
# 其他人通过Watch机制监听节点变化
# 这就是分布式锁/选举的底层原理

ZK的运维要点

运维项建议原因
节点数3或5个(生产环境至少3个)奇数个节点,容忍少数故障
部署方式独立机器,不和NN/DN混部ZK对延迟敏感,混部容易被影响
磁盘SSD或高速盘ZK的事务日志是顺序写,磁盘慢影响全局
监控监控4字命令(ruok/mntr/stat)ZK故障要第一时间发现
GC调优堆内存1-2GB够了,不要给太多避免长时间GC导致Session超时
# ZK常用运维命令(4字命令)
 
# 检查ZK是否存活
echo ruok | nc zk-host 2181
# 返回 imok 表示正常
 
# 查看ZK统计信息
echo mntr | nc zk-host 2181
# 返回:延迟、连接数、Watch数等
 
# 查看ZK状态(Leader/Follower)
echo stat | nc zk-host 2181
 
# 查看ZK配置
echo conf | nc zk-host 2181

实战经验:ZK Session超时导致的HDFS HA切换风暴

在某短视频平台(早期阶段),ZK和DataNode部署在同一批机器上。有一次DataNode的磁盘IO飙升(大量Spark作业同时写数据),导致ZK的事务日志写入变慢,ZK的响应延迟从毫秒级涨到秒级。

结果:NameNode的ZKFC和ZK之间的Session超时了,ZK认为Active NN挂了,触发了故障切换——把Standby提升为Active。但原来的Active NN其实是好的!两个NN同时认为自己是Active(短暂的脑裂),虽然Fencing机制最终解决了问题,但整个过程导致了约2分钟的HDFS服务抖动,十几个Spark作业报错。

教训:① ZK必须部署在独立的机器上,不能和IO密集的DataNode混部;② ZK的事务日志必须用高速磁盘(SSD最好);③ tickTime和Session超时时间要根据网络和磁盘延迟合理设置——太短容易误触发切换,太长会导致真正故障时切换太慢。

KRaft——Kafka不再需要ZK

Kafka从2.8版本开始支持KRaft模式——用内置的Raft协议替代ZooKeeper做元数据管理和Broker选举。这是分布式系统的一个趋势:从依赖外部协调服务(ZK)到内置协调协议(Raft)。

影响:Kafka的KRaft减少了一个外部依赖组件,运维更简单。但HDFS HA和YARN HA目前还必须依赖ZK。Hadoop社区也在探索用内置Raft替代ZK的方案,但还没有成熟实现。

面试高频追问

追问一:ZK的Watch机制是什么?

客户端可以在ZK的节点上注册Watch,当节点数据变化或节点被删除时,ZK会通知注册了Watch的客户端。HDFS HA就是通过Watch临时节点来检测Active NN是否存活的。Watch是一次性的——触发后需要重新注册。

追问二:ZK自己挂了怎么恢复?

如果是少数节点挂了(3个中挂1个),剩余节点自动继续服务(Quorum机制)。如果是多数节点挂了(3个中挂2个),ZK停止服务。恢复方法:重启挂掉的节点,它们会自动从Leader同步数据恢复。ZK的数据存在事务日志和快照文件里,不会丢失。

追问三:为什么不直接用MySQL代替ZK?

ZK的核心能力是'低延迟的分布式一致性'——写入确认在毫秒级。MySQL虽然也能做分布式锁,但延迟高得多(几十到几百毫秒),而且不支持Watch/临时节点等ZK特有的原语。NameNode的故障切换需要毫秒级响应,MySQL做不到。

总结

ZooKeeper面试讲三个层面:① ZK在Hadoop各组件中的角色(HDFS/YARN HA选举、HBase管理、Kafka元数据);② ZK的基本原理(ZAB协议、Quorum投票、临时节点+Watch);③ 运维要点(独立部署、SSD磁盘、监控4字命令)。ZK是'平时透明、出事致命'的组件——能讲出ZK Session超时导致HA切换风暴的踩坑经历,面试官会觉得你对分布式系统的可靠性有深刻理解。

下一篇聊一个宏观话题:2025年了还要学Hadoop吗?Hadoop生态的现状、替代方案和面试策略。

你们的ZK集群部署在哪里?有没有遇到过ZK相关的故障?评论区聊聊~

关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长

刷题进度保存在当前浏览器