(1) 在
kafka
集群中,会有多个
broker
节点,集群中第一个启动的
broker
会通过在 zookeeper 中创建临时节点 /controller 来让自己成为控制器,其他
broker
启动时也会在
zookeeper
中创建临时节点,但是发现节点已经存在,所以它们会收到一个异常,意识到控制器已经存在,那么就会在
zookeeper
中创建 watch 对象,便于它们收到控制器变更的通知。
(2) 如果集群中有一个
broker
发生异常退出了,那么控制器就会检查这个
broker
是否有分区的副本
leader
,如果有那么这个分区就需要一个新的
leader
,此时控制器就会去遍历其他副本,决定哪一个成为新的
leader
,同时更新分区的
ISR
集合。
(3) 如果有一个
broker
加入集群中,那么控制器就会通过
Broker ID
去判断新加入的
broker
中是否含有现有分区的副本,如果有,就会从分区副本中去同步数据。
(4) 集群中每选举一次控制器,就会通过 zookeeper 创建一个 controller epoch,每一个选举都会创建一个更大,包含最新信息的 epoch,如果有 broker 收到比这个 epoch 旧的数据,就会忽略它们,kafka 也通过这个 epoch 来防止集群产生“脑裂”。