背景:线上A服务,是双节点,node1和node2
问题描述:node1能正常部署起来,node2一直部署失败,进程无法启动,
造成结果:由于SLB上给这2个节点,配置的流量都是50%,此时打到node2上面的请求全部返回404服务异常,而且请求还特别多,外部请求纷纷报错,都来找我们
初步判断不是代码问题,因为项目已经构建成功,只是部署失败,考虑到此项目流量特别大,通过日志无法快速定位原因,5分钟后,绝对先启用临时方案
临时解决办法:将SLB上,node1节点流量配置100%,将所有流量指向node1,保证请求能正常访问(短时间内,部分请求报QPS过载),然后迅速扩容一个新节点node3,将项目构建部署,发现能部署成功,果断在SLB上,将node1和node3的流量各配置成50%,此时项目正常运行,请求响应正常
后续排查:将node2流量置为0,尝试重新部署node2,发现node2上报以下错误
问题根源:我们项目中会有重试队列(重试请求外方),会生成一个个database文件存储在/tmp/cop/taskRetry上,一般在项目重启的时候会去默认继续读取队列,然后当项目部署的时候,,kill进程的时候,队列文件写入失败,但是在另一个根队列中列表文件中记录了队列名称,所以项目重启初始化的时候,找不到这个队列,会报fileNotFoundException,导致项目启动不了
解决办法:将/tmp/cop/taskRetry底下的根队列文件删除,重新部署,启动成功