RocketMQ版本:3.4.6
==問題現象==
RocketMQ集群的某個topic,在一部分節點上消費有“斷層”,這部分數據一致沒辦法消費。
==調查過程==
一頓操作猛如虎的調查之后發現,
該Topic的消費者的客戶端連接數不正確。
程序中設置的客戶端數明明是4個,
但是Web頁面上顯示的是5個。
OK,如何才能知道這些客戶端程序到底是哪些呢?
看了一下RocketMQ的命令列表,發現里面有一個命令好像有戲。
用這個命令嘗試了一下,果然有效。
命令:sh /home/hadmin/alibaba-rocketmq/bin/mqadmin consumerConnection -n "10.11.2.4:9876;10.11.2.5:9876" -g face2
用這個命令可以查看出,這個消費組的客戶端是在哪個節點上,占用的端口號是哪個。
將正常的客戶端連接斷開(用的Storm消費,把Storm的拓撲kill掉就可以了)
再次使用這個命令,就可以查看出,到底是哪個程序在搗鬼了。
發現在10.11.2.9節點上,54681這個端口的java程序啟動了一個客戶端連接。
到10.11.2.9上查看一下是哪個程序。
命令:netstat -anp | grep 54681 查看占用端口的java進程號是43021。
命令:ps -ef | grep 43021 查看啟動這個進程的java程序。
==問題結論==
我們的場景是用Storm來消費RocketMQ。
但是,在我們kill拓撲的時候,由於storm的原因,
偶爾會有一些worker不能被kill掉,變成“僵屍進程”
上述問題中,莫名其妙多出的1個客戶端連接就是僵屍進程引起的,
將上述發現的僵屍進程kill掉之后,問題就解決了。
==經驗教訓==
Storm的拓撲kill之后,建議檢查是否有僵屍進程存在。可以寫一個shell腳本檢查。