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

Posted

技术标签:

【中文标题】Kafka - 日志结束偏移量(LEO)与高水位线(HW)之间的区别【英文标题】:Kafka - difference between Log end offset(LEO) vs High Watermark(HW) 【发布时间】:2017-01-05 07:20:04 【问题描述】:

副本中的LEO and HWLeader Replica)有什么区别?

它们会包含相同的数字吗?我可以理解硬件是last committed message offset

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

【问题讨论】:

【参考方案1】:

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

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

查看这篇博文了解更多详情:http://www.confluent.io/blog/hands-free-kafka-replication-a-lesson-in-operational-simplicity/

【讨论】:

感谢您提供的重要信息。您的意思是说,只有在所有 ISR 中复制消息,硬件才会更新?在异步副本过程中,领导副本中的硬件也会在所有 ISR 更新后更新? HW 和 LEO 都只为领导分区维护。是的,只有在 ISR 分区复制消息时,硬件才是高级的。 你确定只为Leader副本维护HW和LEO吗?根据维基页面cwiki.apache.org/confluence/display/KAFKA/…,似乎每个副本都有这些字段.. 我不是 100% 确定...但是,链接指向 2012 年的“草稿”——不确定这是否以完全相同的方式实现...如果这些细节很重要,我们可以深入挖掘:) 我可以问一些大学。主要问题是关于 EOL 和 HW 的差异——我想基本答案保持不变。 HW 是复制到 IRS 的已提交消息的最新偏移量。 EOL 已写入分区但尚未完全复制。【参考方案2】:

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

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

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

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

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

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

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

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

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

【讨论】:

以上是关于Kafka - 日志结束偏移量(LEO)与高水位线(HW)之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

Kafka 日志中缺少偏移量 - 简单消费者无法继续

Kafka日志及索引文件

Kafka日志及索引文件

聊聊 Kafka:Kafka 如何保证一致性

kafka学习总结009 --- HW和LEO

KafKa - 分区副本消息同步策略 及 消息丢失问题