Kafka如何发现不干净的领导人选举?

c9qzyr3d  于 5个月前  发布在  Apache
关注(0)|答案(1)|浏览(70)

在leader副本失败后,新的leader副本被选举出来,Kafka如何知道新的leader副本是否干净(当前一个leader失败时是否同步)?
例如,假设有副本1、2和3,其中1是领导者。假设副本3关闭,然后消息被写入1(和2),然后1和2关闭。现在副本3出现,它不干净,因为它不包含它关闭时写入的消息。当3出现时,Kafka如何检测它是否干净?leader可以在Zookeper(或最新的Kafka中的等价物)中存储每个接收到的消息的最新偏移量,但这会非常低效吗?

jv2fixgn

jv2fixgn1#

当Kafka中的unclean.leader.election.enable设置为true时,这意味着如果没有同步副本可用,则Kafka允许不同步副本在leader选举期间成为leader。这被认为是“不干净”leader选举,因为所选leader可能没有关闭时写入的所有消息。
在你描述的场景中:
1.第三次失败
1.消息写入1(和2)。
1.1和2下降
1.第三次出现
如果unclean.leader.election.enable被设置为true,并且没有其他同步副本可用,则Kafka可能会选择P2P 3作为领导者,即使它与最新消息不同步。
回答你关于Kafka如何知道新领导人是否“干净”的问题,当unclean.leader.election.enable为真时:

***Kafka不会显式检查新的leader是否“干净"。**该设置允许不干净的leader选举的可能性,承认当选的leader可能与最新消息不同步。
***Leader在关闭时可能没有写入所有消息。**在确保可用性优先于严格一致性的情况下,这是一种公认的权衡。
***效率与一致性的权衡:**在分布式存储系统(如ZooKeeper)中为每个leader副本存储每个接收到的消息的最新偏移量可能是资源密集型的,并且可能会引入额外的延迟。在这种情况下,Kafka的设计优先考虑了可用性和响应性。

如果严格一致性对于您的用例来说具有更高的优先级,则可以选择将unclean.leader.election.enable设置为false(默认值),以防止不干净的领导者选举,并确保新的领导者必须完全赶上最新的消息。

更新

unclean.leader.election.enable设置为false时,Kafka确保只有与leader同步的副本才能在选举期间成为新的leader。这样做是为了保持数据一致性并避免潜在的数据丢失。
以下是Kafka如何在unclean.leader.election.enable设置为false时确定新领导者是否“干净”:

*ISR设置:

  • Kafka为每个分区维护了一个名为In-Sync服务器(ISR)集的概念。ISR集由与leader同步的副本组成。
    *领导人选举:
  • 当进行领导者选举时,只有ISR集中的副本才有资格成为新的领导者。
    *酒店住宿加早餐旅馆:
  • 在副本成为领导者之前,它需要赶上领导者的日志。如果副本不在ISR集中或明显落后于领导者,则它将没有资格成为新的领导者。
    *不同步故障处理:
  • 如果复制副本不同步,并且无法在配置的时间内(由replica.lag.time.max.ms属性控制)赶上,则可能会将其从ISR集中删除,从而阻止其成为领导者。
    *ZooKeeper信息:
  • Kafka使用ZooKeeper维护元数据,包括ISR集的信息。ZooKeeper跟踪哪些副本与leader同步。

Kafka依靠ISR集并确保只有同步的副本才有资格成为leader,从而有助于防止不同步的副本成为leader的情况。这种机制有助于维护数据一致性并避免leader选举期间可能的数据丢失。
总之,Kafka使用ISR集、副本同步和存储在ZooKeeper中的信息,以确保当unclean.leader.election.enable设置为false时,仅考虑同步副本作为领导。

相关问题