1. 程式人生 > >【troubleshooting】記一次Kafka集群重啟導致消息重復消費問題處理記錄

【troubleshooting】記一次Kafka集群重啟導致消息重復消費問題處理記錄

進程 pid 導致 set pic 方法 sum tails log

因需要重啟了Kafka集群,重啟後發現部分topic出現大量消息積壓,檢查consumer日誌,發現消費的數據竟然是幾天前的。
由於平時topic消息基本上無積壓,consumer消費的數據都是最新的,明顯是consumer在重新消費之前已經消費過的數據。

處理方法:將Kafka topic中consumer已經消費的offset值設置為最大值
步驟如下:
1、從Kafka查詢出目前堵塞的topic消息隊列中,最大的offset值(其實從Kafka的管理頁面上也可以看到這值):
命令:./kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list 192.168.1.1:9092,192.168.1.2:9092,192.168.1.3:9092 -topic topic_name--time -1

查詢結果
topic_name:2:1024
topic_name:1:1024
topic_name:0:1024

2、登錄zookeeper,將堵塞的topic中consumer已經消費的offset值設置為最大的offset值
./zkCli.sh -server 192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181
然後執行如下命令,設置offset值
set /kafka/consumers/instance/offsets/topic_name/0 1024
set /kafka/consumers/instance/offsets/topic_name/1 1024
set /kafka/consumers/instance/offsets/topic_name/2 1024

3、重啟所有consumer應用,這樣consumer就從最大offset值處開始消費

原因分析:由於在關閉Kafka和zookeeper進程時,使用的是kill -9 PID,導致部分topic offset值未來得及提交,出現消息重復消費的現象。
關閉Kafka和zookeeper,需要按正常方式關閉應用,不能直接使用kill進程的方式。
./kafka-server-stop.sh
./zkServer.sh stop

參考信息:
修改kafka topic的offset幾種方法
http://blog.csdn.net/yxgxy270187133/article/details/53666760
Kafka重復消費和丟失數據研究

http://blog.csdn.net/zollty/article/details/53958641

【troubleshooting】記一次Kafka集群重啟導致消息重復消費問題處理記錄