Kafka在什麼情況下會丟資料

2021-09-25 22:04:41 字數 1925 閱讀 6555

kafka是高吞吐量資料匯流排,使用得當會使我們處理業務如魚得水,如虎添翼。處理不當也會使系統殘破不堪,維護起來痛苦萬分,我們針對資料可靠性這點,來分析下這個訊息元件在什麼情況下會丟失資料。

一、producer配置acks=0

在acks=0模式下,訊息傳輸到broker端沒收到broker的反饋即傳送下一條,這種純非同步的傳送方式,難免會丟資料。
二、producer配置acks=1

在ack=1模式,只要訊息傳輸到partition的leader節點,leader節點返回ack,即認為傳送資料成功,無需等待副本全部同步完。這種模式下,在leader節點宕機時,副本還沒同步完leader的資料,就會發生資料丟失。
三、no_enough_replicate

produer配置acks=all的時候,也是有可能會丟資料的,當某個partition的isr列表中的副本數,不滿足min.insync.replicate的時候,生產者傳送訊息就得不到ack確認,這時候生產者會進入重試,重試次數為配置的message.send.max.retries,如果在重試次數內isr列表副本數仍然達不到最小同步副本數,那麼,生產者會丟擲no_enough_replicate的異常,如果沒能正確處理這個異常,很可能這條資料就丟失了

那麼什麼情況下isr列表的副本數不足最小副本數呢?

follower副本程序卡住,在一段時間內根本沒有向leader副本發起同步請求,比如頻繁的full gc。

follower副本程序同步過慢,在一段時間內都無法追趕上leader副本,比如io開銷過大。

四、not_leader_for_partition

其中一台broker會出現與zk的sessiontime out 連線超時,接著導致controller重新選舉,導致producer元資料不正確,此時寫入該broker,會丟擲not_leader_for_partition的警告,此時可能會發生資料丟失

auto.leader.rebalance.enable=true 也會進行重新選舉leader的操作,導致寫入原leader,丟擲not_leader_for_partition

五、磁碟故障

kafka的資料一開始就是儲存在pagecache上的,定期flush到磁碟上的,也就是說,不是每個訊息都被儲存在磁碟了,如果出現斷電或者機器故障等,pagecache上的資料就丟失了。
可以通過log.flush.interval.messages和log.flush.interval.ms來配置flush間隔

六、producer生產資料過長

單批資料的長度超過限制會丟失資料,報kafka.common.messagesizetoolargeexception異常

生產者生產的資料,大於消費者配置的能拉取的最大訊息大小,這條大資料將會消費失敗

七、無重發重試

網路負載很高或者磁碟很忙寫入失敗的情況下,沒有自動重試重發訊息。沒有做限速處理,超出了網路頻寬限速。kafka一定要配置上訊息重試的機制,並且重試的時間間隔一定要長一些,預設1秒鐘並不符合生產環境(網路中斷時間有可能超過1秒)。
八、消費者崩潰

如果auto.commit.enable=true,當consumer fetch了一些資料但還沒有完全處理掉的時候,剛好到commit interval出發了提交offset操作,接著consumer crash掉了。這時已經fetch的資料還沒有處理完成但已經被commit掉,因此沒有機會再次被處理,資料丟失。
九、消費者異常沒正確處理

consumer消費者自動提交位點,在消費者消費資料異常時,沒有將異常資料處理妥當,導致業務異常資料丟失

consumer手動批量提交位點,在批量位點中某個位點資料異常時,沒有正確處理異常,而是將批量位點的最後乙個位點提交,導致異常資料丟失

MySQL索引在什麼情況下會失效

索引的失效,會大大降低sql的執行效率,日常中又有哪些常見的情況會導致索引失效?對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如 sele...

layoutSubviews在什麼情況下呼叫

1.在以下情況都會呼叫 注意 當view的size的值為0的時候,addsubview也不會呼叫layoutsubviews。當要給這個view新增子控制項的時候不管他的size有沒有值都會呼叫 2.先來看一下uiview的layoutsubviews在什麼情況下會呼叫 subview view s...

python 在什麼情況下 rmul

在自定義列表mylist之後 3 mylist 報錯,mylist已經過載了 但是3沒有,這時同學告訴我可用 rmul 說我有乙個列表l。在什麼情況下l rmul 自我,其他 叫?我基本上理解了文件,但我也想看到乙個例子,澄清它的用法,毫無疑問。當python試圖乘以兩個物件時,它首先嘗試呼叫左物件...