副本中的
LEO and HW
(Leader Replica
)有什么区别?
它们会包含相同的数字吗?我能理解 HW 是
last committed message offset
。
LEO 何时更新以及如何更新?
高水位线表示已完全复制的消息的偏移量,而如果有新追加的记录尚未复制到领导者分区,则日志结束偏移量可能会更大。
消费者只能消费达到高水位线的消息。
有关更多详细信息,请参阅此博客文章:http://www.confluence.io/blog/hands-free-kafka-replication-a-lesson-in-operational-simplicity/
让我们从 Google 上可以找到的最流行的水印定义之一开始
高水位线是最后一条消息的偏移量 成功复制到日志的所有副本
我不太相信上面的定义,在我更深入的研究中,我发现了这张漂亮的图片:
当时出了什么问题?图片中最右侧的被困追随者没有记录第四条消息。 也许谷歌找到的第一个定义并不完整,作者真正的意图是:“高水位线是成功复制到所有日志的in-sync副本的最后一条消息的偏移量”
在这种直觉的指导下,我发现这篇文章提供了有关如何与代码一起计算 WM 的详细信息。
我发现 WM 定义报告得更加精确:
高水位线计算为该分区的所有 ISR 中的最小 LEO,并且它单调增长。
这个答案以及提供的代码证实了我的直觉。
总结一下我认为水印的详细定义表明了LEO和WM之间的区别。最新提交的偏移量和 LEO 可能与同步跟随者的高水位线一致,但很可能与领导者的高水位线不一致,如第一个链接图像中的示例所示。
一般来说,你的问题其他人已经回答过了。我想谈谈对这两个参数很重要的其他一些事情。
如果您只认为读取和写入将通过leader副本完成,那么这两个设置的推理并不太复杂。
另一方面,如果您了解这个,那么事情会变得有点复杂,但只是稍微复杂一点。这个 KIP 表示消费者不仅可以消费来自领导者的消息,还可以消费来自副本的消息。
因此,这里有一些重要的事情:
至少在每个单独的副本中跟踪
HW
,否则(考虑到该 KIP),您可以使用领先于其他副本且尚未复制的消息。
在每个副本上跟踪
HW
的另一个原因很重要。 LEO
的值应该是多少?最新的 HW
将是一个完美的用例。
更有趣的事情是,当您将消费者连接到作为复制因子一部分的副本时会发生什么,但不是作为
min.insync
的一部分。当您生成消息时,该消息将在 min.insync
副本中进行 sync复制,并在复制因子的个数部分中进行 async 复制。 (认为
A, B
= 最小不同步,A,B,C
= 复制因子 3)。在这种情况下,生产者可以成功写入 A
和 B
并报告消息已写入,而附加到 C
的消费者只能稍后在 HW
更新时看到它。