Kafka - 日志结束偏移量(LEO)与高水位线(HW)之间的差异

问题描述 投票:0回答:3

副本中的

LEO and HW
Leader Replica
)有什么区别?

它们会包含相同的数字吗?我能理解 HW 是

last committed message offset

LEO 何时更新以及如何更新?

apache-kafka kafka-consumer-api kafka-producer-api
3个回答
52
投票

高水位线表示已完全复制的消息的偏移量,而如果有新追加的记录尚未复制到领导者分区,则日志结束偏移量可能会更大。

消费者只能消费达到高水位线的消息。

有关更多详细信息,请参阅此博客文章:http://www.confluence.io/blog/hands-free-kafka-replication-a-lesson-in-operational-simplicity/


17
投票

让我们从 Google 上可以找到的最流行的水印定义之一开始

高水位线是最后一条消息的偏移量 成功复制到日志的所有副本

我不太相信上面的定义,在我更深入的研究中,我发现了这张漂亮的图片:

当时出了什么问题?图片中最右侧的被困追随者没有记录第四条消息。 也许谷歌找到的第一个定义并不完整,作者真正的意图是:“高水位线是成功复制到所有日志的in-sync副本的最后一条消息的偏移量”

在这种直觉的指导下,我发现这篇文章提供了有关如何与代码一起计算 WM 的详细信息。

我发现 WM 定义报告得更加精确:

高水位线计算为该分区的所有 ISR 中的最小 LEO,并且它单调增长。

这个答案以及提供的代码证实了我的直觉。

总结一下我认为水印的详细定义表明了LEO和WM之间的区别。最新提交的偏移量和 LEO 可能与同步跟随者的高水位线一致,但很可能与领导者的高水位线不一致,如第一个链接图像中的示例所示。


0
投票

一般来说,你的问题其他人已经回答过了。我想谈谈对这两个参数很重要的其他一些事情。

如果您只认为读取和写入将通过leader副本完成,那么这两个设置的推理并不太复杂。

另一方面,如果您了解这个,那么事情会变得有点复杂,但只是稍微复杂一点。这个 KIP 表示消费者不仅可以消费来自领导者的消息,还可以消费来自副本的消息。

因此,这里有一些重要的事情:

  • 至少在每个单独的副本中跟踪

    HW
    ,否则(考虑到该 KIP),您可以使用领先于其他副本且尚未复制的消息。

  • 当您考虑一个副本出现故障而另一个副本被选为领导者的情况时,
  • 在每个副本上跟踪

    HW
    的另一个原因很重要。
    LEO
    的值应该是多少?最新的
    HW
    将是一个完美的用例。

  • 更有趣的事情是,当您将消费者连接到作为复制因子一部分的副本时会发生什么,但不是作为

    min.insync
    的一部分。当您生成消息时,该消息将在 min.insync 副本中进行
    sync
    复制,并在复制因子的个数部分中进行 async 复制。 (认为
    A, B
    = 最小不同步,
    A,B,C
    = 复制因子 3)。在这种情况下,生产者可以成功写入
    A
    B
    并报告消息已写入,而附加到
    C
    的消费者只能稍后在
    HW
    更新时看到它。

© www.soinside.com 2019 - 2024. All rights reserved.