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个步骤:
- 持久化 Topic 的多副本分区信息
- 为每个分区挑选一个副本 Leader
- 将上述信息发送给对应的 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 | 永久 |