在leader副本失败后,新的leader副本被选举出来,Kafka如何知道新的leader副本是否干净(当前一个leader失败时是否同步)?
例如,假设有副本1、2和3,其中1是领导者。假设副本3关闭,然后消息被写入1(和2),然后1和2关闭。现在副本3出现,它不干净,因为它不包含它关闭时写入的消息。当3出现时,Kafka如何检测它是否干净?leader可以在Zookeper(或最新的Kafka中的等价物)中存储每个接收到的消息的最新偏移量,但这会非常低效吗?
在leader副本失败后,新的leader副本被选举出来,Kafka如何知道新的leader副本是否干净(当前一个leader失败时是否同步)?
例如,假设有副本1、2和3,其中1是领导者。假设副本3关闭,然后消息被写入1(和2),然后1和2关闭。现在副本3出现,它不干净,因为它不包含它关闭时写入的消息。当3出现时,Kafka如何检测它是否干净?leader可以在Zookeper(或最新的Kafka中的等价物)中存储每个接收到的消息的最新偏移量,但这会非常低效吗?
1条答案
按热度按时间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设置:
*领导人选举:
*酒店住宿加早餐旅馆:
*不同步故障处理:
replica.lag.time.max.ms
属性控制)赶上,则可能会将其从ISR集中删除,从而阻止其成为领导者。*ZooKeeper信息:
Kafka依靠ISR集并确保只有同步的副本才有资格成为leader,从而有助于防止不同步的副本成为leader的情况。这种机制有助于维护数据一致性并避免leader选举期间可能的数据丢失。
总之,Kafka使用ISR集、副本同步和存储在ZooKeeper中的信息,以确保当
unclean.leader.election.enable
设置为false
时,仅考虑同步副本作为领导。