CLUSTERDOWN 表示集群因 slot 未分配或存活主节点数≤总主节点数/2而自我熔断;需通过 cluster info 查 state/fail、slots_assigned、cluster_size,用 cluster nodes 检查 fail/noaddr 状态,清理 nodes.conf 并重配 cluster-announce-ip 后重建集群。

CLUSTERDOWN 不是节点宕机那么简单,而是集群已拒绝提供任何服务——要么 slot 没分配,要么主节点数不满足法定多数(≤ 总主节点数 / 2),必须从这两个方向入手排查。
cluster info 显示 cluster_state:fail 怎么快速定位
连任意一个节点执行 redis-cli -c -h <ip> -p <port> cluster info,只盯三行:
-
cluster_state:fail—— 集群根本没激活,不是“挂了”,是“没起来” -
cluster_slots_assigned:0或远小于16384—— slot 完全没分,集群空转 -
cluster_size:0或明显小于你预期的主节点数 —— 节点互相没认全,卡在第一步
此时别急着重启。先跑 redis-cli -c -h <ip> -p <port> cluster nodes,看输出里有没有大量 fail 或 noaddr 状态 —— 这基本说明 IP/端口配置错位,比如 nodes.conf 还存着旧虚拟机的 IP。
nodes.conf 里 IP 写死导致集群“失联”
Redis 启动后会把实际监听地址写进 nodes.conf。Docker 迁移、VM 复制、宿主机改 IP 后,这个文件里的地址就失效了(比如还写着 192.168.1.100),新环境节点之间 ping 不通。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 停掉所有实例:
redis-cli -h <ip> -p <port> shutdown - 删每个实例数据目录下的
nodes.conf和dump.rdb(保留redis.conf) - 确认
redis.conf中cluster-announce-ip设为当前机器真实 IP(不能是127.0.0.1或0.0.0.0) - 重启节点,再用
redis-cli --cluster create重新创建集群
客户端连得上但报 CLUSTERDOWN 的常见坑
工具(如 RedisInsight)能连、redis-cli -c 能 set,不代表你的应用代码能用 —— 它很可能用了单节点客户端。
- Java 项目必须用
JedisCluster,不是Jedis;传入的节点列表要含至少 3 个主节点地址 - Go 项目要用
redis.NewClusterClient()(go-redis/v8),不是redis.NewClient() - Python 用
redis.RedisCluster(),不是redis.Redis();且初始化时建议加skip_full_coverage_check=True(若 slot 未 100% 分配)
检查客户端日志是否反复重试连接某一个挂掉的节点 —— 这说明它压根没走集群拓扑发现逻辑,配置漏了或缓存了旧映射。
live masters 数量不足触发法定多数熔断
“CLUSTERDOWN The cluster is down”本质是集群自我熔断:在线且可通信的主节点数 ≤ 总主节点数 / 2。比如 6 主集群,只要 ≤ 3 个主节点存活,整个集群立即拒绝所有写入。
- 别信
cluster info里的cluster_state:ok—— 它可能缓存旧状态 - 用
redis-cli -c -h <ip> -p <port> cluster nodes | awk '$3 ~ /master/ && $3 !~ /fail|noaddr/ {count++} END {print "live masters:", count}'直接统计真实存活主节点数 - 结果为 0:检查网络连通性,确认客户端能否
telnet通所有主节点端口 - 结果为 1–N(N < 总主节点数/2):集群已因法定多数失效而熔断,必须恢复足够主节点或重建
Slot 缺失比节点宕机更隐蔽:即使所有节点都标着 connected,只要有一个 slot 区间未分配(cluster slots 输出中某行结尾是 -),或指向一个 fail 节点,集群就会返回 CLUSTERDOWN —— 这个细节最容易被忽略。

















