AR(Assigned Repllicas):分區(qū)中所有副本統(tǒng)稱
ISR(In-Sync Replicas):與leader副本保持一定程度同步的副本(包括Leader)
OSR(Out-Sync Relipcas):與leader滯后過(guò)多副本(不包括leader)ps:參數(shù)配置滯后范圍
AR=ISR+OSR。正常情況AR=ISR ,OSR空
LEO(LogEndOffse):下一條待寫(xiě)入消息offset,partition的log最后一條消息offset+1。
HW(HighWatermark):consumer能看到partition位置,partition對(duì)應(yīng)ISR中最小LEO為HW。
????HW為6.表示消費(fèi)者只能拉取到offset0至5之間的消息,而offset為6的消息對(duì)消費(fèi)者而言是不可見(jiàn)的(圖2)
LW(LowWatermark):“低水位”,AR中最小logStartOffset,副本拉取請(qǐng)求(FetchRequest,可能觸發(fā)新建日志分段而舊的被清理,導(dǎo)致logStartoffset增加)和刪除請(qǐng)求DeleteRecordRequest都可能促使LW增長(zhǎng)
概要:一、ISR 的伸縮性:定期檢查是否伸縮、緩存
? ? ? ? ? ?二、何時(shí)擴(kuò)充ISR:1)follower追趕上,2)hw保證一致性
? ? ? ? ? ?三、同步過(guò)程:寫(xiě)leader,再同步
? ?????????四、LSO(LastStableOffset)與kafka的事物有關(guān):讀提交,讀未提交
一、ISR 的伸縮性
1)Leader跟蹤維護(hù)ISR中follower滯后狀態(tài),落后太多或失效時(shí),leade把他們從ISR剔除。2)OSR中follower“追上”Leader,在ISR中才有資格選舉leader
Kafka啟動(dòng)開(kāi)啟ISR相關(guān)定時(shí)任務(wù)“isr-expiration"和”isr-change-propagation"
1、isr-expiration:周期性檢測(cè) 分區(qū)是否縮減ISR。
? ? 1)“replica.lag.time.max.ms”設(shè)置周期,大小是這個(gè)參數(shù)一半,默認(rèn)5000ms,
? ? 2)檢測(cè)到ISR有失效副本時(shí),縮減ISR集合,記錄到zk對(duì)應(yīng)/brokers/topics//partition//state節(jié)點(diǎn)如下:
????{“controller_cpoch":26,“l(fā)eader”:0,“version”:1,“l(fā)eader_epoch”:2,“isr”:{0,1}}
???? 其中controller_epoch:kafka控制器epoch.leader,前分區(qū)leader所在broker的id,version版本號(hào)(當(dāng)前半本固定位1),leader_epoch當(dāng)前分區(qū)leader紀(jì)元,變更后isr列表
2、isr-change-propagation:周期性(固定2500ms)檢查isrChangeSet(記錄變更后緩存)
? ? 1)發(fā)現(xiàn)變更,在zk的/isr_change_notification創(chuàng)建isr_change開(kāi)頭持久順序節(jié)點(diǎn)存isrChangeSet信息:如/isr_change_notification/isr_change_0000000000 ,?
? ? 2)kafka控制器為/isr_change_notification添加Watcher,子節(jié)點(diǎn)變化觸發(fā)Watcher,通知控制器和管理broker節(jié)點(diǎn)更新元數(shù)據(jù),刪除/isr_change_notification下已處理節(jié)點(diǎn)。
? ? 3)避免頻繁觸發(fā)Watcher影響控制器、zk、broker性能,檢查:上次ISR變化超過(guò)5秒,上次寫(xiě)zk超過(guò)60秒。
二、何時(shí)擴(kuò)充ISR
1、不斷同步,follower的LEO后移,追趕上leader判定準(zhǔn)側(cè)是follower的LEO是否小于leader副本HW
2、ISR擴(kuò)充同樣更新zk中的/broker/topics//partition//state節(jié)點(diǎn)和isrChangeSet,之后和收縮時(shí)相同。ISR增減時(shí),或LEO變時(shí),影響整個(gè)分區(qū)HW。
????如leader的LEO為9,follower的LEO為7,follower2的LEO為6,判定都處于ISR中,分區(qū)HW為6,如follower2被剝離ISR,HW為leader和follower中LEO最小值為7(木桶原理)
3、HW保證一致性
Leader掛了,在新Leader可讀HW,即對(duì)外可見(jiàn)最大offset,HW=max(replica.offset)
例:新msg,等ISR中replica同步后,更新HW,才消費(fèi),保證如Leader fail,仍可從新Leader中獲?。ㄅ渲醚舆t時(shí)間replica.lag.time.max.ms)
ps:內(nèi)部Broker讀,沒(méi)HW限制。Folloer.HW = min(Leader.HW, Follower.offset)


三、同步過(guò)程
ISR中一個(gè)leader和兩個(gè)follower副本,LEO和HW都為3。消息3和4從生產(chǎn)者發(fā)出后先存leader
follower1完全leader而follower2只同步消息3,leader、follower1的LEO為5,F(xiàn)ollower2的LEO為4。HW最小值4,可以消費(fèi)offset為0-3消息;所有都成功寫(xiě)入3、4,HW和LEO為5,可消費(fèi)offset為4消息。

四、LSO(LastStableOffset)與kafka的事物有關(guān)
配置消費(fèi)者事務(wù)隔離級(jí)別:消費(fèi)端參數(shù)——isolation.level(字符串類型)
1、設(shè)置消費(fèi)到位置
1)“read_committed",消費(fèi)會(huì)忽略事務(wù)未提交,只能消費(fèi)到LSO(LastStableOffset)位置
2)默認(rèn)”read_uncommitted",可消費(fèi)HW(High Watermak)位置。
????ps:follower事務(wù)隔離級(jí)別也“read_uncommitted",且不可改
例:開(kāi)啟kafka事務(wù)時(shí),生產(chǎn)者發(fā)消息1、2到broker,如沒(méi)有提交事務(wù),isolation.level=read_committed的消費(fèi)者看不到消息,而isolation.level=read_uncommitted可到。事務(wù)中第一條消息位置標(biāo)記為firstUnstableOffset
2、LSO還影響kafka消費(fèi)后量
就是kafka,Log,也稱kafka堆積量計(jì)算。
1)普通情況:Lag = HW-ConsumerOffset
2)引入了事務(wù):read_uncommitted不受影響,read_committed引入LSO計(jì)算:
? ? ? ? 未完成事務(wù),LSO=事務(wù)第一條消息位置(firstUnstableOffset)
? ? ? ? 已經(jīng)完成=HW,
結(jié)論:LSO≤HW≤LEO
未完成read_committed,Lag=LSO-ComsumerOffset



https://blog.csdn.net/weixin_43975220/article/details/93190906
https://blog.csdn.net/qq_41568597/article/details/82501738