高水位的作用主要是:
高水位和 leo 是副本物件的兩個重要屬性。kafka 所有副本都有對應的高水位和 leo 值,而不僅僅是 leader 副本。只不過 leader 副本比較特殊,kafka 使用 leader 副本的高水位來定義所在分割槽的高水位。換句話說,分割槽的高水位就是其 leader 副本的高水位
同乙個副本物件,其高水位值不會大於 leo 值
hw 並不是 kafka 特有的概念,hw 通常被用在流式處理領域(比如 apache flink、apache spark 等),以表徵元素或事件在時間層面上的進度。在 kafka 中,對於 leader 新寫入的訊息,leader 會等待該訊息被 isr 中所有的 replicas 同步後再更新 hw,之後該訊息才能被提交從而被 consumer 消費。
這種機制有乙個好處,確保 hw 及其之前的訊息(committed 狀態)都是已備份的,即便 leader 所在的 broker 因故障下線,那麼 committed 狀態的訊息仍然可以從新選舉出的 leader 中獲取
kafka副本之間的資料複製既不是完全的同步複製,也不是單純的非同步複製,這個在前面部落格中已經解釋過。
broker 0 上儲存了某分割槽的 leader 副本和所有 follower 副本的 leo 值,而 broker 1 上僅僅儲存了該分割槽的某個 follower 副本
遠端副本的作用:幫助 leader 副本確定其高水位,也就是分割槽高水位
上圖演示了生產者寫入資料到kafka的leader副本,然後同步到follower副本的流程
副本同步機制流程:
生產者寫入訊息到leader副本
leader副本leo值更新
follower副本嘗試拉取訊息,發現有訊息可以拉取,更新自身leo
follower副本繼續嘗試拉取訊息,這時會更新remote副本leo,同時會更新leader副本的hw
完成4步驟後,leader副本會將已更新過的hw傳送給所有follower副本
follower副本接收leader副本hw,更新自身的hw
下面舉例詳細說明下:
初始值都為0
生產者寫入1條訊息leader的leo更新為1,follower拉取寫入的訊息,發現存在訊息,更新自身leo為1
follower繼續從leader拉取訊息,這會更新remote的leo為1,比較remote的leo和leader的leo,它們都是1,故更新leader的hw為1
完成上一步後,leader會將自身的hw傳送給follower,follower會將該值和自身的leo進行比較,由於這兩個值都是1,所以更新follower的hw為1,至此完成副本資料同步
由於follower 副本的高水位更新需要一輪額外的拉取請求才能實現,leader 副本高水位更新和 follower 副本高水位更新在時間上是存在錯配的,所以可能存在資料丟失。
在broker 端引數 min.insync.replicas 設定為 1的情況下,leader的hw已更新,但是為同步到follower,此時leader宕機,會選舉follower副本為leader,但是剛剛的資料沒有同步過來,且生產者會認為資料寫入成功,也不會重發,leader就算恢復也會執行日誌截斷,資料就丟失了。leader epoch 機制來規避這種資料丟失。
在leader宕機後,只能從isr列表中選取新的leader,而isr中的follower副本hw之前的資料都是已提交的
選出了新的leader,而新的leader並不能保證已經完全同步了之前leader的所有資料,只能保證hw之前的資料是同步過的,此時所有的follower都要將資料截斷到hw的位置,再和新的leader同步資料,來保證資料一致。
當宕機的leader恢復,發現新的leader中的資料和自己持有的資料不一致,此時宕機的leader會將自己的資料截斷到宕機之前的hw位置,然後同步新leader的資料。宕機的leader活過來也像follower一樣同步資料,來保證資料的一致性
Kafka學習筆記 Kafka環境搭建
1.將kafka的tar包上傳到測試環境,解壓到 opt software,配置環境變數 kafka home opt software kafka 2.11 1.1.0 path kafka home bin scala home bin path export kafka home export...
學習筆記 Kafka
kafka kafka把資料往磁碟上寫,但是在磁碟上存它的讀寫速度比記憶體快,這個依賴於預讀和後寫功能,但是這個預讀和後寫必須是按照順序的方式,若沒有順序的方式優化的話,不存在什麼預讀和後寫。特點 訊息持久化 能落到磁碟 通過o 1 的磁碟資料結構提供資料的持久化 高吞吐量 分布式 擴充套件能力強 ...
Kafka學習筆記
1.1簡介 apache kafka 是分布式發布 訂閱訊息系統 訊息中介軟體 它最初由 linkedin 公司開發,之後成為 apache 專案的一部分。kafka 是一種快速 可擴充套件的 設計內在就是分布式的,分割槽的和可複製的提交日誌服務。apache kafka 與傳統訊息系統相比,有以下...