Kafka的选举机制
Kafka控制器的选举
Kafka控制器介绍
在Kafka集群中会有一个或多个broker,其中有一个broker会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。
- 当某个分区的leader副本(一个分区会有多个副本,其中只有leader副本对外提供读写服务)出现故障时,由控制器负责为该分区选举新的leader副本;
- 当检测到某个分区的ISR集合发生变化时,由控制器负责通知所有broker更新其元数据信息;
- 当为某个Topic增加分区数量时,由控制器负责分区的重新分配。
分区集合介绍
- AR(Assigned Replicas):分区中的所有副本。
- ISR(In-Sync Replicas):所有与leader副本保持一定程度同步的副本(包括leader副本在内)。
- OSR(Out-of-Sync Replicas):与leader副本同步滞后过多的副本(不包括leader副本)。
Kafka控制器选举原理
Kafka中的控制器选举工作依赖于Zookeeper,成功竞选成为控制器的broker会在Zookeeper中创建/controller临时节点。
每个broker会对/controller节点添加监听器,以此来监昕此节点的数据变化,当/controller节点发生变更,就会触发新一轮的选举。
临时节点的内容:
{"version":1,"brokerid":0,"timestamp":"1593330804078"}
- version:Kafka版本相关,对同一个Kafka版本来说为固定值。
- brokerid:表示成为控制器的broker的id编号。
- timestamp:表示竞选成为控制器时的时间戳(精确到毫秒)。
Broker选举
在任意时刻,集群中有且只有一个控制器,每个broker都会在内存中保存当前控制器的brokerid值,这个值标识activeControllerId。
启动时选举
集群中第一个启动的broker会通过在zookeeper中创建临时节点/controller来让自己成为控制器,其他broker启动时
会去尝试读取/controller节点的brokerid的值,读取到的brokerid的值不为-1知道已经有其他broker节点成功竞选为控制器,就会在zookeeper中创建watch对象,便于它们收到控制器变更的通知。
leader异常选举
那么如果broker由于网络原因与zookeeper断开连接或者异常退出,那么其他broker通过watch收到控制器变更的通知,就会去尝试创建临时节点/controller,如果有一个broker创建成功,那么其他broker就会收到创建异常通知,也就意味着集群中已经有了控制器,其他broker只需创建watch对象即可。
follower异常
如果集群中有一个broker发生异常退出了,那么控制器就会检查这个broker是否有分区的副本leader,如果有那么这个分区就需要一个新的leader,此时控制器就会去遍历其他副本,决定哪一个成为新的leader,同时更新分区的ISR集合。
broker加入
如果有一个broker加入集群中,那么控制器就会通过brokerid去判断新加入的broker中是否含有现有分区的副本,如果有,就会从分区副本中去同步数据。
epoch防止脑裂
Kafka通过controller_epoch来保证控制器的唯一性,进而保证相关操作的一致性。
- controller_epoch是一个整型值,存放在Zookeeper的/controller_epoch这个持久节点中;
- controller_epoch值用于记录控制器发生变更的次数,即记录当前的控制器是第几代控制器;
- controller_epoch的初始值为1,当控制器发生变更时,就将该字段值加1。
每个和控制器交互的请求都会携带controller_epoch字段:
- 如果请求的controller_epoch值小于内存中的controller_epoch值,则认为这个请求是向已经过期的控制器发送的请求,那么这个请求会被认定为无效的请求。
- 如果请求的controller_epoch值大于内存中的controller_epoch值,那么说明已经有新的控制器当选了。
分区Leader的选举
controller感知到分区leader所在的broker挂了,controller会从replicas副本列表(同时在ISR列表里)中取出第一个broker作为leader。
leader副本介绍
- leader副本负责维护和跟踪ISR集合中所有follower副本的滞后状态,当follower副本落后太多或失效时,leader副本会把它从ISR集合中剔除。
- 当OSR集合中有follower副本“追上”了leader副本,那么leader副本会把它从OSR集合转移至ISR集合。
- 默认情况下,当leader副本发生故障时,只有在ISR集合中的副本才有资格被选举为新的leader。
消费组Leader的选举
GroupCoordinator需要为消费组内的消费者选举出一个消费组的leader,这个选举的算法很简单,当消费组内还没有leader,那么第一个加入消费组的消费者即为消费组的leader,如果当前leader退出消费组,则会挑选以HashMap结构保存的消费者节点数据中,第一个键值对来作为leader。