Zookeeper 在 Apache Kafka 集群的协调和元数据管理中扮演着关键角色。在基于 Kafka 的数据流中,Zookeeper 作为中心化服务,跟踪 broker、topic、partition 和其他系统组件的状态。它确保集群中的所有节点在配置细节上达成一致并保持一致性,这对于可靠的分布式系统至关重要。没有 Zookeeper,Kafka 将缺乏处理 partition leader 选举或检测 broker 加入或离开集群等任务的机制。虽然较新的 Kafka 版本正朝着无 Zookeeper 架构(KRaft 模式)发展,但大多数现有部署仍依赖它进行核心集群管理。
Zookeeper 的主要职责之一是 broker 管理和 controller 选举。当一个 Kafka broker 启动时,它会向 Zookeeper 注册自己,Zookeeper 通过临时节点(如果 broker 断开连接就会消失的临时条目)跟踪 broker 的健康状况。Zookeeper 还会选举一个 controller,这是一个指定的 broker,负责管理任务,例如将 partition 分配给 broker,并在发生故障时触发 leader 选举。例如,如果托管 partition leader 的 broker 离线,Zookeeper 会检测到断开连接并提醒 controller,controller 随后会将其他 broker 上的副本提升为 leader。此外,Zookeeper 存储元数据,例如 topic 配置(例如副本因子)和 partition 分配,确保所有 broker 都对集群结构有一致的视图。
在较旧的 Kafka 版本中,Zookeeper 还处理访问控制列表 (ACL) 和 offsets。在 Kafka 0.9 之前,消费者组将其 offsets(跟踪消息进度)直接存储在 Zookeeper 中。虽然较新版本使用内部 Kafka topic 存储 offsets,但旧系统可能仍依赖 Zookeeper。启用安全的集群中,用于定义 topic 和操作权限的 ACL 也通过 Zookeeper 进行管理。例如,如果管理员创建了一个限制访问的 topic,Zookeeper 会存储相关的 ACL,以便 broker 可以强制执行这些权限。尽管 Kafka 的发展正在减少对 Zookeeper 的依赖,但其在现有设置中的作用仍然是基础性的,提供了保持分布式流系统稳定和一致的协调层。