kafka資料丟失問題

2021-09-26 06:14:29 字數 1306 閱讀 4108

1)消費端弄丟了資料

唯一可能導致消費者弄丟資料的情況,就是說,你那個消費到了這個訊息,然後消費者那邊自動提交了offset,讓kafka以為你已經消費好了這個訊息,其實你剛準備處理這個訊息,你還沒處理,你自己就掛了,此時這條訊息就丟咯。

這不是一樣麼,大家都知道kafka會自動提交offset,那麼只要關閉自動提交offset,在處理完之後自己手動提交offset,就可以保證資料不會丟。但是此時確實還是會重複消費,比如你剛處理完,還沒提交offset,結果自己掛了,此時肯定會重複消費一次,自己保證冪等性就好了。

生產環境碰到的乙個問題,就是說我們的kafka消費者消費到了資料之後是寫到乙個記憶體的queue裡先緩衝一下,結果有的時候,你剛把訊息寫入記憶體queue,然後消費者會自動提交offset。

然後此時我們重啟了系統,就會導致記憶體queue裡還沒來得及處理的資料就丟失了

2)kafka弄丟了資料

這塊比較常見的乙個場景,就是kafka某個broker宕機,然後重新選舉partiton的leader時。大家想想,要是此時其他的follower剛好還有些資料沒有同步,結果此時leader掛了,然後選舉某個follower成leader之後,他不就少了一些資料?這就丟了一些資料啊。

生產環境也遇到過,我們也是,之前kafka的leader機器宕機了,將follower切換為leader之後,就會發現說這個資料就丟了

所以此時一般是要求起碼設定如下4個引數:

給這個topic設定replication.factor引數:這個值必須大於1,要求每個partition必須有至少2個副本

在kafka服務端設定min.insync.replicas引數:這個值必須大於1,這個是要求乙個leader至少感知到有至少乙個follower還跟自己保持聯絡,沒掉隊,這樣才能確保leader掛了還有乙個follower吧

在producer端設定acks=all:這個是要求每條資料,必須是寫入所有replica之後,才能認為是寫成功了

在producer端設定retries=max(很大很大很大的乙個值,無限次重試的意思):這個是要求一旦寫入失敗,就無限重試,卡在這裡了

我們生產環境就是按照上述要求配置的,這樣配置之後,至少在kafka broker端就可以保證在leader所在broker發生故障,進行leader切換時,資料不會丟失

3)生產者會不會弄丟資料

如果按照上述的思路設定了ack=all,一定不會丟,要求是,你的leader接收到訊息,所有的follower都同步到了訊息之後,才認為本次寫成功了。如果沒滿足這個條件,生產者會自動不斷的重試,重試無限次。

Kafka 資料丟失問題

kafka的ack機制 在kafka傳送資料的時候,每次傳送訊息都會有乙個確認反饋機制,確保訊息正常的能夠被收到,其中狀態有0,1,1。producer.type sync request.required.acks 1producer.type async request.required.ack...

kafka 資料不丟失

設定引數 props.put bootstrap.servers 10.176.2.170 9092,10.176.1.97 9092,10.176.7.57 9092 producer用於壓縮資料的壓縮型別。預設是無壓縮 props.put compression.type gzip 增加延遲 p...

Kafka重複消費,不丟失資料

kafka0.11.0.0版本正式支援精確一次處理語義exactly once semantic eos kafka冪等性參考 1 冪等producer 保證單個分割槽的只會傳送一次,不會出現重複訊息 2 事務 transation 保證原子性的寫入多個分割槽,即寫入到多個分割槽的訊息要麼全部成功,...