卡夫卡的不公平领导人选举 - 所有分区的同一领导人



我有一个有 5 个分区的 Kafka 集群。 在缩小到3时,领导人选举进行了几次。

最后,只有一个经纪人成为我一个主题的所有 3 个分区的领导者。

Topic: test          PartitionCount:3       ReplicationFactor:3
Topic: test Partition: 0    Leader: 2       Replicas: 2,0,1    Isr: 2,1,0
Topic: test Partition: 1    Leader: 2       Replicas: 3,1,2    Isr: 2,1
Topic: test Partition: 2    Leader: 2       Replicas: 4,2,3    Isr: 2

2,1,0 是正在运行的代理。

分区 0 可用于 2、0、1。所有经纪人都可用。 所以,isr=2,1,0

分区 1 可用于 3、1、2,但 3 已删除代理。所以 ISR=2,1

分区 2 可用于 4,2,3,但两个 4,3 都已删除代理。所以 ISR=2

请注意,只有 2 人当选为领导者。即使我们假设它在其他代理中具有最高的水位线,给定分区的所有 ISR 也可能是同步的,因此对于给定分区,所有 ISR 都具有相同的偏移量(否则它们将从 ISR 中删除)。

我已经等了很多时间(有一段时间,如果其中一个副本不符合标准,它将从 ISR 中删除),但这仍然是领导者选举。

领导者可以均匀分布(负载平衡)。

For example, partition-0 leader can be 0
partition 1 leader can be 1
partition 2 leader can be 2

为什么不是这样?

注意:我没有启用unclean leader election。它只是默认值。

如果我们假设 0,1 在领导人选举发生后出现,为什么 那不是连任吗?如果 ISR 已更新,理想情况下 领导者也应该是。不是吗?

即如果卡夫卡知道 0,1 向上 并具有同步副本,它应该再进行一个领导者 选举。

有什么具体的原因为什么不是这样吗?

Kafka 有一个首选领导者的概念,这意味着如果可能的话,它会选择该副本作为领导者。副本列表中列出的第一个副本是首选主节点。现在查看当前的集群状态:

Topic: test Partition: 0    Leader: 2       Replicas: 2,0,1    Isr: 2,1,0
Topic: test Partition: 1    Leader: 2       Replicas: 3,1,2    Isr: 2,1
Topic: test Partition: 2    Leader: 2       Replicas: 4,2,3    Isr: 2
  • 分区 0,代理 2 是首选的领导者,并且是当前领导者
  • 分区 1,
  • 代理 3 是首选的领导者,但它不同步,因此在 2 和 1 之间选择一个随机领导者
  • 分区 2,代理 4 是首选的领导者,但同样 4 不同步。只有 2 个是同步的,所以它是选举的。

如果你所有的经纪人都恢复同步,默认情况下,Kafka 会重新选举首选的领导者(或者可以使用kafka-preferred-replica-election.sh工具强制,请参阅平衡领导)。

如果缺少的代理不会重新启动,则可以更改分区的副本分配,以使用kafka-reassign-partitions.sh工具手动平衡前导。只需确保将首选领导者作为副本列表中的第一个条目即可。

最新更新