记录一次Springboot下Redisson的坑:NodeSource [slot=null, addr=null, redisClient=null, redirect=null, entry=null]

/ 默认分类 / 0 条评论 / 6009浏览

项目上线,相安无事3个月,忽然测试大佬说test环境啥也干不了了。但是重启即可解决问题。

但是如果线上出问题可就凉了。故排查问题。

查日志发现如下错误:

nested exception is org.redisson.client.RedisNodeNotFoundException: Node: NodeSource [slot=null, addr=null, redisClient=null, redirect=null, entry=null] hasn't been discovered yet

排查思路: 1、怀疑redis连接不上。排除。原因如果是网络、系统等环境问题,addr不改是null。 2、配置问题。我们项目没有使用spring的动态配置(没用配置中心),在k8s里面放的configmap,写到启动命令里的。排除。 3、内存数据回收,bean丢失。

通过第三个猜测,查看代码,发现不会被回收。查看源码,发现通过一个数组,保存了NodeSource,根据算出来的hashslot 拿到不同的entry。

使用Arthas线上诊断工具(重启会导致现象消失)发现entry的数组一部分是null。

查找为何entry为空,找到第一个报错日志,前面有如此两行。

2020-11-29 11:37:35.741  INFO 8 --- [isson-netty-2-1] o.r.cluster.ClusterConnectionManager     : 11008 slots found to add
2020-11-29 11:37:39.754 ERROR 8 --- [isson-netty-2-1] o.r.cluster.ClusterConnectionManager     : Can't execute CLUSTER_INFO for 10.3.53.103/10.3.53.103:6379

查看redis运行日志 那这个时刻附近,redis cluster中的某个节点重启了。

那么redis 重启后应该重新分配slot呀,但是没能成功。

查看redisson 发现在3.13.3后已经修复。故升级redisson版本即可。

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.13.6</version>
</dependency>

如果出现

NoClassDefFoundError: org/springframework/data/redis/connection/RedisStreamCommands

是因为你是用的spring框架版本低,对高版本的redisson不好。

具体方法如我的这篇文章。点击进入啊啊啊啊