Loading

Kafka Controller

Controller?

就是平时说的集群leader,和分区leader不是一个概念,这是在集群中的所有broker中选出一个唯一的leader,它用来控制整个集群的各种事宜,所以叫Controller

怎么控制

整个Kafka集群实际上是建立在Zookeeper上的,所以集群的控制实际上也就是各种Zookeeper节点的新增、删除、监听等操作。比如Controller会建立一堆Zookeeper监听器,监听其中的各种节点变化,然后执行对应的操作。

怎么选举

选举也是在Zookeeper中创建节点的过程,每一个broker在连接到zookeeper时都会尝试创建一个临时的/controller节点,只有最先创建成功的那个broker将自己的信息写入进了节点,这样,集群中所有broker就会认为它是Controller。

img

Controller的一些职责

更新集群元数据

METADATA保存topic的各种分区信息,集群中的任意一个broker都需要保存这个状态。

当METADATA发生变化,Controller会将变更后的信息封装进UpdateMetadataRequests中,向集群中的broker广播。

通过下图可以看到,/brokers/topics/<topic-name>节点下保存了节点的元数据信息。包括它有哪些分区,分区的主备关系等。

img

这样的话,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优雅关闭(受控关闭)
posted @ 2022-10-31 14:46  yudoge  阅读(63)  评论(0编辑  收藏  举报