天天看點

kafka原了解析之-消息可靠性保障

本文讨論的是假設存在完美無缺的producer和consumer, 從broker角度保障資料可靠的機制。

一、名詞介紹

  • ISR(In-sync Replication):所有與leader副本保持一定程度同步的副本(包括Leader),是kafka動态維護的一組同步副本,每當leader挂掉時,在ISR集合中選舉出一個follower作為leader提供服務,當ISR中的副本被認為壞掉的時候,會被踢出ISR,當重新跟上leader的消息資料時,重新進入ISR。ISR中的節點必須滿足:

    a、節點必須可以維護和 ZooKeeper 的連接配接,Zookeeper 通過心跳機制檢查每個節點的連接配接。

    b、如果節點是個 follower ,它必須能及時的同步 leader 的寫操作,并且延時不能太久。

  • OSR(Out-sync Replication):與leader副本同步滞後過多的副本(不包括leader)。
  • LEO(LogEndOffset):分區的最新的資料的offset,下一條将要被加入到日志的消息的位移。當資料寫入leader後,LEO就立即執行該最新資料。相當于最新資料辨別位。注意,這個offset未必在硬碟中,可能目前隻在記憶體中還沒有被flush到硬碟。
  • LSO(logStartOffset):日志段集合中第一個日志段(segment)的基礎位移,也就是這個日志對象的基礎位移
  • HW(HighWatermark ):隻有寫入的資料被同步到所有的ISR中的副本後,資料才認為已送出,HW更新到該位置,HW之前的資料才可以被消費者通路,保證沒有同步完成的資料不會被消費者通路到。相當于所有副本同步資料辨別位。
  • AR(Assigned Repllicas):分區中的所有副本,ISR+OSR

二、LEO、HW、ISR之間的關系

當ISR集合發生增減 或者ISR集合中任一副本LEO發生變化時,都會影響整個分區的HW。

kafka原了解析之-消息可靠性保障

如上圖所示:leader的LEO為9,follower的LEO為7,而follower2的LEO為6,若判定這三個副本都處于ISR集合中,那麼分區的HW為6;若follower3被判定失效被剝離出ISR集合,那麼此時分區HW為leader和follower中LEO的最小值,即為7.

三、log目錄下各個checkpoint檔案作用說明:

  • __consumer_offsets: 用于存儲offset的分區是由kafka伺服器預設自動建立的
  • cleaner-offset-checkpoint: 存了每個log的最後清理offset.
  • log-start-offset-checkpoint: 日志可以傳回給Client的最開始邊界,對應LSO.
  • recovery-point-offset-checkpoint:負責記錄已經被刷寫入磁盤的offset,recoveryPoint以下的資料都是已經刷到磁盤上的了。
  • replication-offset-checkpoint:用來存儲每個replication的HW,表示已經被commited的message,HW以下的資料都是各個replication間同步的,一緻的.

五、Partition recovery:

每個Partition會在磁盤記錄一個RecoveryPoint(記錄在recovery-point-offset-checkpoint中), 記錄已經flush到磁盤的最大offset。

1、recovery過程

  • broker fail 重新開機時,會進行loadLogs。 首先會讀取該Partition的RecoveryPoint,找到包RecoveryPoint的segment及以後的segment, 這些segment就是可能沒有完全flush到磁盤segments。然後調用segment的recover(如有其它topic副本則讀取,若無,有可能丢失資料),重新讀取各個segment的msg,并重建索引。

2、segment的優點:

  • 以segment為機關管理Partition資料,友善資料生命周期的管理,删除過期資料簡單
  • 在程式崩潰重新開機時,加快recovery速度,隻需恢複未完全flush到磁盤的segment

    分多個Segment,每個index檔案很小,查找速度更快。

六、Partition同步:

  • Partition的多個replica中一個為Leader,其餘為follower
  • Producer隻與Leader互動,把資料寫入到Leader中
  • Followers從Leader中拉取資料進行資料同步
  • Consumer隻從Leader拉取資料

七、Leader選舉:

  • 基于Controller的Leader Election

    整個叢集中選舉出一個Broker作為Controller

    Controller為所有Topic的所有Partition指定Leader及Follower

  • 優點

    極大緩解Herd Effect問題

    減輕Zookeeper負載

    Controller與Leader及Follower間通過RPC通信,高效且實時

  • 缺點

    引入Controller增加了複雜度

    需要考慮Controller的Failover

總結:1、kafka利用zookeeper去選舉出controller;2、kafka通過controller選指定出leader和follower,而無需通過zookeeper了。

八、資料可靠性

1、producer角度

當Producer向Leader發送資料時,可以通過acks參數設定資料可靠性的級别:

  • 0: 不等待broker傳回确認消息.
  • 1: leader儲存成功傳回,此種情況如果Leader fail,會丢失資料
  • -1(all): 所有備份(ISR)都儲存成功傳回, 僅設定acks=-1也不能保證資料不丢失,當Isr清單中隻有Leader時,同樣有可能造成資料丢失。要保證資料不丢除了設定acks=-1, 還要保 證ISR的大小大于等于2

request.required.acks:設定為-1 等待所有ISR清單中的Replica接收到消息後才算寫成功;

min.insync.replicas: 設定為大于等于2,保證ISR中至少有兩個Replica

Producer要在吞吐率和資料可靠性之間做一個權衡

2、consumer角度(資料一緻性)

若某條消息對Consumer可見,那麼即使Leader當機了,在新Leader上資料依然可以被讀到

  • HighWaterMark簡稱HW: Partition的高水位,取一個partition對應的ISR中最小的LEO作為HW,消費者最多隻能消費到HW所在的位置,另外每個replica都有highWatermark,leader和follower各自負責更新自己的highWatermark狀态,highWatermark <= leader. LogEndOffset
  • 對于Leader新寫入的msg,Consumer不能立刻消費,Leader會等待該消息被所有ISR中的replica同步後,更新HW,此時該消息才能被Consumer消費,即Consumer最多隻能消費到HW位置,這樣就保證了如果Leader Broker失效,該消息仍然可以從新選舉的Leader中擷取。對于來自内部Broker的讀取請求,沒有HW的限制。同時,Follower也會維護一份自己的HW,Folloer.HW = min(Leader.HW, Follower.offset)