1.Broker选举
(1).不采用多数投票方式选举的原因
kafka并没有采用多数投票来选举leader的(redis和es采用的是多数投票方式来进行选举的),原因有两个,一是防止选举时选举到了数据不全的broker,二是当选举没有通过一轮产生时,需要额外的第二轮、第三轮甚至更多的轮次,比较耗时间。
(2).watch
由于kafka集群依赖zookeeper集群,所以最简单的方案是所有follower都在zookeeper上设置一个watch。第一个启动的broker会在zookeeper中创建临时的controller节点,其它broker启动时会尝试创建controller节点,如果已存在该节点,在zookeeper中创建watch对象,接收控制器变更的通知。如果broker中的leader节点挂掉,其它broker通过watch收到controller变更的通知,尝试创建临时节点controller,一个创建成功,其它继续watch。
2.Partition选举
所有partition的leader选举都由controller决定。controller会将leader的改变直接通过rpc的方式通知需为此作为响应的broker。partition的选举过程主要为从zookeeper中读取当前分区的所有isr集合,调用配置的分区选择算法选择分区的leader。