Kafka數據丟失解決方案

producer 數據不丟失:

  1. 同步模式:配置=1 (只有Leader收到,-1 所有副本成功,0 不等待)Leader Partition掛了,數據就會丟失
    解決:設置 -1 保證produce 寫入所有副本算成功 producer.type = sync request.required.acks=-1

  2. 異步模式,當緩衝區滿了,如果配置爲0(沒有收到確認,一滿就丟棄),數據立刻丟棄
    解決:不限制阻塞超時時間。就是一滿生產者就阻塞

producer.type = async

request.required.acks=1

queue.buffering.max.ms=5000

queue.buffering.max.messages=10000

queue.enqueue.timeout.ms = -1

batch.num.messages=200

Customer 不丟失數據

  1. 在獲取kafka的消息後正準備入庫(未入庫),但是消費者掛了,那麼如果讓kafka自動去維護offset它就會認爲這條數據已經被消費了,那麼會造成數據丟失。
    解決:使用kafka高級API,自己手動維護偏移量,當數據入庫之後進行偏移量的更新(適用於基本數據源)

流式計算。高級數據源以kafka爲例,由2種方式:receiver (開啓WAL,失敗可恢復) director (checkpoint保證)

流處理中的幾種可靠性語義:

  1. at most once 每條數據最多被處理一次(0次或1次),會出現數據丟失的問題

  2. at least once 每條數據最少被處理一次(1次或更多),這個不會出現數據丟失,但是會出現數據重複

  3. exactly once 每種數據只會被處理一次,沒有數據丟失,沒有數據重複,這種語義是大家最想實現的,也是最難實現的

但是開啓WAL後,依舊存在數據丟失問題,原因是任務中斷時receiver 也被強行終止了,將會造成數據丟失

在Streaming程序的最後添加代碼,只有在確認所有receiver都關閉的情況下才終止程序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章