当分区 leader 节点崩溃时,其中一个 follower 节点会成为新的 leader 节点,这样会导致集群的负载不均衡,从而影响服务的健壮性和稳定性

在 Kafka 中,副本的 Leader 选举是通过 Kafka 的 Controller 和 ISR(In-Sync Replicas)机制来实现的。以下是 Leader 选举的详细过程:

Controller 的作用

  • Controller:Kafka 集群中有一个 Broker 被选举为 Controller,负责管理分区的 Leader 选举、再平衡等操作。
  • Controller 选举:Controller 通过 Zookeeper 进行选举,第一个在 Zookeeper 中创建/controller 节点的 Broker 成为 Controller。

选取新的 Leader 的过程

  1. 检测失效
    • 当一个分区的 Leader 副本失效时,Kafka 会检测到该 Leader 没有响应。这通常通过心跳机制来检测,如果一段时间内没有收到 Leader 的心跳,就会认为它已经失效。
  2. ISR 列表
    • Kafka 维护了一个称为 ISR(In-Sync Replicas)的列表,这个列表包含了与 Leader 副本保持同步的所有副本。只有 ISR 中的副本才有资格成为新的 Leader。
  3. 选举新的 Leader
    • 一旦确认 Leader 失效,Kafka 会从 ISR 列表中选择一个新的 Leader。通常情况下,选择的依据是选择 ISR 列表中的第一个副本作为新的 Leader。这是因为 ISR 列表中的副本与 Leader 副本的数据是同步的,它们之间的数据差异较小,可以更快地恢复数据一致性。
  4. 通知 ZooKeeper
    • Kafka 会通过 ZooKeeper 来记录分区的 Leader 信息。当一个新的 Leader 被选出后,Kafka 会更新 ZooKeeper 中的相关记录,以反映新的 Leader 信息。
  5. 广播结果
    • Controller 将新的 Leader 信息广播给所有 Broker。
  6. 客户端重新连接
    • 一旦新的 Leader 被选出并记录在 ZooKeeper 中,客户端(如生产者和消费者)会重新连接到新的 Leader,以便继续进行读写操作。

选举策略

  • 优先选择 ISR 中的副本:理想情况下,Kafka 会优先选择 ISR 中的一个副本作为新的 Leader,因为这些副本与之前的 Leader 保持同步,数据是最新的。
  • Unclean Leader 选举:如果 ISR 中的所有副本都不可用或数据丢失,Kafka 可能会选择 Unclean Leader 选举,这意味着选择一个不在 ISR 中的副本作为新的 Leader。这种情况下,可能会牺牲一定的数据一致性,但可以保持系统的可用性。CAP 机制:Kafka 赋予 C 或 A 的权利 (一致性 + 可用性,无分区容错性)

配置选项

Kafka 提供了一些配置选项来控制 Leader 选举的行为:

  • unclean.leader.election.enable:此配置决定了是否允许 Unclean Leader 选举。如果设置为  false,则只有 ISR 中的副本才能被选为新的 Leader;如果设置为  true,则允许从 ISR 之外选择新的 Leader。

选举的影响

  • 数据一致性:选择 ISR 中的副本作为新的 Leader 可以最大限度地保证数据的一致性。
  • 系统可用性:允许 Unclean Leader 选举可以在所有 ISR 副本都失效的情况下保持系统的可用性,但这可能会导致数据的不一致。