回答
在 Redis Cluster 中,客户端请求路由有三种:
- MOVED 重定向: MOVED 重定向是最常见的路由方式。当客户端向任意 Redis 节点发送请求,如果该节点不负责该请求的槽,则它会返回一个 MOVED 错误,附带正确节点的地址(目标节点),则客户端向目标节点发送请求。
- ASK 重定向:ASK 重定向用于 Redis Cluster 正在进行哈希槽重分配过程的一种临时方案。当一个哈希槽正在从一个节点迁移到另外一个节点,而客户端发送的请求恰好落在这个迁移的哈希槽上,则源节点会返回一个 ASK 错误,指示客户端这个请求应临时发送到目标节点。
- Smart 客户端:Smart 客户端会独立维护一份集群的节点和哈希槽映射表,并能够自动处理 MOVED 和 ASK 重定向,无需手动干预。而且当某个节点与槽的映射关系发生改变时,客户端也会及时更新。
扩展
MOVED重定向
MOVED 重定向的过程如下:
- 客户端基于本地的哈希槽与节点的映射关系,向“目标节点”发送请求。
- 节点收到请求后,根据公式
CRC16(key) mod 16384
计算该 key 的槽,然后判断该槽是否为本节点负责 - 如果是的话,则直接执行命令,否则返回一个 MOVED 错误响应,格式为:
MOVED <hash-slot> <ip>:<port>
。 - 客户端根据 MOVED 响应中的信息更新其哈希槽映射,并向指定的新节点重发原始请求。
如下图: