Kafka Controller
Controller?
就是平时说的集群leader,和分区leader不是一个概念,这是在集群中的所有broker中选出一个唯一的leader,它用来控制整个集群的各种事宜,所以叫Controller
。
怎么控制
整个Kafka集群实际上是建立在Zookeeper上的,所以集群的控制实际上也就是各种Zookeeper节点的新增、删除、监听等操作。比如Controller会建立一堆Zookeeper监听器,监听其中的各种节点变化,然后执行对应的操作。
怎么选举
选举也是在Zookeeper中创建节点的过程,每一个broker在连接到zookeeper时都会尝试创建一个临时的/controller
节点,只有最先创建成功的那个broker将自己的信息写入进了节点,这样,集群中所有broker就会认为它是Controller。
Controller的一些职责
更新集群元数据
METADATA保存topic的各种分区信息,集群中的任意一个broker都需要保存这个状态。
当METADATA发生变化,Controller会将变更后的信息封装进UpdateMetadataRequests
中,向集群中的broker广播。
通过下图可以看到,/brokers/topics/<topic-name>
节点下保存了节点的元数据信息。包括它有哪些分区,分区的主备关系等。
这样的话,Controller就可以通过监听这个Zookeeper节点,在它发生变化时执行自己的逻辑了。
创建topic
无论通过何种方式创建topic,都只是在/brokers/topics
中创建一个节点,Controller发现新增节点后就可以完成创建topic的逻辑,创建topic的每个分区,确定分区leader和ISR,更新集群的元数据信息,注册新topic节点的监听器。
删除topic
通过/admin/delete_topics
维护
分区重分配
/admin/reassign_partitions
节点下按照指定格式写入,一般是管理员进行手动重分配时使用。
broker优雅(受控)关闭
当一个broker想退出时,它直接断开与zookeeper的连接即可,但这样Controller没法在它退出之前做一些收尾工作,比如在它退出之前完成分区leader重选举和ISR调整。
优雅关闭时,broker向controller发送一个ControlledShutdownRequest
,然后阻塞,controller做完必要的处理后会返回ControlledShutdownResponse
,broker现在可以正常关闭。
broker优雅关闭不借助Zookeeper,只需要controller和broker之间的RPC调用
controller leader选举
前面说了,最先创建/controller
节点的broker作为controller,它对Zookeeper中的各种节点进行监听,并执行对应操作。那如果它崩了咋整?
其它没选成的节点依然监听/controller
节点,并随时准备重新竞选。
其它职责
- 分区preferred leader选举
- topic分区数量扩展
- broker加入集群(
/broker/ids
中维护) - broker崩溃(临时节点消失)
- broker优雅关闭(受控关闭)