cluster setslot
CLUSTER
CLUSTER SETSLOT slot IMPORTING|MIGRATING|STABLE|NODE [node-id]
自3.0.0起可用。
时间复杂度:
O(1)
CLUSTER SETSLOT 负责以不同方式更改接收节点中散列槽的状态。它可以取决于所使用的子命令:
1. MIGRATING
子命令:设置迁移
状态下的散列槽。
2. IMPORTING
子命令:在导入
状态下设置哈希槽。
3. STABLE
子命令:清除散列槽中的任何导入/迁移状态。
4. NODE
子命令:将哈希槽绑定到不同的节点。
该命令及其子命令集对于启动和结束集群实时重新分片操作很有用,它通过在源节点中设置迁移状态的哈希槽以及在目标节点中导入状态来完成。
下面介绍了每个子命令。最后你会找到如何使用这个命令和其他相关命令执行实时重新分片的描述。
CLUSTER SETSLOT <slot>迁移<destination-node-id>
此子命令将一个插槽设置为迁移
状态。为了在此状态下设置一个插槽,接收命令的节点必须是散列插槽的所有者,否则会返回错误。
当插槽设置为迁移状态时,节点将按以下方式更改行为:
1. 如果收到关于现有密钥的命令,则通常会处理该命令。
2. 如果收到有关不存在的密钥的命令ASK
,节点将发出重定向,要求客户端仅重试该特定查询destination-node
。在这种情况下,客户端不应该将其哈希槽更新为节点映射。
3. 如果命令包含多个键,如果不存在,则行为与点2相同(如果全部存在),则与点1相同,但如果只存在部分键数,则该命令将按TRYAGAIN
顺序发出错误对于有兴趣完成迁移到目标节点的密钥,以便可以执行多密钥命令。
集群SETSLOT <slot>导入<source-node-id>
此子命令反转MIGRATING
并准备目标节点以从指定的源节点导入密钥。该命令仅适用于节点尚不是指定散列槽的所有者的情况。
当插槽在导入状态下设置时,节点以下列方式更改行为:
1. 关于这个散列槽的命令将被拒绝,并且MOVED
通常会生成重定向,但是在命令跟在命令后面的ASKING
情况下,将执行该命令。这样,当处于迁移状态的节点生成ASK
重定向时,客户端会联系目标节点ASKING
发送命令并立即发送命令。通过这种方式命令旧节点中不存在的密钥或已迁移到目标节点的密钥在目标节点中执行,以便:
2. 新密钥始终在目标节点中创建。在散列槽迁移期间,我们必须只移动旧密钥,而不是新密钥。
3. 为了保证一致性,已经迁移的关键字命令在作为迁移目标的节点(新散列槽所有者)的上下文中正确处理。
4. 没有ASKING
这种行为就像平时一样。这可以确保具有散列槽插入映射的客户端不会在目标节点中写入错误,从而创建尚未被迁移的新版本密钥。
集群SETSLOT <slot>稳定
此子命令仅清除插槽中的迁移/导入状态。它主要用于修复被错误状态redis-trib fix
卡住的簇。通常在迁移结束时使用SETSLOT ... NODE ...
子命令自动清除这两个状态,如下一节所述。
集群SETSLOT <slot>节点<node-id>
NODE
子命令是具有最复杂语义的子命令。它将哈希槽与指定节点相关联,但该命令仅在特定情况下起作用,并且根据槽状态具有不同的副作用。以下是该命令的一组前置条件和副作用:
1. 如果当前哈希槽所有者是接收命令的节点,但为了实现该命令,该槽将被分配给不同的节点,如果在接收该命令的节点中仍存在该哈希槽的密钥,则该命令将返回错误。
2. 如果插槽处于迁移
状态,则当插槽分配给另一个节点时,该状态将被清除。
3. 如果插槽在接收命令的节点中处于导入
状态,并且该命令将该插槽分配给该节点(在从一个节点到另一个节点的散列插槽重新分割结束时发生在目标节点中),则该命令具有以下副作用:A)导入
状态被清除。B)如果节点配置历元还不是最大的群集,它会生成一个新的配置历元,并为其自身分配新的配置历元。这样,其新的哈希槽所有权将胜过以前的故障转移或槽迁移创建的任何过去的配置。
需要注意的是,步骤3是 Redis 集群节点在未经其他节点同意的情况下创建新配置历元的唯一时间。这仅在手动配置运行时发生。然而,这是不可能的,因为 Redis 集群使用配置时期冲突解决算法,所以这会创建一个非瞬时设置,其中两个节点具有相同的配置时期。
返回值
简单字符串回复:OK
如果命令成功,则所有子命令都会返回。否则会返回错误。
Redis集群实时重新解析解释
CLUSTER SETSLOT 命令是 Redis Cluster 使用的一个重要组件,用于将一个哈希槽中包含的所有密钥从一个节点迁移到另一个节点。这就是迁移如何在其他命令的帮助下进行编排的。我们将调用当前散列槽所有权的source
节点以及我们想要迁移destination
节点的节点。
1. 使用CLUSTER SETSLOT <slot> IMPORTING <source-node-id>将目标节点插槽设置为导入状态。
2. 使用CLUSTER SETSLOT <slot> MIGRATING <destination-node-id>将源节点插槽设置为迁移状态。
3. 使用 CLUSTER GETKEYSINSLOT 命令从源节点获取密钥,并使用 MIGRATE 命令将它们移动到目标节点中。
4. 使用CLUSTER SETSLOT <slot> NODE <destination-node-id>源或目标。
注意:
- 步骤1和2的顺序很重要。我们希望目标节点
ASK
在源节点配置为重定向时准备好接受重定向。
- 步骤4在技术上不需要使用
SETSLOT
在不涉及重新分割的节点中使用,因为配置最终会自我传播,但是这样做是一个好主意,以便阻止节点在被移动的散列插槽时指向错误的节点尽快,导致更少的重定向找到正确的节点。