直接原因是集群节点对同一槽位归属存在冲突判断,导致各节点本地槽位映射表不统一、无法达成共识;需先通过cluster nodes和cluster slots确认视图分裂程度,再清理fail/noaddr节点、确保网络互通,最后用cluster addslots或--cluster fix修复分配。

直接原因是集群节点对同一槽位归属存在冲突判断,客户端收到 MOVED 或 ASK 响应后无法稳定路由,甚至反复重定向或连接拒绝。核心不是数据丢了,而是各节点本地的槽位映射表(clusterState.slots[])不统一,导致集群无法达成共识。
确认槽位视图分裂程度
先登录任意节点执行:
-
CLUSTER NODES:查看所有节点状态,重点找标记为fail、noaddr或缺失myself的异常节点 -
CLUSTER SLOTS:比对输出中各槽段是否连续覆盖 0–16383,是否存在空缺、重叠或同一槽号出现在多个区间 -
redis-cli --cluster check <node></node>:自动检测未覆盖槽、重复分配、主从不匹配等典型问题
清理失效节点元数据
若发现已下线但未被遗忘的节点仍出现在 CLUSTER NODES 输出中(状态为 fail 或 noaddr),必须在所有存活节点上执行:
-
CLUSTER FORGET <node-id></node-id>—— 清除该节点记录,否则它会持续干扰 Gossip 传播 - 确保所有节点网络互通,且
cluster-enabled yes、cluster-require-full-coverage no(临时容错)已正确配置
强制同步并修复槽位分配
在确认节点全部在线、无 fail 状态后,选择一个健康主节点作为操作入口:
- 用
CLUSTER ADDSLOTS手动补全缺失槽位(每次最多 1000 个,避免协议解析失败) - 若存在槽位冲突(
ERR Slot XXX is already busy),先查CLUSTER SLOTS定位当前持有者,再对其执行CLUSTER SETSLOT <slot> STABLE</slot>清除迁移中间态 - Redis 5.0+ 可尝试
redis-cli --cluster fix <node></node>自动收敛,但需提前备份 RDB
客户端侧快速恢复通信
服务端修复后,客户端仍可能因缓存旧 slot map 导致持续报错:
- JedisCluster、Lettuce 等 SDK 需主动调用
close()+ 重建连接,或触发refreshSlotsCache() - 临时绕过重定向逻辑:改用单节点直连模式(去掉
-c参数)验证键可读写,确认服务端已就绪 - 检查应用是否硬编码了 slot 计算(如 Lua 中调
CLUSTER KEYSLOT),这类代码在集群修复后仍需适配单节点场景










