CLUSTER SETSLOT
CLUSTER SETSLOT slot <IMPORTING node-id | MIGRATING node-id | NODE node-id | STABLE>
- Available since:
- 3.0.0
- Time complexity:
- O(1)
- ACL categories:
-
@admin
,@slow
,@dangerous
,
CLUSTER SETSLOT
负责以不同的方式改变接收节点中哈希槽的状态。根据使用的子命令,它可以:
MIGRATING
子命令:将哈希槽设置为迁移中状态。IMPORTING
子命令:将哈希槽设置为导入状态。STABLE
子命令:清除哈希槽中的任何导入/迁移状态。NODE
子命令:将哈希槽绑定到不同的节点。
该命令及其一组子命令对于启动和结束集群实时重分片操作非常有用,这些操作通过将源节点中的哈希槽设置为迁移状态,并在目标节点中设置为导入状态来完成。
每个子命令的文档如下。最后,您将找到关于如何使用此命令和其他相关命令执行实时重新分片的描述。
CLUSTER SETSLOT
MIGRATING
此子命令将插槽设置为迁移中状态。要将插槽设置为此状态,接收命令的节点必须是哈希插槽的所有者,否则将返回错误。
当一个槽位被设置为迁移状态时,节点会以以下方式改变行为:
- 如果接收到关于现有键的命令,该命令将按通常方式处理。
- 如果接收到关于一个不存在的键的命令,节点会发出一个
ASK
重定向,要求客户端仅将该特定查询重试到destination-node
。在这种情况下,客户端不应更新其哈希槽到节点的映射。 - 如果命令包含多个键,在没有任何键存在的情况下,行为与第2点相同;如果所有键都存在,则与第1点相同;然而,如果只有部分键存在,命令会发出
TRYAGAIN
错误,以便感兴趣的键完成迁移到目标节点,从而可以执行多键命令。
CLUSTER SETSLOT
导入
此子命令与MIGRATING
相反,用于准备目标节点从指定的源节点导入键。该命令仅在节点尚未拥有指定哈希槽的情况下有效。
当一个槽位被设置为导入状态时,节点的行为会以下列方式改变:
- 关于此哈希槽的命令将被拒绝,并像通常一样生成一个
MOVED
重定向,但如果该命令跟随一个ASKING
命令,则在这种情况下该命令将被执行。
这样,当处于迁移状态的节点生成一个ASK
重定向时,客户端会联系目标节点,发送ASKING
,然后立即发送命令。这样,关于旧节点中不存在的键或已经迁移到目标节点的键的命令会在目标节点上执行,因此:
- 新键总是在目标节点中创建。在哈希槽迁移期间,我们只需要移动旧键,而不是新键。
- 关于已经迁移的键的命令在迁移目标的节点上下文中被正确处理,即新的哈希槽所有者,以保证一致性。
- 在没有
ASKING
的情况下,行为与通常相同。这保证了具有损坏的哈希槽映射的客户端不会在目标节点上写入错误,从而创建一个尚未迁移的键的新版本。
CLUSTER SETSLOT
STABLE
此子命令仅清除插槽中的迁移/导入状态。它主要用于通过redis-cli --cluster fix
修复集群卡在错误状态的情况。通常,这两种状态会在迁移结束时使用SETSLOT ... NODE ...
子命令自动清除,如下一节所述。
CLUSTER SETSLOT
NODE
NODE
子命令是语义最复杂的一个。它将哈希槽与指定的节点关联起来,然而该命令仅在特定情况下有效,并且根据槽的状态会产生不同的副作用。以下是该命令的前提条件和副作用的集合:
- 如果当前哈希槽的所有者是接收命令的节点,但由于命令的效果,该槽将被分配给另一个节点,如果接收命令的节点中仍有该哈希槽的键,则命令将返回错误。
- 如果槽处于迁移中状态,当槽被分配给另一个节点时,状态将被清除。
- 如果槽位在接收命令的节点中处于导入状态,并且该命令将槽位分配给此节点(这发生在从一个节点到另一个节点的哈希槽重新分片结束时的目标节点中),该命令具有以下副作用:A) 导入状态被清除。B) 如果节点的配置纪元尚未是集群中最大的,它将生成一个新的配置纪元并将其分配给自己。这样,它的新哈希槽所有权将胜过之前由故障转移或槽位迁移创建的任何旧配置。
需要注意的是,步骤3是Redis集群节点唯一一次在没有其他节点同意的情况下创建新配置纪元的时间。这仅在手动配置操作时发生。然而,由于Redis集群使用了配置纪元冲突解决算法,这种情况不可能创建一个非瞬态设置,其中两个节点具有相同的配置纪元。
Redis 集群实时重新分片解释
CLUSTER SETSLOT
命令是 Redis 集群中用于将一个哈希槽中的所有键从一个节点迁移到另一个节点的重要部分。这是如何通过其他命令的帮助来协调迁移的。我们将当前拥有哈希槽的节点称为 source
节点,而我们要迁移到的节点称为 destination
节点。
- 使用
CLUSTER SETSLOT
将目标节点槽设置为导入中状态。IMPORTING - 使用
CLUSTER SETSLOT
将源节点槽设置为迁移中状态。MIGRATING - 使用
CLUSTER GETKEYSINSLOT
命令从源节点获取键,并使用MIGRATE
命令将它们移动到目标节点。 - 向目标节点发送
CLUSTER SETSLOT
。NODE - 向源节点发送
CLUSTER SETSLOT
。NODE - 向其他主节点发送
CLUSTER SETSLOT
(可选)。NODE
注释:
- 步骤1和步骤2的顺序很重要。我们希望当源节点配置为重定向时,目标节点已经准备好接受
ASK
重定向。 - 步骤4和5的顺序很重要。 目标节点负责将更改传播到集群的其余部分。 如果在目标节点之前通知源节点,并且目标节点在设置为新槽所有者之前崩溃,那么即使成功进行了故障转移,该槽也会没有所有者。
- 步骤6,向未参与重新分片的节点发送
SETSLOT
,在技术上并不是必须的,因为配置最终会自行传播。 然而,这样做是一个好主意,以便尽快停止节点指向错误的节点,从而减少找到正确节点的重定向次数。
RESP2/RESP3 回复
Simple string reply: all the sub-commands returnOK
if the command was successful. Otherwise an error is returned.