控制器
Kafka集群包含若干个broker,broker.id指定broker的编号,编号不要重复。
Kafka集群上创建的主题,包含若干个分区。
每个分区包含若干个副本,副本因子包括了Follower副本和Leader副本。
副本又分为ISR(同步副本分区)和OSR(非同步副本分区)。
控制器就是一个broker。
控制器除了一般broker的功能,还负责Leader分区的选举。
broker选举
集群里第一个启动的broker在Zookeeper中创建临时节点 /controller 。
其他broker在该控制器节点创建Zookeeper watch对象,使用Zookeeper的监听机制接收该节点的变更。
即:Kafka通过Zookeeper的分布式锁特性选举集群控制器。
下图中,节点 /myKafka/controller 是一个zookeeper临时节点,其中 “brokerid”:0 ,表示当前控制器是broker.id为0的broker。
每个新选出的控制器通过 Zookeeper 的条件递增操作获得一个全新的、数值更大的 controller epoch。其他 broker 在知道当前 controller epoch 后,如果收到由控制器发出的包含较旧epoch 的消息,就会忽略它们,以防止**“脑裂”**。
比如当一个Leader副本分区所在的broker宕机,需要选举新的Leader副本分区,有可能两个具有不同纪元数字的控制器都选举了新的Leader副本分区,如果选举出来的Leader副本分区不一样,听谁的?
脑裂了。有了纪元数字,直接使用纪元数字最新的控制器结果。
当控制器发现一个 broker 已经离开集群,那些失去Leader副本分区的Follower分区需要一个新Leader&#x