[redis]redis cluster-集群数据迁移

Redis通过计算键的哈希,将键映射到槽来管理数据,集群中的每个节点负责槽的一部分。最大插槽数量为16384。

在集群节点对应的结构变量clusterNode中可以看到Slots数组,数组的大小为CLUSTER_SLOTS除以8,CLUSTER_SLOTS的值为16384:

集群状态

ClusterNode存储与节点相关的信息,集群数据迁移信息不存储在clusterNode中,但使用clusterState结构来保存它:

clusterState和clusterNode之间的关系

手动迁移数据时,您需要执行以下步骤:

在数据迁移之前,首先在需要移动的目标节点上使用SETSLOT命令来标记要将插槽从哪个节点移动到当前节点:

然后,在源节点(即插槽所在的节点)上,使用MIGRATING命令标记数据将移出到哪个节点:

例如,插槽1当前位于节点1中,需要移动到节点2。然后,首先在nodd2上执行IMPORTING命令,以标记该插槽准备好从node1移动到node2:

然后在节点1中执行迁移命令,以标记插槽1需要迁移到节点2:

集群命令

SETSLOT命令在clusterCommand函数中处理(在cluster.c文件中):

标记移入和移出节点后,可以使用CLUSTER GETKEYSINSLOT命令获取要移出的键:

& ltslot & gt:哈希槽的值

& ltcount & gt:移出的钥匙数量。

getkeysinslot命令的处理也在clusterCommand函数中,处理逻辑如下:

完成以上两步后,需要在源节点执行MIGRATE命令进行数据迁移。MIGRATE支持单个密钥和多个密钥的迁移。语法如下:

migrate命令

MIGRATE命令对应的处理函数在MIGRATE command中(在cluster.c文件中),处理逻辑如下:

创建转储有效负载

createDumpPayload函数在cluster.c文件中:

restore命令

目标节点接收到的迁移数据的处理逻辑在restoreCommand中(在cluster.c文件中):

在数据迁移的最后一步,需要使用CLUSTER SETSLOT命令,在源节点和目标节点上执行以下命令,标记插槽最终所属的节点,清除第一步中标记的迁移信息:

& ltslot & gt:哈希槽

& ltnode & gt:哈希槽最终所在的节点的id。

集群命令

集群集插槽& ltslot & gt节点& ltnode & gt命令处理仍然在clusterCommand函数中,处理逻辑如下:

摘要

涉及

极客时间-Redis源代码分析与实战(蒋德军)

Redis版本:redis-6.2.5