我有一个带有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 并拥有同步的副本,它应该另外指挥一位 选举。
有什么特定原因为什么不是这样?
答案 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
如果您的所有经纪人都将同步返回,则默认情况下,Kafka将重新选举首选的领导者(或者可以使用kafka-preferred-replica-election.sh
工具强制其选择,请参见Balancing leadership)。
如果丢失的代理不会重新启动,则可以使用kafka-reassign-partitions.sh
工具将分区的副本分配更改为balance the leadership manually。只要确保将首选领导者作为副本列表中的第一项即可。