679 字
3 分钟
Redis Cluster 的 MOVED 和 ASK 重定向有什么区别?
Redis Cluster 客户端通常缓存槽位到节点的映射,并直接把请求发给目标节点。映射过期或槽位正在迁移时,节点可能返回重定向:MOVED 表示应按新的槽位归属访问,ASK 表示这一次请求需要临时去另一个节点。
正常归属变化与迁移状态
槽位已经由 B 负责,客户端却仍向 A 请求时,A 返回 MOVED,包含槽位与目标地址。客户端据此更新路由,必要时刷新完整拓扑;之后对该槽位的请求也应发往 B。
槽位迁移过程中,A 处于 MIGRATING,B 处于 IMPORTING。一部分 Key 已转移到 B,另一部分还在 A。A 如果仍有请求的 Key,可以直接处理;如果该 Key 不在 A,需要通过 ASK 让客户端去 B,并先在同一连接发送 ASKING,使 B 接受这一次尚未完成归属切换的访问。不能因为一次 ASK 就永久把该槽位路由改成 B。
| 响应 | 客户端主要行为 |
|---|---|
| MOVED | 重试目标节点,并更新槽位路由 |
| ASK | 临时访问目标,在同一连接先发 ASKING,不据此永久改路由 |
| TRYAGAIN | 某些迁移中多 Key 情况暂时无法处理,按策略有限重试 |
为什么业务需要集群客户端?
普通单节点客户端可能直接把这些错误交给应用。集群客户端需管理槽位映射、连接池、重试与拓扑刷新,同时保留超时和幂等边界。重定向说明这个节点未按常规路径处理该请求,但一般网络超时的结果可能不确定;非幂等命令不能把所有异常都当成“没执行过”。
常见追问
MOVED 永远不会再变吗?
会再变。它表示当时的归属信息,未来扩缩容和切主仍可能改变映射。缓存路由应能根据新重定向刷新。
ASKING 后所有请求都可以随便访问目标节点吗?
不是。它是针对后续一次请求的迁移访问授权,需要同一连接,不能把它当成关闭槽位检查的全局开关。
扩容是否只增加一个空节点就结束?
不是。需要分配或迁移槽位,迁移数据,再完成归属切换;过程涉及重定向、网络与单 Key 搬迁成本。
Gossip 会把用户的 Value 复制到所有节点吗?
不会。Gossip 主要交换节点状态和集群信息,业务数据按槽位分片,并由负责该分片的主节点复制给其副本。
Redis Cluster 的 MOVED 和 ASK 重定向有什么区别?
https://blog.xqcherry.top/posts/interview/redis/redis-cluster-moved-ask/ 目录