深入剖析 kafka 可靠性是如果保證的?

2021-09-11 16:14:42 字數 2108 閱讀 9530

生產端可靠性配置

消費端可靠性

kafka 的複製機制和分割槽的多分布架構是kafka 可靠性保證的核心。把訊息寫入多個副本可以使kafka 在發生崩潰時仍能保證訊息的永續性。

kafka 的主題被分為多個分割槽,分割槽是基本的資料塊。分割槽儲存在單個磁碟上,kafka 可以保證分割槽裡的事件是有序的。每個分割槽可以有多個副本,其中乙個是首領。所有的事件都直接傳送給首領,或者直接從首領副本讀取。其他副本只需要與首領保持同步,並及時複製最新的事件。當首領副本不可用時,其中乙個同步副本將被選舉為新首領。

broker 有3個配置引數會影響kafka 訊息儲存的可靠性。

複製係數

分割槽副本的數量。主題級別的配置引數是replication.factor, broker 級別是default.replication.factor

預設值為3,具體設定為多少呢?這是可用性與硬體成本之間的權衡!

不完全的首領選舉

當分割槽首領不可用時,乙個跟隨者副本會被選舉為新首領。如果跟隨者副本不可用或者不同步,就會出現以下兩個選擇:

如果不同步的副本可以被選舉為新首領,那麼因為其不同步,它被選為首領後就會出現訊息不一致的問題。

如果不同步的副本不能被選舉為新首領,那麼分割槽在舊首領(最後乙個同步副本)恢復之前是不可用的,這就需要持續等待同步副本恢復到可用狀態,可能需要很長時間。

配置項unclean,leader.election.enable被設定true 就是選項1:允許不同步副本成為新首領,面臨丟失資料的風險;設定為false 就是選項2:不允許不同步副本成為新首領,犧牲一部分實時性。

最少同步副本

min.insync.replicas在主題級別和broker 級別都可設定。

根據kafka 可靠性保證的定義,訊息只有被寫入到所有同步副本之後才被認定為已提交的。假定有3個副本中的兩個副本已經崩潰了,那此時的」所有副本「就只表示乙個同步副本,那麼只要這個副本崩潰掉,資料就會丟失。

如果將配置項min.insync.replicas設定為2,表示至少要存在兩個同步副本才能向分割槽寫入資料。否則broker 會停止接收生產者的請求。

傳送確認

生產端acks 引數指定了必須有多少個分割槽副本收到訊息,生產者才會認為訊息寫入是成功的。該引數有如下選項:

生產者重試引數retries

生產者向broker 傳送訊息時, broker 可以返回乙個成功響應碼或錯誤響應碼。錯誤分為兩種,一種是可以通過重試解決的,還有一種是無法通過重試解決。

重試傳送乙個訊息也會帶來一些風險,如果兩次傳送都寫入成功,就會造成訊息重複的問題。重試和恰當的錯誤處理可以保證每個訊息「至少被儲存一次」,當前kafka 版本無法保證訊息「只被儲存一次」。實際場景的解決方案就是:往訊息裡加入唯一識別符號,用於檢測重複訊息,消費者再進行處理。

額外的錯誤處理

使用生產者內建的重試機制可以輕鬆的處理大部分錯誤,不過依然會有一些其他型別的錯誤重試處理不了,這時可以編寫額外的錯誤處理器。

只有已提交的訊息,也就是那些被寫入所有同步副本的訊息,才能被消費者獲取到,這就意味著消費者得到的訊息已經具備了一致性。消費者唯一要做的就是確認哪些訊息是已經讀取過的,哪些是還沒有讀取過的。

相關配置項

group.id如果兩個消費者具有相同的group.id,並且訂閱了同乙個主題,那麼每個消費者只會分到主題分割槽的乙個子集。

auto.offset.reset這個引數指定了在沒有偏移量可提交時或者請求的偏移量在broker 上不存在時,消費者會做什麼?這個引數有兩種配置,乙個是earliest表示消費者從分割槽的開始位置讀取資料,這樣會導致消費者讀取大量的重複資料;還有一種是latest表示消費者會從分割槽末尾開始讀取資料,這樣可能會錯過一些訊息。

enable.auto.commit可以讓消費者基於任務排程自動提交偏移量。自動提交的優點就是實現邏輯時變得簡單了。缺點是無法控制重複處理訊息(比如消費者在自動提交之前就停止了處理訊息)。

auto.commit.interval.ms這個引數與第三個引數有直接的關係。如果通過第三個引數選擇了自動提交,那可以通過該引數配置提交的頻度。

Kafka訊息可靠性

如果mq沒有類似資料庫事務結構和保證,是不可能達到訊息投遞100 可靠的,極端情況下訊息投遞要麼丟失或重複。下面咋們從producer,broker,consumer的角度分析一下kafka中會出現哪些情況。目前生產者傳送訊息 request.required.acks 有三種方式。acks 0 p...

kafka 九 Kafka訊息的可靠性

沒有乙個中介軟體能夠做到百分之百的完全可靠,可靠性更多的還是基於幾個9的衡量指標,比如4個9 5 個9.軟體系統的可靠性只能夠無限去接近100 但不可能達到100 所以kafka如何是實現最大可能的可靠性呢?你可以建立更多的分割槽來提公升可靠性,但是分割槽數過多也會帶來效能上的開銷,一般來說,3個副...

Kafka如何保證資料可靠性

kafka的資料可靠性保證 1.副本資料同步策略 兩種副本資料同步策略 kafka選擇第二種 方案優點 缺點半數以上完成同步,就傳送ack 延遲低選舉新的leader時,容忍n臺節點的故障,需要2n 1個副本 全部完成同步,才傳送ack 選舉新的leader時,容忍n臺節點的故障,需要n 1個副本 ...