起因
監(jiān)控發(fā)現(xiàn)dubbo-admin無法正常響應肺孵,返回了500錯誤匀借。
排查過程
重啟dubbo-admin,發(fā)現(xiàn)無法正常啟動,從啟動日志中平窘,發(fā)現(xiàn)頻繁發(fā)出2條重復消息:
[localhost-startStop-1-EventThread] INFO org.I0Itec.zkclient.ZkClient (ZkClient.java:449) - zookeeper state
changed (SyncConnected)
[localhost-startStop-1-EventThread] INFO org.I0Itec.zkclient.ZkClient (ZkClient.java:449) - zookeeper state
changed (Disconnected)
捉包發(fā)現(xiàn)是dubbo-admin在接收數(shù)據(jù)后RESET的TCP連接吓肋。
此時我們將dubbo-admin連接其他zk機器能正常啟動。異常ZK集群卻無法引導dubbo-admin 瑰艘。
嘗試了滾動升級zk集群小版本是鬼,問題無法修復。在使用 zkCli.sh 執(zhí)行命令 ls /dubbo 缺返回了一條消息:
java.io.IOException: Packet len8854970 is out of range!
解決措施:
Zookeeper客戶端錯誤:Packet len* is out of range!
調整zkCli.sh 的啟動參數(shù)紫新,增加 -Djute.maxbuffer=41943040
增加參數(shù)后均蜜,發(fā)現(xiàn) /dubbo 目錄中增加了好多25結尾的節(jié)點。得出結論是芒率,由于節(jié)點名稱過長導致客戶端連接異常而退出兆龙。
解決辦法
記錄異常節(jié)點數(shù)量
> ./zkCli.sh ls /dubbo | awk -F',' '{for(i=1 ;i<=NF;i++){print $i}}' |grep 25 | wc -l
990
生成刪除列表
> for i in `./zkCli.sh ls /dubbo | awk -F',' '{for(i=1 ;i<=NF;i++){print $i}}' |grep 25 ` ; do echo rmr /dubbo/$i ; done > /tmp/rmrcommamd
執(zhí)行刪除操作
> cat /tmp/rmrcommamd | ./zkCli.sh
驗證
> ./zkCli.sh ls /dubbo | awk -F',' '{for(i=1 ;i<=NF;i++){print $i}}' |grep 25 | wc -l
0
此時重啟dubbo-admin即可恢復正常