P98 Kafka 中 zk 的作用
面试题:Kafka 为什么要用 ZooKeeper?ZK 在 Kafka 里负责什么?现在还要用吗?
1. ZK 在 Kafka 里的作用
① 集群元数据管理
- Broker 注册:每个 Broker 启动时在 ZK 创建临时节点,记录地址、ID、状态;
- Topic/Partition 元数据:记录 Topic 列表、分区分配、副本分配;
- 客户端/控制器可以从 ZK 读取集群拓扑。
② 控制器(Controller)选举
- 多个 Broker 里选举一个 Controller,负责:
- 分区 Leader 选举;
- 分区/副本的分配与迁移;
- 元数据变更广播。
- ZK 用临时节点 + Watch 保证同一时刻只有一个 Controller(强一致选举)。
③ 分区 Leader 选举与故障转移
- Leader 挂了,Controller 通过 ZK 感知(临时节点消失的 Watch 通知)→ 从 ISR 中选新 Leader;
- 副本状态、ISR 变化记录。
④ 消费者组管理(旧版本)
- 老版本(0.9 前)消费组 offset、组成员、再均衡由 ZK 管;
- 0.9+ 把 offset 和消费组管理移到 Kafka 内部 Topic(__consumer_offsets),ZK 不再直接管消费者。
2. ZK 的缺陷 → KRaft 替代
依赖 ZK 的问题:
- 部署两套系统(Kafka + ZK),运维复杂;
- 元数据写入要过 ZK,集群规模大时是瓶颈;
- 分区数上万时 ZK 压力大;
- 控制器故障恢复依赖 ZK 交互,耗时。
KRaft(Kafka Raft,2.8+ 预览,3.x/4.x 成熟):
- 用 Kafka 内置的 Raft 协议管元数据,去掉 ZK;
- 控制器组(Controller Quorum)自己选举;
- 部署更简单、扩展性更好;
- 新版 Kafka(如 4.x)已默认/完全移除 ZK 模式。
3. 加分点
- 面试重点:说出 ZK 的三大职责(Broker 注册、Controller 选举、分区 Leader 选举);
- 追问"现在还用吗":旧版本依赖 ZK,新版本用 KRaft 替代 ZK,纯 Kafka 单系统;
- 追问"ZK 和 Controller 关系":ZK 存元数据 + 选举 Controller,Controller 负责具体调度;
- 提到临时节点 + Watch 机制(Kafka 利用 ZK 的通知能力感知 Broker 上下线)。
一句话总结
ZK 在 Kafka 中负责 Broker 注册与集群元数据、Controller 选举、分区 Leader 选举与故障转移(旧版还管消费组);因为双系统运维复杂、规模瓶颈,新版用内置 KRaft(Raft) 替代 ZK,实现单系统部署。