某一天突然有同事说zk client连不上server,次Z查之程序考虑到最近业务代码没有变更,旅论怀疑是员曾遇运维同学做了什么操作导致,急忙联系运维同学,关于确实最近做了变更。次Z查之程序为了避免扩大影响范围,旅论先让运维同学回滚了变更,员曾遇回滚后可以正常访问了。关于 询问运维同学后,次Z查之程序得到变更流程:由于zk集群有一台服务器存在性能隐患,旅论需要变更到新的员曾遇一个实例。于是关于运维先将新机器加入zk集群,修改旧服务器上配置逐个重启,次Z查之程序重启后新zk的旅论角色是leader,此时zk状态正常,员曾遇运维同学也就认为变更完成。 结果意想不到的站群服务器是使用mntr命令查看,所有的机器状态都是正常,但是zk client无法访问,一访问就卡住,问题可以在测试环境稳定复现。 1 猜测zk端口没有监听成功,登录服务器使用netstat查看server打开的三个端口都是正常状态,也使用了telnet测试可以连上。 2 猜测同步节点数不足一半,或者follower连不上leader触发重新选举,但很快就被排除,因为上面说了使用mntr命令查看节点状态都正常,从日志中也未能找到对应日志记录。 3 我们再使用stat来观察server的连接情况,源码库运行zk client发现server收到了client的请求,但是没有回消息,看来原因就是zk server没处理client的请求了。 跟踪到这里,就应该进入源码了,由于对zk源码不熟悉,咨询了某位大佬,建议我们看zk请求处理类CommitProcessor。 在CommitProcessor我们发现了原因,代码如下: 在shutdown中调用了 workerPool.join实际上已经将请求处理的开关关闭了,但是并没有将workerPool设置为null。在start方法中会根据workerPool==null来创建WorkerService并开始处理请求。 修改后重新验证解决。起因
复现问题
问题排查