我有一个主题为partitions = 1
和replication factor = 5
。
我开始发布有关此主题的消息。几秒钟后,令我惊讶的是,我观察到除领导者副本外,所有关注者都不同步。
开始制作之前:
主题:log_compaction_topic4-15分区:0领导者:5复制副本:5,1,2,3,4 Isr:5,1,2,3,4
开始制作后:
主题:log_compaction_topic4-15分区:0领导者:5复制副本:5,1,2,3,4 Isr:5
此处min.insync.replicas=5
和其余主题配置具有默认值。
另外,我的制作人正在使用acks=1
问题
即使mininsync.replicas=5
我可以使所有关注者一直保持同步吗?
这是预期的行为吗?如果是,我是否会丢失一些消息以防领导者崩溃?
答案 0 :(得分:0)
为什么即使min.insync.replicas = 5
,我也可以进一步发布消息仅当您设置acks="-1" or acks="all"
时,才会考虑此配置。
卡夫卡官方文件说:
当生产者将acks设置为“ all”(或“ -1”)时,最小不同步副本 指定必须确认写入的最小副本数 认为写入成功。如果不能达到这个最小值 遇到,那么制片人会提出一个例外( NotEnoughReplicas或NotEnoughReplicasAfterAppend)
我可以使所有关注者一直保持同步吗?
如上所述,您可以先拥有acks="-1" or acks="all"
然后提及min.insync.replicas=5
。
这是预期的行为吗?如果是,我是否会丢失一些消息以防领导者崩溃?
是的,如果领导者失败,您将丢失消息。 acks=1
表示领导者会将记录写入其本地日志,但是会在不等待所有关注者的完全确认的情况下做出响应。在这种情况下,如果领导者在确认记录后立即失败,但在追随者复制记录之前失败,则记录将丢失。
评论问题:
但是我观察到(acks = all,min.insync.replicas = 1)和(acks = 1)之间的吞吐量差异。在acks = -1设置中,即使min.insync.replicas = 1,领导者仍在等待所有同步副本的确认,从而降低了吞吐量
此外,最小同步副本设置还指定了 需要同步以使分区保持可用的副本 写。当生产者指定ack(-1 / all config)时,它将 那时仍在等待所有同步副本的确认 (与最小同步副本的设置无关)。
请Jun(Apache Kafka的合著者)再次确认我的回答。它是 一个常见的误解是min.insync.replicas允许在ACK时 只有ISR的最小子集才能获得已发布的消息。然而 “最小”部分适用于其他内容。最小值是 定义ISR列表可以获取并仍然允许写入的数量。 当列表中的所有ISR都获得ACK时,总是返回ACK。 信息。否则,领导人选举将更加复杂 因为并非所有副本实际上都会同步。