CLUSTER SETSLOT
将哈希槽绑定到节点。
语法
CLUSTER SETSLOT slot
引入版本:3.0.0
复杂度摘要:O(1)
CLUSTER SETSLOT 负责以不同的方式改变接收节点中哈希槽的状态。它可以,具体取决于所使用的子命令:
MIGRATING子命令:设置迁移状态的哈希槽。IMPORTING子命令:设置导入状态下的哈希槽。STABLE子命令:清除哈希槽中的任何导入/迁移状态。NODE子命令:将哈希槽绑定到不同的节点。
该命令及其子命令集对于启动和结束集群实时重新分片操作非常有用,这些操作是通过在源节点中设置处于迁移状态的哈希槽并在目标节点中导入状态来完成的。
每个子命令记录如下。最后,您将找到如何使用此命令和其他相关命令执行实时重新分片的描述。
必需参数
slot
要配置的哈希槽。
IMPORTING node-id | MIGRATING node-id | NODE node-id | STABLE
要设置的槽状态:IMPORTING 从给定节点导入槽,MIGRATING 将其迁移到给定节点,NODE 将槽分配给给定节点,或 STABLE 清除任何导入或迁移状态。
详细说明
MIGRATING destination-node-id
该子命令将槽设置为迁移状态。接收命令的节点必须拥有该哈希槽;否则,Redis 将返回错误。当槽位处于迁移状态时,节点处理命令如下:
- 如果该命令访问现有键,Redis 会正常处理该命令。
- 如果命令访问不存在的键,Redis 将返回 ASK 重定向到目标节点。客户端应该仅在目标节点上重试该命令,并且不应更新其哈希槽映射。
- 如果命令访问多个key,Redis根据key存在的数量来处理:
- 如果没有任何键存在,Redis 将返回 ASK 重定向。
- 如果所有键都存在,Redis 将正常处理该命令。
- 如果只有部分键存在,Redis 将返回 TRYAGAIN 错误。客户端应在相关键完成迁移到目标节点后重试。
IMPORTING source-node-id
该子命令是MIGRATING 的逆命令。它准备目标节点从指定的源节点导入键。仅当目标节点尚未拥有指定的哈希槽时,该命令才有效。
当插槽处于 importing 状态时,节点按如下方式处理该插槽的命令:
当迁移节点返回ASK重定向时,客户端联系目标节点,发送ASKING,然后发送重定向命令。这使得目标节点可以处理源节点上不存在的键以及已迁移的键的命令。
此行为提供了三个保证:
- Redis在目标节点上创建新的key,因此迁移只需要移动现有的key。
- Redis 处理目标节点上已迁移键的命令,目标节点将成为新的哈希槽所有者。
- 如果没有
ASKING,Redis 继续返回MOVED重定向。这可以防止具有过时或不正确哈希槽映射的客户端意外写入目标节点并创建尚未迁移的键的第二个版本。
STABLE
该子命令仅清除插槽中的迁移/导入状态。它主要用于修复由 redis-cli --cluster fix 卡在错误状态的集群。通常,这两种状态会在迁移结束时使用 SETSLOT NODE ... 子命令自动清除,如下一节所述。
NODE node-id
该子命令将哈希槽与指定节点关联。该子命令具有最复杂的行为,因为它仅在特定情况下有效,并且根据插槽状态可能会产生不同的副作用。
该命令有以下前提条件和副作用:
- 如果接收命令的节点当前拥有该哈希槽,并且该命令将该槽分配给其他节点,并且接收节点仍包含该槽的键,则 Redis 将返回错误。
- 如果槽处于
migrating状态,Redis 在将该槽分配给另一个节点时会清除该状态。 - 如果接收命令的节点上的槽处于
importing状态,并且该命令将该槽分配给同一节点,则 Redis: - 清除importing状态。 - 创建一个新的配置纪元并将其分配给该节点,除非该节点已经具有集群中最大的配置纪元。
第三种情况发生在哈希槽重新分片操作结束时的目标节点上。新的配置纪元使节点的哈希槽所有权优先于由故障转移或先前槽迁移创建的早期配置。
这是 Redis 集群节点在未经其他节点同意的情况下创建新配置纪元的唯一情况。它仅在手动配置更改期间发生。 Redis Cluster 仍然通过使用其配置纪元冲突解决算法来防止具有相同配置纪元的节点之间发生持久冲突。
Redis集群实时重新分片解释
CLUSTER SETSLOT 命令是 Redis 集群使用的一个重要部分,用于将一个哈希槽中包含的所有键从一个节点迁移到另一个节点。这就是在其他命令的帮助下协调迁移的方式。我们将当前拥有哈希槽所有权的节点称为 source 节点,将要迁移的节点称为 destination 节点。
- 使用
CLUSTER SETSLOT <slot> IMPORTING <source-node-id>将目标节点插槽设置为 导入 状态。 - 使用
CLUSTER SETSLOT <slot> MIGRATING <destination-node-id>将源节点插槽设置为 迁移 状态。 - 使用
CLUSTER GETKEYSINSLOT命令从源节点获取键,并使用MIGRATE命令将它们移动到目标节点。 - 发送
CLUSTER SETSLOT <slot> NODE <destination-node-id>到目的节点。 - 发送
CLUSTER SETSLOT <slot> NODE <destination-node-id>到源节点。 - 发送
CLUSTER SETSLOT <slot> NODE <destination-node-id>到其他主节点(可选)。
笔记:
- 步骤 1 和 2 的顺序很重要。当源节点配置为重定向时,我们希望目标节点准备好接受
ASK重定向。 - 步骤 4 和 5 的顺序很重要。目标节点负责将更改传播到集群的其余部分。如果源节点在目标节点之前收到通知,并且目标节点在将其设置为新槽所有者之前崩溃,则即使在成功故障转移之后,该槽也将没有所有者。
- 步骤 6(将
SETSLOT发送到未参与重新分片的节点)在技术上并不是必需的,因为配置最终会自行传播。然而,这样做是一个好主意,以便尽快阻止节点指向移动的哈希槽的错误节点,从而减少找到正确节点的重定向。
Redis Software 与 Redis Cloud 兼容性
| Redis 软件 |
Redis Cloud |
说明 |
|---|---|---|
| ❌ 标准 |
❌ 标准 |
返回值
RESP2
简单字符串回复:如果命令成功,所有子命令都返回OK。否则返回错误。
RESP3
简单字符串回复:如果命令成功,所有子命令都返回OK。否则返回错误。
资料来源:Redis 官方 CLUSTER SETSLOT 文档;中文内容参考 Redis 文档许可。