Kafka資料可靠性與一致性解析

2021-08-04 23:08:39 字數 1773 閱讀 2572

每個partition會在磁碟記錄乙個recoverypoint,記錄已經flush到磁碟的最大offset。當broker fail 重啟時,會進行loadlogs。首先會讀取該partition的recoverypoint,找到包含recoverypoint的segment及以後的segment,這些segment就是可能沒有完全flush到磁碟segments。然後呼叫segment的recover,重新讀取各個segment的msg,並重建索引。

優點:1.以segment為單位管理partition資料,方便資料生命週期的管理,刪除過期資料簡單。

2.在程式崩潰重啟時,加快recovery速度,只需恢復未完全flush到磁碟的segment。

3.通過index中offset與物理偏移對映,用二分查詢能快速定位msg,並且通過分多個segment,每個index檔案很小,查詢速度更快。

1.partition的多個replica中乙個為leader,其餘為follower

2.producer只與leader互動,把資料寫入到leader中

3.followers從leader中拉取資料進行資料同步

4.consumer只從leader拉取資料

isr:所有不落後的replica集合,不落後有兩層含義:距離上次fetchrequest的時間不大於某乙個值或落後的訊息數不大於某乙個值,leader失敗後會從isr中選取乙個follower做leader。

當producer向leader傳送資料時,可以通過acks引數設定資料可靠性的級別:

0: 不論寫入是否成功,server不需要給producer傳送response,如果發生異常,server會終止連線,觸發producer更新meta資料;

1: leader寫入成功後即傳送response,此種情況如果leader fail,會丟失資料;

-1: 等待所有isr接收到訊息後再給producer傳送response,這是最強保證。

僅設定acks=-1也不能保證資料不丟失,當isr列表中只有leader時,同樣有可能造成資料丟失。要保證資料不丟除了設定acks=-1,還要保證isr的大小大於等於2,具體引數設定:request.required.acks:設定為-1,等待所有isr列表中的replica接收到訊息後採算寫成功;min.insync.replicas:設定為大於等於2,保證isr中至少有兩個replica。 

producer要在吞吐率和資料可靠性之間做乙個權衡。

一致性定義:若某條訊息對consumer可見,那麼即使leader宕機了,在新leader上資料依然可以被讀到。

1. highwatermark簡稱hw: partition的高水位,取乙個partition對應的isr中最小的leo作為hw,消費者最多只能消費到hw所在的位置,另外每個replica都有highwatermark,leader和follower各自負責更新自己的highwatermark狀態,highwatermark <= leader. logendoffset。

2. 對於leader新寫入的msg,consumer不能立刻消費,leader會等待該訊息被所有isr中的replica同步後,更新hw,此時該訊息才能被consumer消費,即consumer最多只能消費到hw位置。

這樣就保證了如果leader broker失效,該訊息仍然可以從新選舉的leader中獲取。對於來自內部broker的讀取請求,沒有hw的限制。同時,follower也會維護乙份自己的hw,folloer.hw = min(leader.hw, follower.offset)。

Kafka資料可靠性與一致性解析

每個partition會在磁碟記錄乙個recoverypoint,記錄已經flush到磁碟的最大offset。當broker fail 重啟時,會進行loadlogs。首先會讀取該partition的recoverypoint,找到包含recoverypoint的segment及以後的segment...

Kafka資料可靠性與一致性解析

每個partition會在磁碟記錄乙個recoverypoint,記錄已經flush到磁碟的最大offset。當broker fail 重啟時,會進行loadlogs。首先會讀取該partition的recoverypoint,找到包含recoverypoint的segment及以後的segment...

Kafka資料可靠性與一致性解析

每個partition會在磁碟記錄乙個recoverypoint,記錄已經flush到磁碟的最大offset。當broker fail 重啟時,會進行loadlogs。首先會讀取該partition的recoverypoint,找到包含recoverypoint的segment及以後的segment...