一、leader和follower

在Kafka中,每个topic都可以配置多个分区以及多个副本。每个分区都有一个leader以及0个或者多个follower。在创建topic时,Kafka会将每个分区的leader均匀地分配在每个broker上。使用Kafka时,是感觉不到leader和follower存在的。

  • Kafka中的leader负责处理读写操作,而follower只是负责副本数据的同步
  • 如果leader出现故障,其他follower会被重新选举为leader
  • follower像是一个消费者,不断拉取对应分区的leader数据,并保存到日志数据文件中

二、AR、ISR、OSR

  • AR(Assigned Replica 已分配的副本):表示某个分区的所有副本
  • ISR(In-Sync-Replica 在同步中的副本):表示所有与leader副本保持一定程度同步的副本(包括leader副本在内)
  • OSR(Out-of-Sync-Replica 不在同步中的副本):表示所有与leader副本同步滞后过多的follower副本(不包括leader副本)
  • AR = ISR + OSR
  • 正常情况下,所有的follower副本都应该与leader副本保持同步,即:AR = ISR,OSR集合为空

四、leader选举

1. Controller的介绍

  • Kafka启动时,会在所有的broker(集群节点)中选择一个controller
  • 之前的leader和follower是针对分区而言的,而controller是针对broker的
  • 创建topic、添加分区、修改副本数量等管理任务都是由controller完成的
  • Kafka分区leader的选举,也是有controller决定的

2. Controller的选举

  • 在Kafka集群启动时,每个broker都会常识去ZooKeeper上注册成为Controller(ZK临时节点)
  • 只会有一个broker竞争成功,其他的broker会注册该节点的监视器,一旦该临时节点状态发生变化,就可以进行相应的处理
  • Controller是高可用的,一旦某个broker崩溃,其他的broker会重新注册成为Controller

3. Controller选举分区leader

  • 所有分区的leader选举都是由controller决定的
  • controller会将leader的改变直接通过RPC的方式通知需为此做出响应的broker
  • controller读取到当前分区的ISR,只有一个replica存活时,就选择这个replica作为leader,否则任意选择一个replica作为leader
  • 如果该分区的所有replica都已经宕机,则新的leader为-1

4. 为什么不通过ZK的方式选举分区的leader?

  • Kafka集群如果业务很多的情况下,会存在很多的分区
  • 假设某个broker宕机,就会出现很多的分区都需要重新选举leader
  • 如果使用zookeeper选举leader,会给zk带来巨大的压力。因此,Kafka中leader的选举不能使用zk来实现

五、leader负载均衡

如果某个broker崩溃之后,就可能导致分区的leader分布不均匀,就是说一个broker上存在一个topic下不同分区的leader

1. Prefered Replica

  • Kafka中引入了一个叫做【prefered replica】概念,即:优先的replica
  • 在ISR列表中,第一个replica就是prefered replica

2. 重新分配分区leader

查看kafka配置 kafka 查看leader_zookeeper

查看kafka配置 kafka 查看leader_数据_02


查看kafka配置 kafka 查看leader_查看kafka配置_03