先来说一说kafka控制器的作用

kafka的控制器本身是一个broker,它有broker的功能,还负责kafka的分区首领的选举

上面先简单描述一下分区的概念,一个主题可能创建了多个分区,每个分区针对不通的消费组都是独立的,有序的,每个分区可能有多个副本,加入5个broker,分区的复制系数为3(复制系数这些配置可以参考kafka的配置,官方的文档描述的还是挺全的),那么有三台broker会有一个分区的副本,每个分区多个副本中会有一个副本分区的副本首领

选举过程

kafka的控制器选举很简单,kafka的每一个broker都有一个ID唯一标识符,在集群启动的时候会把id注册到zookeeper的/broker/ids/节点下作为临时子节点,节点的增加和删除其他子节点都会得到通知,第一个启动的broker会在zookeeper里创建一个临时节点/controll让自己成为控制器,其他后续节点启动的也会创建,当发现已经存在这个临时节点了那么会抛出异常,会意识到此时节点已经存在,那么后续的broker会在这个控制器节点创建watch事件,用来监听控制器状态,如果控制器的broker挂掉了,其他节点有机会成为控制器

选举分区的首领,当分区首领脑裂时

当控制器发现一个broker断开时候,通过观察zookeeper的相关路径得知,如果这个离开的broker里面有部分分区的首领,那么控制器会从不同的分区副本中选举下一个副本为分区首领,然后向所有分区跟随者发送包含谁是分区首领副本谁是分区副本的请求,随后,新的首领副本就能处理新的生产者请求

当新的broker加入时

当控制器发现一个新的broker加入集群的时候,控制器会检查新加入的broker是否包含现有分区的副本,如果包含,控制器就会把变更通知发送给新加入的broker和其他broker,新的broker开始从首领副本复制消息

kafka就是通过zookeeper的节点和watch对象特性来实现控制器选举,控制器来保证集群中分区的可用性,监控脑裂的首领副本和监控新加入的分区副本