kafka數據一致性

kafka作爲商業級中間件,它在設計時優先考慮的可靠性、可用性,同時兼顧一致性,這是所有分佈式都會遇到的cap理論,kafka也不例外;可靠性通過副本機制解決,可用性通過leader和follower機制來解決。

    kafka的可靠性,根據ack的設置不同,可靠性不同,ack=-1可靠性最高,但效率會稍微低一點。

acks=0:生產者不會等待任何來自服務器的響應,直接不斷髮送數據。
acks=1(默認值):只要集羣的Leader節點收到消息,生產者就會收到一個來自服務器的成功響應。
acks=-1:只有當所有參與複製的節點全部都收到消息時,生產者纔會收到一個來自服務器的成功響應。

  

  kafka的可用性,通過維護AR,ISR,OSR來確保當leader掛掉後,可以馬上從 ISR 列表中選擇第一個 follower 作爲新的 Leader。

    當kafka副本爲多副本時,副本是定期從leader同步數據,定期同步必然會導致leader和follower數據不一致的情況出現。爲了解決這種不一致,kafka引入了HW(高水位線),高水位線HW = ISR副本中最小LEO(副本的最大消息偏移量+1),如下圖1所示的HW=2,因爲follower2的消息還是1,所以這個時候消費者只能消費小於2的數據,那就是隻能消費1這條數據,這樣就能保證消費者所見一致性問題。

  由於HW總是要在下一次fetch rpc纔會更新,所以HW也有可能出現同步不及時的情況,導致數據丟失,所以這裏就又要提到leader epoch。

 leader epoch會記錄leader的生平,他的紀元值,比如圖2的leader沒有掛掉時,它會記錄(0,3),表示第0代leader,目前offset=3,當follower1當選爲leader後,此時epoch爲1,會跟上一個紀元的offset進行比對,以此判斷是否需要截取數據。如下圖三就不需要截取數據,從而保證數據一致性。

 圖3

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章