环境:
- 系统:CentOs 6.5
- redis:redis-3.2.11
- 集群:cluster集群;3主(8000-8002)3从(8003-8005)
一:空槽道迁移
1 .初始槽道分配状态
2. 目标节点(8001)导入槽道10923,源节点为8002(目标节点的二级制不会变,数组当前10023槽道变为导入状态)
- 在8001上登录:redis-cli -c -p 8001
- cluster setslot 10923 importing 源节点id
- cluster setslot 10923 importing be50665e4b57a603ab3bf766c8adfa0646457840
3.查看节点槽道状态(此时8001节点槽道会变化,但是其他节点中并没有变化)
-
8001
-
其他节点
4.源节点(8002)导出槽道10923(源节点二进制不变,数组当前10023槽道变为导出状态)
在8002上登录操作:redis-cli -c -p 8002
cluster setslot 10923 migrating 目标节点
cluster setslot 10923 migrating 7f8dca727d91b8bc31fdc2c58e04cee293904c7c
5.查看节点槽道状态(此时8002节点槽道会变化,其他节点并没有变化)
- 8002
- 8001
- 其他节点
6.取消槽道迁移(在没有通知集群中具有槽道管理权的节点迁移之前可以取消槽道迁移)
cluster setslot 10923 stable
7.通知所有集群具有槽道管理权主节点槽道迁移了(所有的节点,数组发生变化)
- 通知8001节点:
cluster setslot 10923 node 7f8dca727d91b8bc31fdc2c58e04cee293904c7c
- 通知8002节点:
cluster setslot 10923 node 7f8dca727d91b8bc31fdc2c58e04cee293904c7c
- 其他节点:会自动同步
二:非空槽道迁移
- 按照以上内容,可以进行无数据槽道进行迁移,但是有数据槽道则还需要进行数据的迁移
示例:name存储在5798槽道上,对5798槽道从8001节点迁移到8002节点
1、目标节点8002导入槽道
cluster setslot 5798 importing 7f8dca727d91b8bc31fdc2c58e04cee293904c7c
2、源节点8001导出槽道
cluster setslot 10923 migrating bf708c933a39e9da69a6325230bc2161f3edae46
3、将槽道的数据迁移到目标节点(需要登录到源节点迁移数据)
- 1.确定当前槽道包含的所有key(5798)
cluster getkeysinslot 5798 500 查看5798上500个范围内所有的key
- 2.将获取到的key进行迁移,从8001迁移到8002
migrate 目标节点ip 目标端口 "" 0 500 keys name(如果是多个key直接拼接,空格隔开)
- "":表示key的匹配,可以使用正则
- 0:表示迁移到目标节点的database(0-15)
- 500:表示超时时间,单位毫秒
- keys:标签确定迁移的key值名称
- name:key值
本例中:migrate 10.9.58.60 8002 "" 0 500 keys name
4.所有主节点通知更新数据(槽道迁移)
- 8001:
cluster setslot 5798 node bf708c933a39e9da69a6325230bc2161f3edae46
- 8002:
cluster setslot 5798 node bf708c933a39e9da69a6325230bc2161f3edae46
- 8003:
cluster setslot 5798 node bf708c933a39e9da69a6325230bc2161f3edae46