一次登录接口502问题排查过程
概述
突然发现测试环境登录失败,api/login/captcha
接口报错502
第一反应是去查看日志:
com.aaa.cachecloud.redis.clients.jedis.exceptions.JedisClusterMaxRedirectionsException: Too many Cluster redirections? key=59cdc8a2-a589-4381-aee9-f09c8d5650c8
at com.aaa.cachecloud.redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:101)
at com.aaa.cachecloud.redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:138)
at com.aaa.cachecloud.redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:159)
at com.aaa.cachecloud.redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:138)
at com.aaa.cachecloud.redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:159)
at com.aaa.cachecloud.redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:138)
at com.aaa.cachecloud.redis.clients.jedis.JedisClusterCommand.run(JedisClusterCommand.java:34)
at com.aaa.cachecloud.redis.clients.jedis.JedisCluster.exists(JedisCluster.java:130)
at com.aaa.cachecloud.builder.RedisClusterBuilder.exists(RedisClusterBuilder.java:273)
at com.xy.cloudiview.common.util.RedisTool.delKey(RedisTool.java:41)
at com.xy.cloudiview.web.controller.LoginController.checkCaptcha(LoginController.java:126)
也没有细看日志报错。以为登录失败和Redis,即cachecloud有关。
另外,作为背景知识,cachecloud有一个appId的概念,不同的应用,使用不同的appId。公司基于开源cachecloud二次开发的Redis组件,使用下来,没有appId隔离的概念,也没有鉴权这一说法。即,如果我的应用使用别的应用的appId,不影响我在别的应用下存储与读取数据;在连接cachecloud server时,不需要用户名/密码。
所以如果配置错误的cachecloud appId,会发生请求转发与重试?故而错误日志里面有:多次runWithRetries方法,最后爆出JedisClusterMaxRedirectionsException异常。
检查cachecloud appId配置。最后还是有问题。
咨询研发同学。给出的答复是:网络等各种原因导致更新slot信息失败,可能慢查询比较多, 阻塞。
没能给出满意的答复,也解决不了我的问题。
另外,在排查的过程中,发现后面并没有记录日志,且上面日志的报错接口是api/login/checkCaptcha
,并不是api/login/captcha
。
因此,和cachecloud appId无关。。
继续排查,
怀疑和nginx有关。
Jenkins的构建配置:
export JAVA_HOME=/usr/local/java
jar_name=cloud-iview-web.jar
echo '### 创建目录, ###'
Remote_Directory=/www/iview.ppdaiapi.com
Cur_Date=$(date "+%Y%m%d%H%M%S")
mkdir -p ${Remote_Directory}/release/${Cur_Date}
cd ${Remote_Directory}/release/${Cur_Date}
mv ../../${jar_name} ${Remote_Directory}/release/${Cur_Date}
cd ../../
rm -rf current
ln -s ${Remote_Directory}/release/${Cur_Date} current
cd ${Remote_Directory}/release/${Cur_Date}/
# kill -9 $(ps -ef|grep ${jar_name} | gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')
kill -9 `lsof -nP -iTCP:8060 |grep LISTEN|awk '{print $2;}'`
sleep 5
echo '### 启动jar包 ###'
nohup ${JAVA_HOME}/bin/java -jar ${jar_name} --server.port=8060 --spring.profiles.active=test > output 2>&1 &
#只保留5个版本记录
cd ${Remote_Directory}/release/
filenum=5
filecount=$(ls |grep 20|wc -l)
if [ ${filecount} -gt ${filenum} ];then
ls | sed -n "1,$[${filecount} - ${filenum}]p" | xargs rm -rf
echo “删除历史版本成功”
fi
删除Apollo配置之后,并不能生效,因为应用已经启动,是通过命令行的方式启动,
必须再重新构建一次应用。