上文我們已經(jīng)學(xué)到,
- 一個(gè)Topic(主題)會(huì)有多個(gè)Partition(分區(qū))
- 為了保證高可用,每個(gè)分區(qū)有多個(gè)Replication(副本)
- 副本分為L(zhǎng)eader 和 Follower 兩個(gè)角色,Leader副本對(duì)外提供讀寫服務(wù),F(xiàn)ollower 從Leader同步數(shù)據(jù)
- 當(dāng)Leader副本掛掉,從ISR中選舉一個(gè)Follower副本成為新的Leader對(duì)外繼續(xù)提供服務(wù)
- 那么就要保證分區(qū)各副本間數(shù)據(jù)一致性
圖1:
見上圖,先來(lái)熟悉一下
- 已提交,Leader副本已經(jīng)被ISR中所有Follower 都同步的消息
- 未提交,Leader已經(jīng)寫入,還沒有被Follower同步的消息
- 對(duì)Consumer(消費(fèi)者)而言,已提交的消息都可以拿到
- Leader 和 Follower副本上都有HW 和 LEO
- Leader副本除了自己的LEO,還存Follower的LEO(Remote LEO)
HW (High WaterMarker) 高水位
圖2:
高水位可以理解為一個(gè)橫切面
,存儲(chǔ)的也是Offset
(位移)值,
拉齊分區(qū)ISR所有副本已經(jīng)寫入的消息,保證HW前的消息你有我有全都有啊,水桶原理
這里要注意,所有副本指的是ISR列表中的同步副本,OSR中同步慢的副本不管
為啥只管ISR列表,不管OSR列表中的副本呢?
這也就是為啥要搞HW 和 LEO 的原因,搞HW就是為了當(dāng)Leader宕機(jī)了,會(huì)從ISR列表中選舉一個(gè)Follower成為新的Leader繼續(xù)對(duì)外提供服務(wù),來(lái)實(shí)現(xiàn)高可用,而HW能保證任意一個(gè)Follower都包含對(duì)消費(fèi)者可見的所有數(shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)的可靠性
而OSR是同步過慢的副本,選舉也不選它,所以記錄HW值也沒必要管OSR列表
LEO (Log End Offset) 日志末端位移
就是下一個(gè)消息要寫入的Offset
(位移),
如上圖1,當(dāng)前副本最后一條消息的位移是13,下一個(gè)消息寫入14位置,該副本的LEO值就是14
Follower 副本何時(shí)更新LEO呢?
以圖2 中為例:
Leader 的LEO = 14
Follower1 的 LEO = 12
Follower2 的 LEO = 8
- 對(duì)于Leader副本來(lái)說(shuō),每次寫入消息,都會(huì)更新LEO的值
- Follower 副本不停地向Leader副本發(fā)送
Fetch
請(qǐng)求,一旦獲取數(shù)據(jù)后就寫入log
(日志)文件中進(jìn)行備份,同時(shí)更新LEO值 - 其實(shí)Follower跟Leader一樣,寫入數(shù)據(jù)后就更新自己的LEO值
那么Leader 端的Follower的LEO 什么時(shí)候更新呢?
- 當(dāng)Leader接收到Follower發(fā)起的Fetch請(qǐng)求
- 先從Log文件中讀取數(shù)據(jù)
- 先更新Leader中存儲(chǔ)的Follower的LEO
- 再將數(shù)據(jù)返回給Follower
- 這里會(huì)不會(huì)存在Leader更新了Follower的LEO,但是Follower實(shí)際并沒有收到返回的消息,而造成Follower 所在broker 和 Leader所在broker存的LEO值不一致呢?
Follower 何時(shí)更新HW呢?
以圖2 中為例:
Leader 、Follower1 、 Follower2 的 HW = 7
- Follower寫入數(shù)據(jù)后,會(huì)更新自己的LEO值,然后就嘗試更新自己的HW值
-
Follower的HW值是怎么算的呢?
- 是根據(jù)自己當(dāng)前LEO值與Leader返回的HW值比較,去較小值作為HW更新
- 這很好理解,Leader中記錄的HW是所有副本HW最小的值,也就是同步最慢的那個(gè)副本的LEO,每個(gè)副本都需要知道這個(gè)事,自己不是最小那就記別人的值
Leader 何時(shí)更新HW呢?
- Leader中存儲(chǔ)的HW就是整個(gè)分區(qū)的HW,直接影響消息對(duì)消費(fèi)者的可見性
- Leader更新HW有4中情況
- Leader接收生產(chǎn)者發(fā)送過來(lái)的消息,寫入文件后,檢查是否需要更新HW
- Follower副本選舉成為新的Leader是,Kafka會(huì)嘗試去更新分區(qū)HW
- Broker崩潰,導(dǎo)致副本被踢出ISR,Kafka會(huì)檢查分區(qū)HW是否有被更新的必要
- Leader處理Follower的Fetch請(qǐng)求是,先從Log讀取數(shù)據(jù),然后嘗試跟新HW值
- 正常情況下就是2種: leader處理producer請(qǐng)求,leader處理follower的fetch請(qǐng)求
Leader 的HW值是怎么算的呢?
- 先選出所有滿足條件的副本,ISR同步副本
- 比較它們的LEO(包括leader的LEO)
- 選擇
最小的LEO值作為HW
感覺有點(diǎn)迷糊? 我們?cè)賮?lái)一篇舉個(gè)栗子,掰BoBo說(shuō)陷一下子,跟住奧~文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-692514.html
** 都說(shuō)kafka最厲害的地方是他的設(shè)計(jì)思想,果然有很多精妙之處啊**文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-692514.html
到了這里,關(guān)于Kafka 入門到起飛 - 什么是 HW 和 LEO?何時(shí)更新HW和LEO呢?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!