当分区 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 的过程
- 检测失效:
- 当一个分区的 Leader 副本失效时,Kafka 会检测到该 Leader 没有响应。这通常通过心跳机制来检测,如果一段时间内没有收到 Leader 的心跳,就会认为它已经失效。
- ISR 列表:
- Kafka 维护了一个称为 ISR(In-Sync Replicas)的列表,这个列表包含了与 Leader 副本保持同步的所有副本。只有 ISR 中的副本才有资格成为新的 Leader。
- 选举新的 Leader:
- 一旦确认 Leader 失效,Kafka 会从 ISR 列表中选择一个新的 Leader。通常情况下,选择的依据是选择 ISR 列表中的第一个副本作为新的 Leader。这是因为 ISR 列表中的副本与 Leader 副本的数据是同步的,它们之间的数据差异较小,可以更快地恢复数据一致性。
- 通知 ZooKeeper:
- Kafka 会通过 ZooKeeper 来记录分区的 Leader 信息。当一个新的 Leader 被选出后,Kafka 会更新 ZooKeeper 中的相关记录,以反映新的 Leader 信息。
- 广播结果:
- Controller 将新的 Leader 信息广播给所有 Broker。
- 客户端重新连接:
- 一旦新的 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 副本都失效的情况下保持系统的可用性,但这可能会导致数据的不一致。