概述

Kafka集群中有一个broker会被选举为Controller,负责管理集群broker的上下线,所有topic的分区副本分配和leader选举等工作。
Controller的管理工作都是依赖于Zookeeper的。

Controller选举就是isr容器里面哪个broker先抢到Zookeeper里面的controller临时节点谁就是controller.完全靠运气的,

image.png

broker在启动的时候都会在zookeeper的/brokers/ids 里面注册自己的信息(用临时节点的方式)告诉zookeeper我是谁,我可以开始工作了.
此时有一个broker就会被选成controller, controller会监听/brokers/ids下的子节点, 如果/brokers/ids多一个临时节点就代表broker集群里面又多了一台broker加入了我们的集群.

每当我们新建了一个topic, 三个分区三个副本., 此时controller就开始分配topic下每个分区给哪个broker.

每个partitin又会在zookeeper的 /brokers/topics/first/partitions/0/state 注册信息 ,leader是谁, isr又是哪些. 这信息是controller机器来负责写这个节点的.

假设broker0宕机了, controller 就监听到了/brokers/ids/少了一个临时节点,从/brokers/topics/first/partitions/0/state也能知道leader是哪台机器, 如果leader挂机了, 就获取isr容器里面,从里面选一个新的broker leader,
然后controller 就会给这个/brokers/topics/first/partitions/0/state 节点又更新节点的值,比如说给leader值更新一下,isr队列值更新一下.

https://www.yuque.com/docs/share/07a6942b-92bd-4838-84a4-1dccc5201162?# 《Zookeeper在Kafka中的作用》