Kafka生產者分區策略和數據可靠性保證

分區策略

  • 分區原因:
    1. 方便集羣擴展,每個Partition可以通過調整大小以適應它所在的機器,而一個 topic又可以由多個 Partition組成,因此整個集羣就可以適應任意大小的數據。
    2. 可以提高併發,分區之後就可以以Partition爲單位讀寫。
  • 分區原則:我們需要將 producer 發送的數據封裝成一個 ProducerRecord 對象。
    1. 指明 partition 的情況下,直接將指明的值直接作爲partiton值;
    2. 沒有指明partition值但有key的情況下,將key的hash值與topic的partition數進行取餘得到partition值;
    3. 既沒有partition值又沒有key值的情況下,第一次調用時隨機生成一個整數(後面每次調用在這個整數上自增),將這個值與topic可用的partition總數取餘得到partition值,也就是常說的round-robin算法。
      在這裏插入圖片描述

數據可靠性保證

在這裏插入圖片描述
爲保證 producer 發送的數據,能可靠的發送到指定的 topic,topic 的每個 partition 收到 producer 發送的數據後,都需要向 producer 發送 ack(acknowledgement 確認收到),如果 producer 收到 ack,就會進行下一輪的發送,否則重新發送數據。

副本數據同步策略

方案 優點 缺點
半數以上完成同步,就發 送 ack 延遲低 選舉新的 leader 時,容忍 n 臺節點的故障,需要 2n+1 個副 本
全部完成同步,才發送ack 選舉新的leader時,容忍n臺節點的故障,需要n+1個副 本 延遲高
  • Kafka的同步策略爲第二種方案,原因爲:
    1. 同樣爲了容忍 n 臺節點的故障,第一種方案需要 2n+1 個副本,而第二種方案只需要 n+1個副本,而 Kafka 的每個分區都有大量的數據,第一種方案會造成大量數據的冗餘。
    2. 雖然第二種方案的網絡延遲會比較高,但網絡延遲對 Kafka 的影響較小。

ISR(in-sync replica set)

  • 問題:
    採用第二種方案之後,設想以下情景:leader 收到數據,所有 follower 都開始同步數據, 但有一個 follower,因爲某種故障,遲遲不能與 leader 進行同步,那 leader 就要一直等下去, 直到它完成同步,才能發送 ack。這個問題怎麼解決呢?
  • 解決方案:
    Leader 維護了一個動態的 in-sync replica set (ISR),表示和leader保持同步的 follower 集合。當 ISR 中的 follower 完成數據的同步之後,leader 就會給 follower 發送 ack。如果 follower 長時間未向 leader 同步數據,則該 follower 將被踢出 ISR,該時間閾值由replica.lag.time.max.ms 參數設定。Leader 發生故障之後,就會從 ISR 中選舉新的 leader。

ack應答機制

對於某些不太重要的數據,對數據的可靠性要求不是很高,能夠容忍數據的少量丟失, 所以沒必要等 ISR 中的 follower 全部接收成功。所以 Kafka 爲用戶提供了三種可靠性級別,用戶根據對可靠性和延遲的要求進行權衡, 選擇以下的配置。

ack參數配置
  • 0:producer 不等待 broker 的 ack,這一操作提供了一個最低的延遲,broker 一接收到還 沒有寫入磁盤就已經返回,當 broker 故障時有可能丟失數據;
  • 1:producer 等待 broker 的 ack,partition 的 leader 落盤成功後返回 ack,如果在 follower 同步成功之前 leader 故障,那麼將會丟失數據;
    在這裏插入圖片描述
  • -1(all):producer 等待 broker 的 ack,partition 的 leader 和 follower 全部落盤成功後才 返回 ack。但是如果在 follower 同步完成後,broker 發送 ack 之前,leader 發生故障,那麼會 造成數據重複。
    在這裏插入圖片描述

故障處理

在這裏插入圖片描述

  • LEO:指的是每個副本最大的 offset。
  • HW:指的是消費者能見到的最大的 offset,ISR 隊列中最小的 LEO。
follower發生故障

follower 發生故障後會被臨時踢出 ISR,待該 follower 恢復後,follower 會讀取本地磁盤 記錄的上次的 HW,並將 log 文件高於 HW 的部分截取掉,從 HW 開始向 leader 進行同步。 等該 follower 的 LEO 大於等於該 Partition 的 HW,即 follower 追上 leader 之後,就可以重 新加入 ISR 了。

leader發生故障

leader 發生故障之後,會從 ISR 中選出一個新的 leader,之後,爲保證多個副本之間的數據一致性,其餘的 follower 會先將各自的 log 文件高於 HW 的部分截掉,然後從新的 leader 同步數據。

注意:這隻能保證副本之間的數據一致性,並不能保證數據不丟失或者不重複。


發佈了117 篇原創文章 · 獲贊 192 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章