乐闻世界logo
搜索文章和话题

Kafka 中 ZooKeeper 的作用是什么?

2月21日 16:54

Kafka ZooKeeper 的作用

ZooKeeper 在 Kafka 集群中扮演着关键角色,负责协调和管理集群的各种元数据和状态。虽然 Kafka 2.8+ 版本开始引入了 KRaft 模式(无 ZooKeeper),但 ZooKeeper 仍然是大多数 Kafka 集群的核心组件。

ZooKeeper 的核心作用

1. Broker 注册与发现

功能描述

  • 每个 Broker 启动时向 ZooKeeper 注册
  • ZooKeeper 维护 Broker 列表和状态
  • Producer 和 Consumer 通过 ZooKeeper 发现 Broker

实现机制

shell
ZooKeeper 节点结构: /brokers/ids/[broker_id] -> broker 信息

关键信息

  • Broker ID
  • Broker 地址和端口
  • Broker 状态(活跃/非活跃)
  • Broker 的 Rack 信息

2. Controller 选举

功能描述

  • Kafka 集群中选举一个 Broker 作为 Controller
  • Controller 负责管理分区状态和副本分配
  • ZooKeeper 协调 Controller 选举过程

选举过程

  1. 所有 Broker 竞争创建 /controller 临时节点
  2. 创建成功的 Broker 成为 Controller
  3. 其他 Broker 监听 /controller 节点
  4. 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 启动流程

  1. 连接 ZooKeeper

    • Broker 连接到 ZooKeeper 集群
    • 创建会话
  2. 注册 Broker

    • /brokers/ids/ 下创建临时节点
    • 注册 Broker 信息
  3. 参与 Controller 选举

    • 尝试创建 /controller 节点
    • 竞争成为 Controller
  4. 加载元数据

    • 从 ZooKeeper 读取 Topic 信息
    • 从 ZooKeeper 读取配置信息

Topic 创建流程

  1. 创建 Topic 节点

    • /brokers/topics/ 下创建 Topic 节点
    • 存储分区和副本信息
  2. 创建配置节点

    • /config/topics/ 下创建配置节点
    • 存储 Topic 配置
  3. 通知 Controller

    • Controller 监听 Topic 变化
    • Controller 执行分区分配

Consumer Group Rebalance 流程

  1. Consumer 加入 Group

    • Consumer 在 /consumers/[group_id]/ids/ 下创建临时节点
    • 注册 Consumer 信息
  2. 触发 Rebalance

    • Group Coordinator 检测到成员变化
    • 启动 Rebalance 过程
  3. 分配 Partition

    • Leader Consumer 制定分配方案
    • 更新 /consumers/[group_id]/owners/ 节点
  4. 提交 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 节点
  • 奇数个节点(避免脑裂)
  • 分布在不同的物理机

配置示例

properties
tickTime=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 集群,确保系统的稳定性和可靠性。

标签:Kafka