有7年工作经验的小伙伴在面试中被问到这样的问题,说:“说说你对Kafkareplicaleader选举原理的理解。”当时他想,Kafka不就是利用Zookeeper选举吗?难道卡夫卡自己又做了一套。没错,这次Kafka自己造了一个轮子。那么今天,我就和大家谈谈我对Kafkareplicaleader选举原理的理解。1、选举原则真实。早期版本的Kafka直接使用Zookeeper来完成选举。利用Zookeeper的Watch机制;节点不允许重复写入和临时节点。此实现相对简单且无故障。但也有一定的缺点。例如分区和副本过多,所有副本直接参与选举,一旦有节点增加或减少,就会触发大量的Watch事件,ZooKeeper就会超载不堪重负。在新版本的Kafka中,改变了一种实现方式。并不是所有的Replicas都参与Leader选举,而是有一个Brokers统一指挥。这个Broker的角色叫做Controller控制器。Kafka首先要从所有的Brokers中选出唯一的Controller。所有Brokers都会尝试在Zookeeper中创建临时节点/控制器,谁先成功,谁就是控制器。那么如果Controller挂了或者网络有问题,ZooKeeper上的临时节点就会消失。其他Broker通过Watch得知Controller下线的消息后,按照先到先得的原则继续为Controller奔跑。这个控制者相当于选举委员会的主席。节点成为Controller后,将承担以下职责:监听Broker变化,监听Topic变化,监听Partition变化,获取和管理Broker、Topic、Partition信息,管理Partition主从信息。2.Controller确定选举规则后,就可以开始选举分区的master了。下一步是寻找候选人。显然,每个Replica都想推荐自己,但并不是所有的Replica都有资格运行。只有在ISR中保持心跳同步的副本(In-SyncReplicas)才有资格参与选举。就好像皇帝急着让皇子们天天开晨会,只有每天都来签到的皇子才能加入ISR。那些请假和迟到的人没有资格投票。接下来就是Leader选举,相当于在众多皇子中选出一位皇太子。在分布式选举中,有很多选举协议,如ZAB、Raft等,它们的思想可以概括为:先到先得,少数服从多数。但是Kafka并没有使用这些方法,而是使用了自己实现的算法。Kafka官方的解释是其选举算法与微软的PacificA算法最为相似。大致意思就是默认让ISR中的第一个Replica成为Leader。例如,如果ISR为1、5或9,则让1首先成为领导者。这和中国古代的皇帝继承是一样的,优先传给皇长子。假设我们创建一个有4个分区和2个副本的主题。它的leader分布如下,如图:第一个分区的copyleader落在节点B上,第二个分区的replicaleader落在节点C上,第三个分区的replicaleader落在节点A上,第四个分区的副本领导者落在节点B上。如果有更多副本,则依此类推。我们发现Leader的选举规则相当于蛇形运动。这种设计的好处是可以提高数据副本的容灾能力。将领队和副本完全错开,以免全部挂掉。以上就是我对Kafka副本Leader选举原理的理解!
