起因
监控发现dubbo-admin无法正常响应,返回了500错误。
排查过程
重启dubbo-admin,发现无法正常启动,从启动日志中,发现频繁发出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)
捉包发现是dubbo-admin在接收数据后RESET的TCP连接。
此时我们将dubbo-admin连接其他zk机器能正常启动。异常ZK集群却无法引导dubbo-admin 。
尝试了滚动升级zk集群小版本,问题无法修复。在使用 zkCli.sh 执行命令 ls /dubbo 缺返回了一条消息:
java.io.IOException: Packet len8854970 is out of range!
解决措施:
Zookeeper客户端错误:Packet len* is out of range!
调整zkCli.sh 的启动参数,增加 -Djute.maxbuffer=41943040
增加参数后,发现 /dubbo 目录中增加了好多25结尾的节点。得出结论是,由于节点名称过长导致客户端连接异常而退出。
异常dubbo节点.png
解决办法
记录异常节点数量
> ./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
执行删除操作
> 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即可恢复正常