The actual role of Zookeeper in Kafka - tenji/ks GitHub Wiki

Kafka 与 Zookeeper 那些事

一、哪些问题利用Zookeeper来解决

1.1 选举 Controller

Kafka 是高可用的分布式消息系统,首先要解决的就是资源协调分配多副本状态维护的问题。

解决这些问题通常就是两种思路,一是依靠 Zookeeper 来协调,二是设定一个中心节点,让这个中心节点来协调。如果依靠 Zookeeper 来协调,会存在大量的竞争条件,对 Zookeeper 的访问压力增大,而且如果 Zookeeper 出现了问题(比如网络抖动),系统很容易出现紊乱。Kafka 采用的是第二种思路,即选举一个中心节点来进行资源协调与多副本状态维护,这个中心节点被称作 Controller(一个特殊的Broker),这个选举过程依靠 Zookeeper 来完成。

Broker 启动时,会竞争创建临时/controller。如果创建成功,则成为 Controller,并把 Broker 的id等信息写入这个节点。同时会全程监控/controller的数据变化,如果旧的 Controller 挂掉,则开启新一轮的竞争过程。

1.2 注册 Broker

Kafka 要进行资源协调,第一件需要知道的事情就是各个 Broker 的存活状态,这个问题利用 Zookeeper 可以很容易做到。

假设某个 Broker,id为0,它启动时,会创建/brokers/ids/0临时节点,并把端口等信息写进去。Controller 会监控/brokers/ids的节点变化,以实时感知各broker的状态,进行资源协调。

1.3 协调 Topic 的创建、调整与销毁

在 Kafka 这个多副本分区的消息系统里,创建一个 Topic,至少需要以下3个步骤:

  1. 持久化 Topic 的多副本分区信息
  2. 为每个分区挑选一个副本 Leader
  3. 将上述信息发送给对应的 Broker,以完成实际的日志文件创建过程

Controller 的存在,可以很容易完成上面的 b 和 c 步骤,但 a 步骤不行,如果 Controller 挂掉,则这些信息会不可用。Kafka 把这些信息保存在 Zookeeper 中,依靠其高可用特性来保证这些信息的高可用。

二、Topic 创建删除完整流程

2.1 Topic 创建流程

2.2 Topic 删除流程

三、如果 Zookeeper 挂了会怎样

每个 Broker 有一个metaDataCache,缓存有 Topic 和 Partition 的基本信息,可以正常的生产和消费信息,但不能进行 Topic 的创建、调整和删除等操作。

此外,Broker 会不断重试连接。

四、如果删掉了 Zookeeper 的节点会怎样

五、Zookeeper 用量估计

六、Zookeeper 路径的创建与监听表

路径 创建者 监听者 类型
/controller 各个broker竞争创建 所有broker全程监控data change 临时
/controller_epoch controller 永久
/brokers/ids broker启动时检查并确保存在 controller全程监控child change 永久
/brokers/ids/{id} id对应的broker 临时
/brokers/topics broker启动时检查确保存在 controller全程监控child change 永久
/brokers/topics/{topic} controller收到创建请求,或broker启用自动创建topic,或admin工具 controller全程监控child change 永久
/brokers/topics/{topic}/{partition}/state partiton的leader partition reassign时,controller临时监控data change 永久
/config/changes broker启动时检查并确保存在 所有broker全程监控child change 永久
/config/topics broker启动时检查并确保存在 永久
/config/clients broker启动时检查并确保存在 永久
/brokers/seqid broker启动时检查并确保存在 待确认 永久
/admin/delete_topics broker启动时检查并确保存在 controller全程监控child change 永久
/isr_change_notification broker启动时检查并确保存在 controller全程监控child change 永久
/admin/reassign_partitions admin 工具 controller全程监控child change 永久
/admin/preferred_replica_election admin 工具 controller全程监控child change 永久

参考链接