文章目录
- Leader和Follower
- AR、ISR、OSR
- Leader的选举
- Leader的负载均衡
Leader和Follower
在 Kafka 中,每个 topic 都可以配置多个分区以及多个副本。每个分区都有一个 leader 以及 0 个或者多个 follower,在创建 topic 时,Kafka 会将每个分区的 leader 均匀地分配在每个 broker 上。我们正常使用kafka是感觉不到leader、follower的存在的。但其实,所有的读写操作都是由leader处理,而所有的follower都复制leader的日志数据文件,如果leader出现故障时,follower就会被选举为leader。所以,可以这样说:
Kafka中 的 leader 负责处理读写操作,而 follower 只负责副本数据的同步。
如果 leader 出现故障,其他 follower 会被重新选举为leader。
follower 像一个 consumer 一样,拉取 leader 对应分区的数据,并保存到日志数据文件中。
AR、ISR、OSR
在实际环境中,leader有可能会出现一些故障,所以 Kafka 一定会选举出新的 leader。而在Kafka中,把 follower 可以按照不同状态分为三类——AR、ISR、OSR。
- 分区的所有副本统称为 AR(Assigned Replicas——已分配的副本)
- 所有与 leader 副本保持一定程度同步的副本(包括 leader 副本在内)组成 ISR (In-Sync Replicas——在同步中的副本)
- 由于follower副本同步滞后过多的副本(不包括 leader 副本)组成 OSR(Out-of-Sync Replias)
AR = ISR + OSR
正常情况下,所有的follower副本都应该与leader副本保持同步,即AR = ISR,OSR集合为空。
leader和follower统称为Reqlica
Leader的选举
一个 leader 在崩溃后,Kafka 又会从其他的 follower 中快速选举出来了leader。
主要有Controller来绝点的。
- Controller的定义
- Kafka 启动时,会在所有的 broker 中选择一个 controller。
- 前面 leader 和 follower 是针对 partition,而 controller 是针对 broker 的。
- 创建topic、或者添加分区、修改副本数量之类的管理任务都是由controller完成的。
- Kafka分区leader的选举,也是由controller决定的。
- Controller 的出现
- 在Kafka集群启动的时候,每个broker都会尝试去ZooKeeper上注册成为Controller(ZK临时节点)
- 但只有一个竞争成功,其他的broker会注册该节点的监视器
- 一旦该临时节点状态发生变化,就可以进行相应的处理。
- Controller也是高可用的,一旦某个broker崩溃,其他的broker会重新注册为Controller
- Controller选取leader
- 所有 Partition 的 leader 选举都由 Controller 决定。
- controller 会将 leader 的改变直接通过 RPC 的方式通知需为此作出响应的Broker。
- Controller 读取到当前分区的 ISR,只要有一个Replica还幸存,就选择其中一个作为 leader 否则,则任意选这个一个 Replica 作为 leader。
- 如果该 partition 的所有 Replica 都已经宕机,则新的 leader 为-1。
为什么不能通过ZK的方式来选举 partition 的 leader?
- Kafka集群如果业务很多的情况下,会有很多的 partition。
- 假设某个 broker 宕机,就会出现很多的 partiton 都需要重新选举 leader。
- 如果使用 zookeeper 选举 leader,会给 zookeeper 带来巨大的压力。所以,kafka 中 leader 的选举不能使用 ZK 来实现。
Leader的负载均衡
在Kafka当中引入了一个叫做preferred-replica的概念,意思就是:优先的Replica。
- 在ISR列表中,第一个replica就是preferred-replica。
- 第一个分区存放的broker,肯定就是preferred-replica。
执行以下脚本可以将 preferred-replica 设置为leader,均匀分配每个分区的leader。
./kafka-leader-election.sh --bootstrap-server node1.itcast.cn:9092 --topic 主题 --partition=1 --election-type preferred