Spring Boot在Redis集群节点宕机时无法连接其余节点问题排查
问题分析与解决
1. 核心认知误区:3单主节点集群故障后无法正常服务
你当前搭建的是3个无从节点的Redis主集群,Redis Cluster的工作逻辑是所有16384个哈希槽必须被正常节点覆盖,集群才能处于可用状态。当其中一个主节点(如7002)下线后,该节点负责的约5461个哈希槽完全不可用,集群会直接进入fail状态,此时整个集群无法处理涉及这些槽的请求,甚至会拒绝大部分读写操作——这就是你看到客户端持续重连失败的根本原因,并非Spring Boot配置问题,而是集群本身已经不可用了。
2. 解决集群可用性的正确方案:搭建主从架构的Redis Cluster
要实现节点故障后集群仍能提供服务,必须给每个主节点配置至少1个从节点,形成3主3从的集群架构:
- 每个主节点对应1个从节点,当主节点故障时,Redis Cluster会自动触发故障转移,将对应的从节点提升为新主节点,接管原主节点的哈希槽,集群保持完整可用。
- 创建3主3从集群的命令示例:
参数redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1--cluster-replicas 1表示每个主节点分配1个从节点。
3. Spring Boot客户端的优化配置(适配集群故障转移)
即使搭建了主从集群,还需要配置Spring Boot的Redis客户端,使其能自动感知集群拓扑变化:
在application.properties中补充以下配置:
# 开启自适应拓扑刷新和定期刷新,感知节点故障转移 spring.data.redis.cluster.refresh.adaptive=true spring.data.redis.cluster.refresh.period=30s # 连接超时与重定向次数 spring.data.redis.timeout=2000ms spring.data.redis.cluster.max-redirects=3 # 连接池配置(可选,优化连接复用) spring.data.redis.jedis.pool.max-active=8 spring.data.redis.jedis.pool.max-idle=8 spring.data.redis.jedis.pool.min-idle=0
adaptive=true:当客户端检测到节点故障时,自动刷新集群拓扑;period=30s:定期主动刷新集群拓扑,确保客户端获取最新节点信息;max-redirects=3:设置集群请求重定向的最大次数,适配故障转移后的路由变化。
4. 临时测试方案(无需搭建从节点)
如果只是临时测试,不想搭建从节点,可以手动将故障节点的哈希槽迁移到其他主节点,恢复集群可用:
- 执行命令进入reshard流程:
redis-cli --cluster reshard 127.0.0.1:7000 - 按照提示输入要迁移的槽数量(约5461)、接收槽的目标节点ID(可以选7000或7001的节点ID)、来源节点ID(7002的节点ID),完成迁移后集群会恢复可用。
注意:这只是临时方案,故障节点恢复后需要重新调整槽分配,不适合生产环境。
内容的提问来源于stack exchange,提问作者Hasanul Banna Saif
相关产品推荐
相关产品推荐

