水位是一個單調增加且表征最早未完成工作(oldest work not yet completed)的時間戳。
藍色部分代表已完成的工作,紅色部分代表正在進行的工作,分界線就是水位。
在kafka中,水位并不是時間戳,而是offset位移,水位有高水位HW和低水位LW
kafka中HW(High Watermark)有兩個作用
一是用來表示哪些消息可以被消費者消費,相當于分界線
二是幫助kafka完成副本的同步
位移值小于高水位的是已提交消息,可被消費者消費,大于等于高水位的消息,屬于
未提交消息,不可被消費者消費
Log End Offset 日志末端位移,LEO是表示副本寫入下一條消息的位移,介于高水位
和LEO之間的消息就是未提交消息,所以同一個副本中,高水位是不會超過LEO的
Kafka 使用 Leader 副本的高水位來定義所在分區的高水位。換句話說,分區的高水位就是其?
Leader 副本的高水位
HW更新機制
Broker 0 上保存了某分區的 Leader 副本和所有 Follower 副本的 LEO 值,?Broker 1 上僅僅保
存了該分區的某個 Follower 副本。Kafka 把 Broker 0 上保存的這些 Follower 副本又稱為
遠程副本(Remote Replica)。Kafka 副本機制在運行過程中,會更新 Broker 1 上 Follower?
副本的高水位和 LEO 值,同時也會更新 Broker 0 上 Leader 副本的高水位和 LEO 以及
所有遠程副本的 LEO,但它不會更新遠程副本的高水位值
當生產者發送一條消息時,對應分區的leader副本將消息落盤后,LEO更新為1,這時follower
來同步消息,于是把自己的LEO也更新成了1,下一輪同步中,follower來拉去位移是1的消息,
leader接收消息后,把遠程副本的LEO更新為1,然后更新HW為1,在更新LEO或者更新
遠程副本的LEO之后,leader會取這兩個的最小值更新為HW,然后把自己的HW值發給
follower,follower接到消息后把自己的HW更新為1.通過這種機制實現了Leader和Follower
副本之間的同步
Leader epoch
由于follower的HW的更新,需要一輪額外的消息拉取,如果folloer很多的話,就需要多輪拉取,
Leader 副本高水位更新和 Follower 副本高水位更新在時間上是存在錯配的,會導致數據的
不一致,所以Leader epoch登場。
Epoch,一個單調增加的版本號。每當leader發生變更時,都會增加該版本號。小版本號的?
Leader 被認為是過期 Leader,不能再行使 Leader 權力。
起始位移,Leader 副本在該 Epoch 值上寫入的首條消息的位移
類似于zookeper的leader機制,通過leader epoch的單調遞增,以此避免副本宕機重啟
導致的消息同步錯亂
由于leader和follwer的hw的同步是存在時間差的,由于broker的宕機重啟后,日志的同步
是以高水位為準的,會導致消息的丟失,通過epoch機制的引入,副本是否執行日志截斷
不再依賴于高水位進行判斷