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

时间:2019-06-09 12:40:12

标签: apache-kafka

我有一个带有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   并拥有同步的副本,它应该另外指挥一位   选举。

     

有什么特定原因为什么不是这样?

1 个答案:

答案 0 :(得分:2)

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工具强制其选择,请参见Balancing leadership)。

如果丢失的代理不会重新启动,则可以使用kafka-reassign-partitions.sh工具将分区的副本分配更改为balance the leadership manually。只要确保将首选领导者作为副本列表中的第一项即可。