← 中文资源

简体中文版本

Redis MOVED 重定向 — 修复集群槽位路由错误

通过 CLUSTER INFO、CLUSTER SLOTS 与 --cluster check 核对槽位归属和节点通告地址,定位 Redis Cluster MOVED 错误并让客户端正确刷新拓扑。

阅读英文原文

现象

执行命令返回 MOVED 3999 10.0.0.12:6379 而不是结果;部分 key 正常、部分 key 失败;故障切换、扩容或 DNS 变更后集中出现;客户端重连到同一节点后继续收到 MOVED。

诊断

先用支持集群模式的 CLI 复现:

redis-cli -c -h 10.0.0.10 -p 6379 get user:42
redis-cli -h 10.0.0.10 -p 6379 CLUSTER INFO
redis-cli -h 10.0.0.10 -p 6379 CLUSTER SLOTS
redis-cli --cluster check 10.0.0.10:6379

-c 会自动跟随重定向,如果它能取到值,说明集群本身正常,问题在应用客户端。CLUSTER INFO 中 cluster_state 必须为 ok,cluster_slots_assigned 应为 16384;CLUSTER SLOTS 和 CLUSTER NODES 的地址列必须是应用网络可达的地址,Docker、Kubernetes 或 NAT 环境常错误地通告容器内网 IP。

修复

使用支持集群模式的客户端,配置多个种子节点并开启拓扑刷新;在每个节点上设置 cluster-announce-ip 与 cluster-announce-port 为应用可达地址。扩容或迁移槽位后,让客户端刷新槽位缓存或重启连接池。不要用普通 TCP 负载均衡器把流量转发到单个集群节点并期望它按槽位路由;需要代理时选择理解集群拓扑的组件。

MOVED 是路由指令而不是数据错误:接收节点算出 key 所属槽位,发现由其他 master 负责,便返回目标地址。独立模式客户端会把它当成错误,缓存过期的集群客户端则会反复询问旧主节点。

验证

运行 redis-cli --cluster check,确认所有槽位都有归属且各节点视图一致;然后通过应用读写落在不同槽位的 key,并在副本上执行 CLUSTER FAILOVER 触发切换,客户端应只出现短暂重试后恢复。若持续出现 MOVED 或 CLUSTERDOWN,说明拓扑未刷新或通告地址仍然错误。