Kafka ZooKeeper 的作用
ZooKeeper 在 Kafka 集群中扮演着关键角色,负责协调和管理集群的各种元数据和状态。虽然 Kafka 2.8+ 版本开始引入了 KRaft 模式(无 ZooKeeper),但 ZooKeeper 仍然是大多数 Kafka 集群的核心组件。
ZooKeeper 的核心作用
1. Broker 注册与发现
功能描述:
- 每个 Broker 启动时向 ZooKeeper 注册
- ZooKeeper 维护 Broker 列表和状态
- Producer 和 Consumer 通过 ZooKeeper 发现 Broker
实现机制:
shellZooKeeper 节点结构: /brokers/ids/[broker_id] -> broker 信息
关键信息:
- Broker ID
- Broker 地址和端口
- Broker 状态(活跃/非活跃)
- Broker 的 Rack 信息
2. Controller 选举
功能描述:
- Kafka 集群中选举一个 Broker 作为 Controller
- Controller 负责管理分区状态和副本分配
- ZooKeeper 协调 Controller 选举过程
选举过程:
- 所有 Broker 竞争创建
/controller临时节点 - 创建成功的 Broker 成为 Controller
- 其他 Broker 监听
/controller节点 - Controller 故障时,重新选举
Controller 职责:
- 管理 Partition Leader 选举
- 管理 Partition 副本分配
- 管理 Topic 创建和删除
- 管理集群元数据变更
3. Topic 元数据管理
功能描述:
- 存储 Topic 的分区信息
- 存储 Topic 的副本分配信息
- 存储 Topic 的配置信息
ZooKeeper 节点结构:
shell/brokers/topics/[topic_name] -> 分区信息 /config/topics/[topic_name] -> Topic 配置 /admin/delete_topics/[topic_name] -> 待删除 Topic
存储内容:
- Topic 的 Partition 数量
- 每个 Partition 的副本分布
- Topic 的覆盖配置(如 retention.ms)
4. Consumer Group 管理
功能描述:
- 管理 Consumer Group 的成员信息
- 管理 Consumer Group 的 Offset 提交
- 协调 Consumer Group Rebalance
ZooKeeper 节点结构:
shell/consumers/[group_id]/ids/[consumer_id] -> Consumer 信息 /consumers/[group_id]/offsets/[topic]/[partition] -> Offset /consumers/[group_id]/owners/[topic]/[partition] -> Partition 所有者
管理内容:
- Consumer Group 成员列表
- 每个 Consumer 订阅的 Topic
- 每个 Partition 的 Offset
- Partition 与 Consumer 的分配关系
5. ACL 权限管理
功能描述:
- 存储 Kafka 的访问控制列表
- 管理用户和权限信息
ZooKeeper 节点结构:
shell/kafka-acl/Topic/[topic_name] -> Topic 权限 /kafka-acl/Cluster/kafka-cluster -> 集群权限 /kafka-acl/Group/[group_id] -> Consumer Group 权限
6. 配置管理
功能描述:
- 存储集群级别的配置
- 存储 Topic 级别的配置
- 存储 Client 级别的配置
ZooKeeper 节点结构:
shell/config/brokers/[broker_id] -> Broker 配置 /config/topics/[topic_name] -> Topic 配置 /config/clients/[client_id] -> Client 配置
ZooKeeper 与 Kafka 的交互
Broker 启动流程
-
连接 ZooKeeper
- Broker 连接到 ZooKeeper 集群
- 创建会话
-
注册 Broker
- 在
/brokers/ids/下创建临时节点 - 注册 Broker 信息
- 在
-
参与 Controller 选举
- 尝试创建
/controller节点 - 竞争成为 Controller
- 尝试创建
-
加载元数据
- 从 ZooKeeper 读取 Topic 信息
- 从 ZooKeeper 读取配置信息
Topic 创建流程
-
创建 Topic 节点
- 在
/brokers/topics/下创建 Topic 节点 - 存储分区和副本信息
- 在
-
创建配置节点
- 在
/config/topics/下创建配置节点 - 存储 Topic 配置
- 在
-
通知 Controller
- Controller 监听 Topic 变化
- Controller 执行分区分配
Consumer Group Rebalance 流程
-
Consumer 加入 Group
- Consumer 在
/consumers/[group_id]/ids/下创建临时节点 - 注册 Consumer 信息
- Consumer 在
-
触发 Rebalance
- Group Coordinator 检测到成员变化
- 启动 Rebalance 过程
-
分配 Partition
- Leader Consumer 制定分配方案
- 更新
/consumers/[group_id]/owners/节点
-
提交 Offset
- Consumer 提交 Offset 到 ZooKeeper
- 更新
/consumers/[group_id]/offsets/节点
ZooKeeper 配置
Kafka 配置
properties# ZooKeeper 连接地址 zookeeper.connect=localhost:2181 # ZooKeeper 连接超时时间 zookeeper.connection.timeout.ms=6000 # ZooKeeper 会话超时时间 zookeeper.session.timeout.ms=6000 # ZooKeeper 同步时间 zookeeper.sync.time.ms=2000
ZooKeeper 配置
properties# 客户端连接数限制 maxClientCnxns=60 # 数据目录 dataDir=/var/lib/zookeeper # Tick 时间 tickTime=2000 # 初始同步超时 initLimit=10 # 同步超时 syncLimit=5 # 客户端端口 clientPort=2181
ZooKeeper 高可用
ZooKeeper 集群部署
部署架构:
- 至少 3 个 ZooKeeper 节点
- 奇数个节点(避免脑裂)
- 分布在不同的物理机
配置示例:
propertiestickTime=2000 dataDir=/var/lib/zookeeper clientPort=2181 initLimit=5 syncLimit=2 server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
故障恢复
ZooKeeper 故障:
- 多数节点存活,集群继续服务
- 少数节点故障,自动恢复
Kafka 故障:
- Broker 故障,ZooKeeper 检测并触发 Controller 选举
- Controller 故障,重新选举新 Controller
KRaft 模式(无 ZooKeeper)
KRaft 模式介绍
Kafka 2.8+ 引入了 KRaft 模式,移除了对 ZooKeeper 的依赖。
优势:
- 简化部署和运维
- 减少组件依赖
- 提高性能
- 更好的扩展性
架构变化:
- 使用内部元数据存储替代 ZooKeeper
- Controller 集群管理元数据
- Broker 直接与 Controller 通信
KRaft 模式配置
properties# 启用 KRaft 模式 process.roles=broker,controller # Controller 列表 controller.quorum.voters=1@localhost:9093,2@localhost:9094,3@localhost:9095 # 监听地址 listeners=PLAINTEXT://:9092,CONTROLLER://:9093 # 元数据目录 metadata.log.dir=/var/lib/kafka/metadata
最佳实践
1. ZooKeeper 集群规划
- 至少 3 个节点
- 分布在不同机架
- 使用独立磁盘
2. 监控 ZooKeeper
- 监控 ZooKeeper 延迟
- 监控 ZooKeeper 连接数
- 监控 ZooKeeper 节点状态
3. 优化 ZooKeeper 性能
- 调整 JVM 参数
- 优化网络配置
- 使用 SSD 存储
4. 备份 ZooKeeper 数据
- 定期备份 ZooKeeper 数据目录
- 建立灾难恢复方案
- 测试备份恢复流程
通过理解 ZooKeeper 在 Kafka 中的作用,可以更好地设计、部署和运维 Kafka 集群,确保系统的稳定性和可靠性。