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 (集群拓扑扫描间隔)

已排查项

  1. Redis Cluster 自身在故障期间和恢复后都是健康的(cluster nodes / cluster info 都正常)
  2. scanInterval 已配置为 5000ms,理论上应该能在 5s 内感知到拓扑变化
  3. 异常持续时间远远超过 scanInterval,看起来客户端命中了某种内部缓存状态,即使拓扑扫描线程仍在运行也无法刷新
  4. 不是网络问题,其他基于同一套网络的 Redis 客户端(JedisCluster)在同样的故障场景下能自动恢复
  5. 如果检测到异常后重建client,可能会因为命中缓存无法真正重建

问题与期望行为

  1. Redisson 是否提供 API 可以主动触发集群拓扑刷新?(类似强制执行 CLUSTER NODES 并重建连接池) 我看了 RedissonClient 接口没有找到类似方法。
  2. 3.11.0 是否有已知的集群拓扑刷新 bug?升级到哪个版本可以修复?(我们目前评估升级到 3.44.0,但有兼容性顾虑)
  3. 期望redis集群出现问题恢复后,不需要重启项目来恢复项目的功能。有什么解决方案?

目前想到的思路

将redisson相关数据结构重构为redis的,RDelayedQueue + RBlockingDeque改为定时轮询扫 ZSet,RLock转换为setNX,但这样成本比较高,目前的业务逻辑已经在生产运行。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP