Kafka副本Leader选举原理
Kafka早期的版本就是直接用Zookeeper来完成选举的,它利用了Zookeeper的Watch机制:1节点不允许重复写入。2临时节点。这样实现起来比较简单省事,但是会存在一定的弊端。比如说分区和副本数量过多的时候所有的副本都要直接参与选举的话,一旦某个节点出现增减就会造成大量的Watch事件被触发,Zookeeper就会负载过重,从而不堪重负。
所以在新版本的Kafka中就换了一种实现方式,它不是所有的副本都要参与Leader选举的,而是由其中一个Broker来统一指挥,这个Broker的角色叫做Controller控制器。Kafka要先从所有的Broker中选出一个唯一的Controller。所有的Broker就会尝试在Zookeeper中创建一个临时的节点叫做Controller节点,谁先创建成功谁就是担任了Controller的角色,如果Controller挂掉或者是网络出现问题的时候,Zookeeper上的临时节点就会消失,其他的Broker就会通过Watch机制监听到Controller下线的通知然后就会按照先到先得的原则选举出一个新的Controller。这个Controller就相当于是选举委员会的主席,当一个节点成为Controller之后它就会承担以下职责:
1、监听Broker的变化
2、监听Topic的变化
3、监听Partition的变化
4、获取和管理Broker、Topic、Partition的信息
5、管理Partition的主从信息
当Controller确定以后就可以开始选举了,接下来就是要去找到参与选举的候选人、显然每个副本都像去推荐自己,但是不是所有的副本都有竞选资格的。只有在ISR中保存心跳同步的副本才有资格参与竞选。候选人确定了接下来就是Leader选举,Kafka自己实现了一套分布式选举算法,它的选举算法和微软的PacificA算法最相近,大致的意思是默认让ISR中的第一个副本变成Leader。比如ISR链表中的值是1 5 9。就会优先让1成为Leader(这就跟中国古代的皇帝传位是一样的:优先传给皇长子)。Leader选举的规则相当于是蛇形走位,这样设计的好处是可以去提高数据副本的容灾能力。Leadr和副本完全错开从而不至于一挂全挂。