2024-05-02
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1010627619

回答

在 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 响应中的信息更新其哈希槽映射,并向指定的新节点重发原始请求。

如下图: