Kafka控制器相关
在 Kafka 集群中会有一个或多个 broker,其中有一个 broker 会被选举为控制器( Kafka Controller ),它负责管理整个集群中所有分区和副本的状态。当某个分区的 leader 副本出现故障时,由控制器负责为该分区选举新的 leader 副本。当检测到某个分区的 ISR 集合发生变化时,由控制器负责通知所有 broker 更新其元数据信息。当使用 kafka - topics.sh 脚本为某个topic增加分区数量时,同样还是由控制器负责分区的重新分配。
Kafka 中的控制器选举工作依赖于 ZooKeeper ,成功竞选为控制器的 broker 会在 ZooKeeper中创建/ controller 这个临时( EPHEMERAL )节点,此临时节点的内容参考如下 :
{ ”version”:1 ,”brokerid ”: 0, ”times tamp”·”1529210278988” }
ZooKeeper 中 还有一个与控制器有关的/ controller_epoch 节点,这个节点是持久(PERSISTENT)节点,节点中存放的是一个整型的 controller epoch 值。 controller
epoch 用于记录控制器发生变更的次数,即记录当前的控制器是第几代控制器,我们也可以称之为“控制器的纪元”。
控制器的责任
具备控制器身份的 broker 需要 比其他普通的 broker 多一份职责 , 具体细节如下:
1 监听分区相关的变化。为 ZooKeeper 中的 /admin/ reassign partitions 节点注册 PartitionReassignmentHandler ,用来处理分区重分配的动作。为 ZooKeeper 中的
/Isr_change_notification 节点注册 IsrChangeNotificetionHandler,用来处理 ISR集合变更的动作。为 ZooKeeper 中的 /admin/preferred-replica-election 节
点添加 PreferredReplicaElectionHandler,用来处理优先副本的选举动作。
2 监听主题相关的变化。为 ZooKeeper 中的/brokers/topics 节点添加 TopicChangeHandler,用来处理主题增减的变化:为 ZooKeeper中的 /admin /
delete_topics 节点添加 TopicDeletionHandler,用来处理删除主题的动作。
3 监听 broker相关的变化。为 ZooKeeper 中的/brokers/ids 节点添加 BrokerChangeHandler,
用来处理 broker 增减的变化 。
4 从ZooKeeper 中读取获取当前所有与主题、分区及 broker 有关的信息并进行相应的管
理。 对所有主题对应的ZooKeeper中的 /brokers/topics/<topic> 节点添加PartitionModificationsHandler,用来监听主题中的分区分配变化。
启动并管理分区状态机和副本状态机 。
更新集群的元数据信息 。
如果参数 auto.leader.rebalance. enable 设置为 true,则还会开启一个名为"auto-leader-rebalance-task" 的定时任务来负责维护分区的优先副本的均衡。