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生产者可以设置这些确认方式。
- 确认 = 0
- 确认 = 1
- acks = 全部
所以我的问题是领导者如何根据Kafka生产者使用的确认方法推进HW。
我的理解是,
对于 acks = 0,
Leader在看到新消息时推进HW。
对于 acks = 1,
Leader 在将新消息写入其本地日志时推进 HW。
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 同步。
我了解了 Kafka 复制协议。我发现Kafka维护了LEO和HW。据我了解,
LEO:副本看到的最新消息的偏移量。
HW:最新消息的偏移量,保证每条消息 副本看过了
Kafka生产者可以设置这些确认方式。
- 确认 = 0
- 确认 = 1
- acks = 全部
所以我的问题是领导者如何根据Kafka生产者使用的确认方法推进HW。
我的理解是,
对于 acks = 0, Leader在看到新消息时推进HW。
对于 acks = 1, Leader 在将新消息写入其本地日志时推进 HW。
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 同步。