Kafka中 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来绝点的。

  1. Controller的定义

    • Kafka 启动时,会在所有的 broker 中选择一个 controller。
    • 前面 leader 和 follower 是针对 partition,而 controller 是针对 broker 的。
    • 创建topic、或者添加分区、修改副本数量之类的管理任务都是由controller完成的。
    • Kafka分区leader的选举,也是由controller决定的。
  2. Controller 的出现

    • 在Kafka集群启动的时候,每个broker都会尝试去ZooKeeper上注册成为Controller(ZK临时节点)
    • 但只有一个竞争成功,其他的broker会注册该节点的监视器
    • 一旦该临时节点状态发生变化,就可以进行相应的处理。
    • Controller也是高可用的,一旦某个broker崩溃,其他的broker会重新注册为Controller
  3. 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

猜你喜欢

转载自blog.csdn.net/weixin_45970271/article/details/126556537
今日推荐