You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 临时测试方案(无需搭建从节点)

如果只是临时测试,不想搭建从节点,可以手动将故障节点的哈希槽迁移到其他主节点,恢复集群可用:

  1. 执行命令进入reshard流程:
    redis-cli --cluster reshard 127.0.0.1:7000
    
  2. 按照提示输入要迁移的槽数量(约5461)、接收槽的目标节点ID(可以选7000或7001的节点ID)、来源节点ID(7002的节点ID),完成迁移后集群会恢复可用。

注意:这只是临时方案,故障节点恢复后需要重新调整槽分配,不适合生产环境。

内容的提问来源于stack exchange,提问作者Hasanul Banna Saif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 14:15:29