Kafka leader 副本如何在将数据复制到 follower 副本时决定推进 Highwater Mark (HW)

How Kafka leader replica decides to advance Highwater Mark (HW) when replicating data to follower replicas

我了解了 Kafka 复制协议。我发现Kafka维护了LEO和HW。据我了解,

LEO:副本看到的最新消息的偏移量。

HW:最新消息的偏移量,保证每条消息 副本看过了

Kafka生产者可以设置这些确认方式。

  1. 确认 = 0
  2. 确认 = 1
  3. acks = 全部

所以我的问题是领导者如何根据Kafka生产者使用的确认方法推进HW。

我的理解是,

  1. 对于 acks = 0, Leader在看到新消息时推进HW。

  2. 对于 acks = 1, Leader 在将新消息写入其本地日志时推进 HW。

  3. for acks = all, 当每个跟随者都发送确认他们收到消息时,领导者推进 HW。

这是正确的吗?谁能澄清一下?

进一步探索,我发现在broker配置中设置的HW进程和确认方式没有关系。不管 acks 的设置如何,leader 副本在推进 HW 之前等待所有其他 follower 持久化消息。

  • 当 acks = 0 和 acks = 1 时,leader 在看到消息和将消息持久化到本地日志后分别向生产者发送 ack。但是在将 LEO 设置为 HW 之前等待所有其他副本持久化消息。
  • 如果acks = all并且min.insync.replica = replication factor,leader需要等待所有的replicas都持久化消息,然后再向producer发送ack。仅在这种情况下,leader 将 HW 与发送给 producer 的 ack 同步。