當前位置:網站首頁>leader epoch
leader epoch
2022-01-27 14:11:59 【程序猿進階】
leader epoch 代錶 Leader 的紀元信息(epoch),初始值為0。每當 Leader 變更一次,leader epoch 的值就會加1,相當於為 Leader 增設了一個版本號。每個副本中還會增設一個矢量 <LeaderEpoch >= StartOffset>,其中 StartOffset 錶示當前 LeaderEpoch 下寫入的第一條消息的偏移量。
假設有兩個節點A 和 B,B是 leader節點,裏面的數據如圖:
A發生重啟之後,A不是先忙著截斷日志而是先發送 OffsetsForLeaderEpochRequest請求給B,B作為目前的 Leader在收到請求之後會返回當前的 LEO(LogEndOffset,注意圖中 LE0和 LEO的不同),與請求對應的響應為OffsetsForLeaderEpochResponse。如果 A 中的 LeaderEpoch(假設為 LE_A)和 B 中的不相同,那麼 B 此時會查找 LeaderEpoch 為 LE_A+1 對應的 StartOffset 並返回給 A
如上圖所示,A 在收到2之後發現和目前的 LEO 相同,也就不需要截斷日志了,以此來保護數據的完整性。
再如,之後 B 發生了宕機,A 成為新的 leader,那麼對應的 LE=0 也變成了 LE=1,對應的消息 m2 此時就得到了保留。後續的消息都可以以 LE1 為 LeaderEpoch 陸續追加到 A 中。這個時候A就會有兩個LE,第二 LE所記錄的 Offset從2開始。如果B恢複了,那麼就會從 A中獲取到 LE+1的 Offset為 2的值返回給B。
再來看看 LE如何解决數據不一致的問題:當前 A 為 Leader,B 為 Follower,A 中有2條消息 m1 和 m2,而 B 中有1條消息 m1。假設 A 和 B 同時“掛掉”,然後 B 第一個恢複過來並成為新的 leader。
之後 B 寫入消息 m3,並將 LEO 和 HW 更新至2,如下圖所示。注意此時的 LeaderEpoch 已經從 LE0 增至 LE1 了。
緊接著 A 也恢複過來成為 Follower 並向 B 發送 OffsetsForLeaderEpochRequest 請求,此時 A 的 LeaderEpoch 為 LE0。B 根據 LE0 查詢到對應的 offset 為1並返回給 A,A 就截斷日志並删除了消息 m2,如下圖所示。之後 A 發送 FetchRequest 至 B 請求來同步數據,最終A和B中都有兩條消息 m1 和 m3,HW 和 LEO都為2,並且 LeaderEpoch 都為 LE1,如此便解决了數據不一致的問題。
版權聲明
本文為[程序猿進階]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201271411589935.html
邊欄推薦
猜你喜歡
隨機推薦
- uniapp上傳圖片及組件傳值
- 瑞利年金險資金保障安全嗎?收益高不高啊?
- 華為手機USB連不上電腦的解决方法
- Flutter 2,移動金融應用開發
- 關於st25系列NFC標簽簡單介紹及st25TV系列用於門禁讀取時的注意事項總結
- 關於用ffmpeg轉手機視頻發現視頻長寬倒了的問題
- 函數 / 類模板--模板2
- 數組中的第k個最大的元素--優先級隊列、排序、堆、排序
- 單片機實例27——ADC0809A/D轉換器基本應用技術(硬件電路圖+匯編程序+C語言程序)
- Collection集合的學習
- 一場面試結束,某度員工從事Android 5年為何還是初級工程師?
- 3本書閱讀筆記【人月神話-Go語言實戰-研發能力持續成長路線】01
- PHP垃圾回收機制
- 【電子技術】什麼是LFSR?
- 死鎖?如何定比特到死鎖?如何修複死鎖?(jps和jstack兩個工具)
- 快樂寒假 22/01/20
- image
- 噴程序員?SURE?
- LDO分壓電阻計算小工具
- 面試之求一串字符串中每個字符的出現次數
- 【ISO15765_UDS&OBD診斷】-01-概述
- 【Mysql上分之路】第九篇:Mysql存儲引擎
- RHCE 第一次作業
- 2021.10.16我的第一篇博客:一切皆有可能!
- CTA-敏感行為-讀取IMEI
- 面試被問怎麼排查平時遇到的系統CPU飆高和頻繁GC,該怎麼回答?
- nuxt項目總結-綜合
- 自然語言處理學習筆記(一)
- C語言第一課
- 各比特大佬,Spark的重點難點系列暫時更新完畢
- 基於 esbuild 的 universal bundler 設計
- XCTFre逆向(四):insanity
- 理解什麼是真正的並發數
- JVM腦圖
- 【Pytorch(四)】學習如何使用 PyTorch 讀取並處理數據集
- 函數棧幀的創建與銷毀
- 構建神經網絡- 手寫字體識別案例
- 多模態生成模型ERNIE-VILG
- kotlin不容忽視的小細節
- 備戰一年,終於斬獲騰訊T3,我堅信成功是可以複制的