美文网首页
09、Kafka的心脏 - Controller

09、Kafka的心脏 - Controller

作者: 技术灭霸 | 来源:发表于2020-07-20 11:09 被阅读0次

提起 Kafka 中的 Controller 组件,从某种意义上说,它是 Kafka 最核心的组件。一方面,它要为集群中的所有主题分区选举领导者副本;另一方面,它还承载着集群的全部元数据信息,并负责将这些元数据信息同步到其他 Broker 上。

在Kafka集群中会有一个或者多个broker,其中有一个broker会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。当某个分区的leader副本出现故障时,由控制器负责为该分区选举新的leader副本。当检测到某个分区的ISR集合发生变化时,由控制器负责通知所有broker更新其元数据信息。当使用kafka-topics.sh脚本为某个topic增加分区数量时,同样还是由控制器负责分区的重新分配。

Kafka中的控制器选举的工作依赖于Zookeeper,成功竞选为控制器的broker会在Zookeeper中创建/controller这个临时(EPHEMERAL)节点
,此临时节点的内容参考如下:

{"version":1,"brokerid":0,"timestamp":"1529210278988"}

其中version在目前版本中固定为1,brokerid表示称为控制器的broker的id编号,timestamp表示竞选称为控制器时的时间戳。

在任意时刻,集群中有且仅有一个控制器。每个broker启动的时候会去尝试去读取/controller节点的brokerid的值,如果读取到brokerid的值不为-1,则表示已经有其它broker节点成功竞选为控制器,所以当前broker就会放弃竞选;如果Zookeeper中不存在/controller这个节点,或者这个节点中的数据异常,那么就会尝试去创建/controller这个节点,当前broker去创建节点的时候,也有可能其他broker同时去尝试创建这个节点,只有创建成功的那个broker才会成为控制器,而创建失败的broker则表示竞选失败。每个broker都会在内存中保存当前控制器的brokerid值,这个值可以标识为activeControllerId。

集群元数据

想要完整地了解 Controller 的工作原理,我们首先就要学习它管理了哪些数据。毕竟,Controller 的很多代码仅仅是做数据的管理操作而已。

事实上,集群 Broker 是不会与 ZooKeeper 直接交互去获取元数据的。相反地,它们总是 与 Controller 进行通信,获取和更新最新的集群数据。

相关文章

网友评论

      本文标题:09、Kafka的心脏 - Controller

      本文链接:https://www.haomeiwen.com/subject/actbcktx.html