空槽道迁移(10923槽道)
○ 判断10923是否为空槽道,就是检查10923map的key是否对应一批key值
127.0.0.1:8002> cluster getkeysinslot 10923 500
(empty list or set)
○ 目标节点(8001)导入槽道(目标节点中二进制不变, 数组当前槽道的状态 变为导入) 正常状态是stable,槽道有四种状态,stable,importing导入状态,migrating导出状态,deleted删除状态
cluster setslot 10923 importing 源节点id
在8001上登录,执行命令,10923就是操作的槽道,importing将8001上的数组的10923元素中的槽道状态修改为导入importing 跟着的是源节点id 8002的id
10.9.17.153:8001> cluster setslot 10923 importing 28d08aa5640c9544c3732551f971ede6bb432210
从8001检查当前集群的节点状态
○ 源节点(8002)导出槽道(源节点二进制不变,数组槽道状态变为导出)
登录8002执行迁出操作
cluster setslot 10923 migrating 目标节点id
10.9.17.153:8002> cluster setslot 10923 migrating dec454918ff966249a35ee4b2460c61cc09da709(8001的id)
通过cluster nodes观察到 8002的信息也发生了变化
槽道的状态是正常,导入,导出,都不影响数据的插入
数据微调的时候,集群不能对外提供服务;
数据迁移工作,在维护内容属于重大维护事项;
○ 通知所有集群当事人节点槽道迁移了(所有的节点,数组发生变化)
cluster setslot 10923 node 8001节点id 所有集群节点都执行这个操作
将所有集群节点通知到,10923从现在开始,归8001所有
10.9.17.153:8001> cluster setslot 10923 node dec454918ff966249a35ee4b2460c61cc09da709 (8001二进制10923下标的二进制从0变成1,数组变了)
10.9.17.153:8002> cluster setslot 10923 node dec454918ff966249a35ee4b2460c61cc09da709 (8002二进制从1变成0,数组变了)
在8003上执行操作,提示只能再master执行更新
从节点同步主节点的信息,包括数组,和数据的备份
检查集群节点状态
空槽道迁移成功了
非空槽道迁移(reshard命令不支持)
○ 判断5798槽道是否非空
127.0.0.1:8001> cluster getkeysinslot 5798 500
1) “name”
按照以上的内容,有数据的槽道可以迁移,但是数组保存着 map{槽道号:[keys]};所以,要迁移非空槽道,需要同步的将数据keys一并迁移;
name 存储在5798上,迁移5798(源节点8001)目标节点8002
○ 目标节点导入槽道
10.9.17.153:8002> cluster setslot 5798 importing dec454918ff966249a35ee4b2460c61cc09da709(源节点id)
○ 源节点导出槽道
10.9.17.153:8001> cluster setslot 5798 migrating 28d08aa5640c9544c3732551f971ede6bb432210(目标节点id)
○ 将槽道的数据迁移到目标节点(登录源节点迁移数据)
§ 确定当前槽道包含的所有key(5798)
8001>cluster getkeysinslot 5798 500
查看5798上500个范围内的所有key;
[root@10-9-17-153 redis-3.2.11]# redis-cli -h 10.9.17.153 -c -p 8001 (登录8001)
10.9.17.153:8001> cluster getkeysinslot 5798 5 (获取槽道保存的数组信息)
1) "name"
§ 将获取的key值,进行迁移,从8001迁移到8002
8001>migrate 目标节点ip 目标端口 "" 0 500 keys name
10.9.17.153:8001> migrate 10.9.17.153 8002 "" 0 500 keys name
"": 表示key的匹配; 可以使用正则(有待考证)
0: 表示迁移到目标节点的database(0-15)
500:连接超时毫秒
keys:标签确定迁移的key值名称
name:key
如果有多个key:keys name1 name2 name3 name4
除了key-value执行迁移,map记录{槽道:[key集合]}的内容一并迁移
○ 所有当事人节点通知更新数据(槽道迁移)
10.9.17.153:8001> cluster setslot 5798 node 28d08aa5640c9544c3732551f971ede6bb432210
10.9.17.153:8002> cluster setslot 5798 node 28d08aa5640c9544c3732551f971ede6bb432210
最后测试
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200227162507145.png)