序言:
Kafka作为一个分布式消息中间件(存储消息).既然是一个分布式存储系统(message是分区进行存储),那么肯定需要考虑到数据一致性算法的实现。对于现在较多的开源分布式系统基本会采用两种思路:第一基于paxos算法(衍生出来其它算法例如Fast Paxos,zookeeper的ZAB原子广播协议),第二种基于leader与follower多副本机制(对于数据的写入,同一由leader进行管理写入,follower基本与leader进行同步,例如Raft算法-Nacos实现,Bully霸道选举算法-Ealsticsearch中)。而Kafka作为一个分布式系统,Kafka集群中的选举大致可以分为二类:控制器的选举、分区leader的选举。
1:控制器选举
在Kafka集群中有多个broker,那么就有一个broker会被选举为控制器(Kafka Controller),它的作用负责管理整个集群中所有分区和副本的状态。比如当某个分区的leader副本出现故障时,由控制器负责为该分区选举新的leader副本。再比如当检测到某个分区的ISR集合发生变化时,由控制器负责通知所有broker更新其元数据信息。控制器的选举是由Zookeeper(协调框架)的节点的唯一性来做到的,在kafka中多个broker启动后会在Zookeeper创建/controller这个临时(EPHEMERAL)节点,哪个broker创建成功,那么它就成为了控制器,其它竞争失败的broker会进行watch注册。
2:分区leader的选举
Kafka是一个多分区,多副本的消息服务,那么每个分区的多副本由一个leader与多个follower构成(