天天看點

kafka 重複消費和資料丢失_Kafka 的資料丢失和重複消費

本文将從消息的生産端和消息的消費端分析,資料是如何丢失的?資料是如何出現重複消費的,如何解決上述這種情況?

利用 Kafka 高吞吐、可分區、可複制的特性, 在實時資料流分析應用領域,Kafka 在此大展身手。

1/ 生産端 Producer

消息格式:每個消息是一個 ProducerRecord 對象,必須指定消息所屬的 Topic 和消息值 Value ,此外還可以指定消息所屬的 Partition 以及消息的 Key。Producer 生産資料預設是先寫到記憶體(PageCache)中的,定期 flush 到磁盤上。預設的這個參數是:

kafka 重複消費和資料丢失_Kafka 的資料丢失和重複消費

設定較小定期 flush 的時間,并不能真正保證資料不會丢失。通過檢視官方提供的預設配置 Long.MaxValue 也可以看出,官方是不建議我們通過這個參數來改變什麼的,也就是說設定 flush 的時間,不能從根本上保證我們的資料丢失問題。

前面一開始提到,kafka 作為一個可分區和可複制的消息隊列。我們可以利用它的分區副本機制,為每一個 Topic 的資料分為多個分區,每個分區放在不同的節點上,每個分區預設隻有一分資料,通過設定參數 --replication-factor 2 ,可以執行每個分區有三份資料,其中有兩份是用來備份的。

分區有副本了,也會存在 leader 和 follower 的角色,zookeeper 中維護了一個 ISR 清單。

這時,生産者往 broker 中寫入資料的時候,預設的消息确認級别是 request.required.acks = 0, 表示生産者發送消息之後,不會等待 leader的确認。

kafka 重複消費和資料丢失_Kafka 的資料丢失和重複消費

是以,需要把這個設定為 -1 ,表示生産者發送消息要等到 leader 以及所有的副本都同步了,才會傳回确認消息。當然,這種方案也不是非常萬無一失的,官方提出的建議是,還需要配置 min.insync.replicas 最小同步的副本數,如果沒有得到這個最小數的要求,生産者會抛出異常,本次寫入不會成功。比如,我有三個副本,那麼最好找個參數要設定成 2 ,要保證大部分的副本同步了資料。

官方原文:

kafka 重複消費和資料丢失_Kafka 的資料丢失和重複消費

總結:request.required.acks = -1 雖然保證了資料的一緻性,但是同時也影響了性能。在實際業務中應該考慮資料少量丢失對于業務的影響,要根據自己的情況來,結合業務來平衡資料一緻性和系統的性能。

有興趣的讀者可以去研究一下 CAP, 分布式系統的三個名額,推薦阮一峰老師寫的 -- CAP 定義的原理。

2/ 消費端

Consumer

消費端資料丢失的原因是 offset 的自動送出。

kafka 重複消費和資料丢失_Kafka 的資料丢失和重複消費

由于在使用kafka的進階API時,消費者會自動每隔一段時間将offset儲存到zookeeper上,此時如果剛好将偏移量送出到zookeeper上後,但這條資料還沒消費完,機器發生當機,此時資料就丢失了。

解決方法:關閉自動送出,改成手動送出,每次資料處理完後,再送出。

資料重複消費,在消費者自動送出offset到zookeeper後,程式又消費了幾條資料,但是還沒有到下次自動送出offset到zookeeper之時,如果機器當機了,然後重新開機,此時消費者會去讀zookeeper上的偏移量進行消費,這就會導緻資料重複消費。 解決方法:關閉自動送出,改成手動送出。

這裡再提一下 kafka 的兩種方式API,以供大家選擇合适的。

進階 API 的特點

優點

● 進階API寫起來簡單

● 不需要去自行去管理offset,系統通過zookeeper自行管理

● 不需要管理分區,副本等情況,系統自動管理

● 消費者斷線會自動根據上一次記錄在 zookeeper中的offset去接着擷取資料

缺點

● 不能自行控制 offset(對于某些特殊需求來說)

● 不能細化控制如分區、副本、zk 等

低級 API 的特點

優點

● 能夠開發者自己控制offset,想從哪裡讀取就從哪裡讀取。

● 自行控制連接配接分區,對分區自定義進行負載均衡

● 對 zookeeper 的依賴性降低(如:offset 不一定非要靠 zk 存儲,自行存儲offset 即可,比如存在檔案或者記憶體中)

缺點

● 太過複雜,需要自行控制 offset,連接配接哪個分區,找到分區 leader 等

本文就到這裡,實際生産中需要結合自己的業務去選擇。

推薦閱讀

Kafka 遇上 Spark Streaming​mp.weixin.qq.com

kafka 重複消費和資料丢失_Kafka 的資料丢失和重複消費

kafka 上新​mp.weixin.qq.com

kafka 重複消費和資料丢失_Kafka 的資料丢失和重複消費

kafka 簡介、架構、安裝​mp.weixin.qq.com

kafka 重複消費和資料丢失_Kafka 的資料丢失和重複消費
kafka 重複消費和資料丢失_Kafka 的資料丢失和重複消費