水位是一個(gè)單調(diào)增加且表征最早未完成工作(oldest work not yet completed)的時(shí)間戳枣抱。
藍(lán)色部分代表已完成的工作熔吗,紅色部分代表正在進(jìn)行的工作,分界線(xiàn)就是水位佳晶。
在kafka中桅狠,水位并不是時(shí)間戳,而是offset位移轿秧,水位有高水位HW和低水位LW
kafka中HW(High Watermark)有兩個(gè)作用
一是用來(lái)表示哪些消息可以被消費(fèi)者消費(fèi)中跌,相當(dāng)于分界線(xiàn)
二是幫助kafka完成副本的同步
位移值小于高水位的是已提交消息,可被消費(fèi)者消費(fèi)菇篡,大于等于高水位的消息漩符,屬于
未提交消息,不可被消費(fèi)者消費(fèi)
Log End Offset 日志末端位移驱还,LEO是表示副本寫(xiě)入下一條消息的位移嗜暴,介于高水位
和LEO之間的消息就是未提交消息,所以同一個(gè)副本中议蟆,高水位是不會(huì)超過(guò)LEO的
Kafka 使用 Leader 副本的高水位來(lái)定義所在分區(qū)的高水位闷沥。換句話(huà)說(shuō),分區(qū)的高水位就是其?
Leader 副本的高水位
HW更新機(jī)制
Broker 0 上保存了某分區(qū)的 Leader 副本和所有 Follower 副本的 LEO 值咐容,?Broker 1 上僅僅保
存了該分區(qū)的某個(gè) Follower 副本舆逃。Kafka 把 Broker 0 上保存的這些 Follower 副本又稱(chēng)為
遠(yuǎn)程副本(Remote Replica)。Kafka 副本機(jī)制在運(yùn)行過(guò)程中,會(huì)更新 Broker 1 上 Follower?
副本的高水位和 LEO 值路狮,同時(shí)也會(huì)更新 Broker 0 上 Leader 副本的高水位和 LEO 以及
所有遠(yuǎn)程副本的 LEO虫啥,但它不會(huì)更新遠(yuǎn)程副本的高水位值
當(dāng)生產(chǎn)者發(fā)送一條消息時(shí),對(duì)應(yīng)分區(qū)的leader副本將消息落盤(pán)后奄妨,LEO更新為1涂籽,這時(shí)follower
來(lái)同步消息,于是把自己的LEO也更新成了1展蒂,下一輪同步中,follower來(lái)拉去位移是1的消息苔咪,
leader接收消息后锰悼,把遠(yuǎn)程副本的LEO更新為1,然后更新HW為1团赏,在更新LEO或者更新
遠(yuǎn)程副本的LEO之后箕般,leader會(huì)取這兩個(gè)的最小值更新為HW,然后把自己的HW值發(fā)給
follower舔清,follower接到消息后把自己的HW更新為1.通過(guò)這種機(jī)制實(shí)現(xiàn)了Leader和Follower
副本之間的同步
Leader epoch
由于follower的HW的更新丝里,需要一輪額外的消息拉取,如果folloer很多的話(huà)体谒,就需要多輪拉取杯聚,
Leader 副本高水位更新和 Follower 副本高水位更新在時(shí)間上是存在錯(cuò)配的,會(huì)導(dǎo)致數(shù)據(jù)的
不一致抒痒,所以L(fǎng)eader epoch登場(chǎng)幌绍。
Epoch,一個(gè)單調(diào)增加的版本號(hào)故响。每當(dāng)leader發(fā)生變更時(shí)傀广,都會(huì)增加該版本號(hào)。小版本號(hào)的?
Leader 被認(rèn)為是過(guò)期 Leader彩届,不能再行使 Leader 權(quán)力伪冰。
起始位移,Leader 副本在該 Epoch 值上寫(xiě)入的首條消息的位移
類(lèi)似于zookeper的leader機(jī)制樟蠕,通過(guò)leader epoch的單調(diào)遞增贮聂,以此避免副本宕機(jī)重啟
導(dǎo)致的消息同步錯(cuò)亂
由于leader和follwer的hw的同步是存在時(shí)間差的,由于broker的宕機(jī)重啟后寨辩,日志的同步
是以高水位為準(zhǔn)的寂汇,會(huì)導(dǎo)致消息的丟失,通過(guò)epoch機(jī)制的引入捣染,副本是否執(zhí)行日志截?cái)?/p>
不再依賴(lài)于高水位進(jìn)行判斷