Redis:为什么移动到另一个主机

Redis: why MOVED to another master

我有一个 Redis 集群 - 3 个主节点和 3 个从节点。该集群包含约 300 个密钥(foo0 - foo300)。我知道每个 master 负责特定的数据子集,并且可以将客户端重定向到正确的节点并出现 MOVED 错误。

但是,如果我向 GET 不存在的 键发送请求(比如 klsdkasoqwerty123 ...)从主人那里,我也被转移到另一个节点。我很困惑。谁能解释为什么会这样?

为了说的清楚,我们定义两种主节点:

  1. 已连接节点:您的客户端连接到的节点,您正在向该节点发送GET命令。
  2. 目标节点:给定键应该所在的节点,即您被重定向或移动到的节点。

因为已连接节点只有slot-mapping信息,即给定的键应该位于目标节点。但是,它不知道 知道给定的密钥是否存在于目标节点

因此 已连接节点 必须首先将客户端重定向到 目标节点,即使用 MOVED 错误消息提供 目标节点 的 IP 和端口信息。然后客户端发送另一个 GET 命令到 目标节点 以检查给定的密钥是否真的存在。

一个键,无论它是否实际存在,都通过对其名称(或其部分,a.k.a 标签)进行哈希处理映射到一个插槽。插槽被分配给主控器,主控器首先检查键的 "belongingness" 到它(根据当前插槽范围分配),然后才执行任何其他操作。