Redisson 集群节点故障恢复后客户端无法自动重连,必须重启应用
Bug 描述
生产环境发生过一次集群节点故障(其中一个主节点宕机,从节点切主),整个过程持续约几分钟,Redis Cluster 自身已经完成 failover 并恢复正常,通过 redis-cli 直接连接集群读写都正常。但是Redisson客户端在节点恢复后没有自动恢复,所有针对原宕机节点 slot 范围的操作持续抛出以下异常:
org.redisson.client.RedisNodeNotFoundException: Node: NodeSource [slot=null, addr=null, redisClient=null, redirect=null, entry=null] hasn't been discovered yet
只能通过重启应用才能恢复。
环境
- Redisson 版本:3.11.0 (升级版本可能会产生兼容性问题)
- 部署模式:Redis Cluster (3 主 3 从)
- 客户端初始化方式:Redisson.create(config)
- 配置:scanInterval = 5000ms (集群拓扑扫描间隔)
已排查项
- Redis Cluster 自身在故障期间和恢复后都是健康的(cluster nodes / cluster info 都正常)
- scanInterval 已配置为 5000ms,理论上应该能在 5s 内感知到拓扑变化
- 异常持续时间远远超过 scanInterval,看起来客户端命中了某种内部缓存状态,即使拓扑扫描线程仍在运行也无法刷新
- 不是网络问题,其他基于同一套网络的 Redis 客户端(JedisCluster)在同样的故障场景下能自动恢复
- 如果检测到异常后重建client,可能会因为命中缓存无法真正重建
问题与期望行为
- Redisson 是否提供 API 可以主动触发集群拓扑刷新?(类似强制执行 CLUSTER NODES 并重建连接池) 我看了 RedissonClient 接口没有找到类似方法。
- 3.11.0 是否有已知的集群拓扑刷新 bug?升级到哪个版本可以修复?(我们目前评估升级到 3.44.0,但有兼容性顾虑)
- 期望redis集群出现问题恢复后,不需要重启项目来恢复项目的功能。有什么解决方案?
目前想到的思路
将redisson相关数据结构重构为redis的,RDelayedQueue + RBlockingDeque改为定时轮询扫 ZSet,RLock转换为setNX,但这样成本比较高,目前的业务逻辑已经在生产运行。
评论
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
新手SpringSecurity6.0源码流程总结
3
🛰️ dtSpaceMap - 实时卫星追踪 3D 可视化平台
5
Spring Boot 如何处理跨域请求(CORS):深度调研报告
3
最近在使用ChatGPT/Codex过程中发现了一个官方bug:高频日志写盘,会损坏电脑磁盘的寿命。桌面版和CLI都有这个问题,目前最新版的ChatGPT/Codex还没有彻底解决这个问题(虽然官方自称已经修复了,但实测还是有高频日志写盘问题)。建议使用下面这段提示词发给AI让它检查和修复:帮我检查 ~./codex/logs_2.sqlite 是否因 TRACE 日志持续高频写盘;如果中招,先备
2
#字节内推# 实习、校招、社招均有岗位
4
