ZooKeeper挂了半个集群不工作了——ZK在Hadoop中的角色
本文目录
先说结论
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 HA | NameNode Active/Standby选举 | 无法故障切换(当前Active挂了就完了) |
| YARN HA | ResourceManager选举 | 无法故障切换 |
| HBase | RegionServer管理、Master选举、元数据存储 | HBase完全不可用 |
| Kafka(老版本) | Broker注册、Topic元数据、Consumer Offset | Kafka不可用 |
| Kafka(KRaft) | 不再依赖ZK | Kafka独立运行 |
| Hive Metastore HA | Metastore选举 | 无法故障切换 |
关键认知: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年大数据老兵,聊技术、聊职场、聊成长