现在网上大都是基于3.x和4.x的迁移方案;他们通常是使用唯品会开源的redis-migrate-tool实现
但是我亲测,在两个redis cluster都是5.x的情况下,迁移是失败的。
https://github.com/tanruixing88/redis-migrate-tool

redis5.x集群数据迁移方案如下:
最终方案如下
1.将要创建新集群的redis服务一个一个加入旧redis集群中,
2.将旧redis集群的master槽位移动到新加入集群的redis机器中
3.将旧集群的redis服务一个一个关闭

旧redis集群如下:
旧redis集群是三主三从

外部IP

内部IP

PORT

角色

10.74.20.13

192.168.3.6

7000

master

10.74.20.13

192.168.3.6

7001

master

10.74.20.13

192.168.3.6

7002

master

10.74.20.13

192.168.3.6

7003

slave 是port 7002的从节点

10.74.20.13

192.168.3.6

7004

slave 是port 7000的从节点

10.74.20.13

192.168.3.6

7005

slave 是port 7001的从节点

新reids地址如下:

外部IP

内部IP

PORT

10.74.20.13

192.168.3.6

7000

10.74.20.13

192.168.3.6

7001

10.74.20.13

192.168.3.6

7002

10.74.20.13

192.168.3.6

7003

10.74.20.13

192.168.3.6

7004

10.74.20.13

192.168.3.6

7005

数据迁移后redis集群结果如下:
新redis集群数据迁移后也是三主三从

外部IP

内部IP

PORT

角色

10.74.20.14

192.168.3.7

8000

master

10.74.20.14

192.168.3.7

8001

slave 是port 8000的从节点

10.74.20.14

192.168.3.7

8002

mater

10.74.20.14

192.168.3.7

8003

slave 是port 8002的从节点

10.74.20.14

192.168.3.7

8004

master

10.74.20.14

192.168.3.7

8005

slave 是port 8004的从节点

一:将新redis加入集群中

在旧redis集群中,找个redis客户端执行下面命令

**步骤一:**先加入一台redis机器

# redis-cli --cluster add-node 新机器IP:port 集群中的一台机器IP:port
/usr/local/redis/bin/redis-cli --cluster add-node 10.74.20.14:8000 10.74.20.13:7000

redis迁移数据 rediscluster数据迁移方法_redis迁移数据


在新redis机器10.74.20.14 的redis客户端命令行查看

redis迁移数据 rediscluster数据迁移方法_redis迁移数据_02


通过上面,可以看出新机器已经加入进集群,但是并没有分配hash槽位数据

步骤二:重新分配哈希槽

原理是:把原redis集群的一个master角色的redis槽位的数据迁移到该新加入的redis服务中
下面用颜色标注出对应的关系

#redis-cli --cluster reshard 新机器IP:port
 /usr/local/redis/bin/redis-cli --cluster reshard 10.74.20.14:8000

redis迁移数据 rediscluster数据迁移方法_redis集群_03


执行后的结果如下

在redis集群的任意一个redis的客户端上执行如下命令:

CLUSTER NODES

redis迁移数据 rediscluster数据迁移方法_IP_04

设置主从

先加入一台新的redis机器

# redis-cli --cluster add-node 新机器IP:port 集群中的一台机器IP:port
/usr/local/redis/bin/redis-cli --cluster add-node 10.74.20.14:8001 10.74.20.13:7000

指定8001从节点的主节点ID,这里我们填写8000服务节点ID

# cluster replicate 
cluster replicate f0462a41c86a7fb736be72f0db20775163296701

查看集群

CLUSTER NODES

由于当时做实验,没有截图,后面补上的。红线划掉的不要纠结,那是我后面把旧机器关闭,留下的,不想给大家产生争议。

redis迁移数据 rediscluster数据迁移方法_redis_05

步骤三

按照上面的步骤一道步骤二,把全部新redis机器加入集群,把master数据迁移,并且设置好对应从节点。

步骤四

把旧redis集群中的每个redis实例关闭
进入每个旧redis集群机器中执行

SHUTDOWN

步骤五

验证集群是否OK
进入新集群,登录任意一个redis客户端
执行

# 进入客户端
 /usr/local/redis/bin/redis-cli -p 8002 -c
 CLUSTER INFO

redis迁移数据 rediscluster数据迁移方法_redis_06

CLUSTER NODES

redis迁移数据 rediscluster数据迁移方法_IP_07

随便查询几个key,看能不能查看,这里有个小主意点,如果是slave节点,理论上也可以从slave节点查到数据,但是集群模式下默认会去mater节点拿数据。如果想数据在slave上有的话直接拿,先执行readonly 再执行get xx 就可直接从slave节点拿到数据

参考文档:

https://blog.51cto.com/phpme/2447995