kafka 重啟consumer 重復消費問題


原文鏈接:https://blog.csdn.net/z1941563559/java/article/details/88753938

問題描述:kafka的某些topic在消費完畢后一段時間,重啟唯一消費者,offset會重置為最小offset重新消費,一直導致kafka消費的重復消費問題。
問題產生原因:是offset信息過期導致的。我一直以為消費者保持在線,最新位移信息是不會過期的。但即使消費者在線,位移信息也會如約過期。配置的數據保留時間log.retention.hours=168小時比位移保留時間offsets.retention.minutes=1440即24小時要長。offset信息過期后,重啟消費者。由於找不到offset信息,會根據配置auto.offset.reset=earliest從最小位移開始消費,導致之前已經消費的數據再次被消費。

 

 

解決方案:

原文 :https://issues.apache.org/jira/browse/KAFKA-3806

調整log.retention.hours和offsets.retention.minutes的默認值

在特殊情況下,將log.retention.hours(168小時= 7天)和offsets.retention.minutes(1440分鍾= 1天)的默認值結合使用可能很危險。偏移保留應始終大於對數保留。

我們已經觀察到以下情況和問題:

  • 生產者更新已於兩天前禁止了該主題的數據生產,該主題未刪除。
  • 消費者使用了所有數據並正確分配了對Kafka的偏移量。
  • 消費者不再對該主題進行抵消提交,因為沒有更多傳入數據,也沒有任何可確認的內容。(我們已禁用自動提交功能,我不確定啟用自動提交的行為方式。)
  • 一天后:Kafka根據offsets.retention.minutes清除了太舊的偏移量。
  • 兩天后:長期運行的使用者在更新后重新啟動,由於該主題已被offsets.retention.minutes刪除,因此未找到該主題的任何已提交偏移量,因此從一開始就開始使用它。
  • 由於log.retention.hours較長,消息仍在Kafka中,大約5天的消息被再次讀取。

解決此問題的已知解決方法:

  • 顯式配置log.retention.hours和offsets.retention.minutes,不要使用默認值。

提案:

  • 將offsets.retention.minutes的默認值延長到至少比log.retention.hours大兩倍。
  • 在Kafka啟動期間檢查這些值,如果offsets.retention.minutes小於log.retention.hours,則記錄警告。
  • 在遷移指南中添加一條注釋,以了解ZooKeeper和Kafka中存儲偏移量之間的區別(http://kafka.apache.org/documentation.html#upgrade)。

 

 

修改:

默認參數 offsets.retention.minutes & log.retention.minutes 的默認值問題。

默認參數前者是7天,后者是24小時。會導致數據雖然保存但offset失效導致客戶端數據重復消費的問題。

0.10.0.0官方的參數說明:http://kafka.apache.org/0100/documentation.html#log

offsets.retention.minutes

Log retention window in minutes for offsets topic

Kafka Server端保存的offset的過期時間。默認值1440(1440分鍾也就是24小時),應該調整為與log.retention.hours一致,即10080。

 

log.retention.hours & log.retention.minutes

這兩個參數都是用來設置刪除日志的,無論哪個屬性已經溢出,都會進行文件的刪除。

log.retention.hours: 
The number of hours to keep a log file before deleting it (in hours), tertiary to log.retention.ms property
參數int類型,默認值:168 (168小時也就是7天)。

log.retention.minutes: 
The number of minutes to keep a log file before deleting it (in minutes), secondary to log.retention.ms property. If not set, the value in log.retention.hours is used
參數int類型,默認值:null。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM