手动迁移槽如此繁琐的操作,主要是理解一下整体的迁移流程,手动操作一次。
存在如下redis cluster环境:
查看cluster中所有key:
redis-cli -a 123456 -p 6480 -c --cluster call 127.0.0.1:6481 keys *
目前:
6486存在槽位:0-133 2730-2762 8192-8224
6480存在槽位:2763-5460
6482存在槽位:134-2729 5461-8191 10923-16383
6481存在槽位:8225-10922
name该key在6482中的5798槽位,想要将该槽位迁移到6486,步骤如下:
① 让6486节点准备导入槽5798数据:
注意:该操作需要登陆到6486执行,因为需要告诉6486将要导入该槽,但是下面的id为6482的id,因为该槽在6482上。
cluster setslot 5798 importing b83ff768941be3b3fc51c606d582bbdd833c935d //该id为6482的id
确认槽5798的状态:
cluster nodes
② 让6482节点准备导出槽数据:
注意:该操作需要登录到6482节点执行,因为该槽位在该节点上。
cluster setslot 5798 migrating 411180dee264b453bc230dbbf3a4ae35fdc0e2f1 //该id为6486的id
确认槽5798的导出状态开启:
cluster nodes
③ 批量获取5798槽对应的键:
注意:此操作要在6482节点上执行,因为此时槽位还在6482节点上,如果在其他节点执行则会返回(empty array)信息
cluster getkeysinslot 5798 200
可以看到只有一个name key
④ 迁移该key(此处只迁移了一个key):
注意:也需要在6482节点执行,原理同上。
migrate 127.0.0.1 6486 name 0 5000 auth 123456
查看name这个key
返回ASK转向错误,引导用户找到正确节点
此时5798槽还是处于导出的状态:
需要在所有主节点上通知该槽已经指派给了6486。
⑤ 更新5798槽信息:
在所有主节点执行(包括6486):
cluster setslot 5798 node 411180dee264b453bc230dbbf3a4ae35fdc0e2f1
如下:
127.0.0.1:6480> cluster setslot 5798 node 411180dee264b453bc230dbbf3a4ae35fdc0e2f1
127.0.0.1:6481> cluster setslot 5798 node 411180dee264b453bc230dbbf3a4ae35fdc0e2f1
127.0.0.1:6482> cluster setslot 5798 node 411180dee264b453bc230dbbf3a4ae35fdc0e2f1
127.0.0.1:6486> cluster setslot 5798 node 411180dee264b453bc230dbbf3a4ae35fdc0e2f1
再次查看槽位信息:
发现该槽位已经转移到了6486上。
补充:
1、
migrate 127.0.0.1 6486 name 0 5000 auth 123456
因为只迁移了一个key,所以迁移一个key的命令如下:
migrate host port key dbid timeout [copy | replace | auth password | auth2 username password]
迁移多个key的命令如下:
migrate host port "" dbid timeout [copy | replace | auth password | auth2 username password] keys ke1,key2,key3....,keyn
其中:
dbid:为数据库id,因为只有一个库所以为0;
timeout : 控制每次migrate操作的超时时间,默认为60000毫秒;
key:所迁移的key的名字;
"" :代表迁移多个key,后面的keys后面跟的是需要批量迁移的key的名字。
2、
现在比较简单了,可以直接使用命令来迁移。
redis-cli -a 123456 --cluster reshard 127.0.0.1:6386