集群搭建参考我上片文章
https://blog.csdn.net/sinat_36759535/article/details/106605884
现在网上大都是基于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机器10.74.20.14 的redis客户端命令行查看
通过上面,可以看出新机器已经加入进集群,但是并没有分配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集群的任意一个redis的客户端上执行如下命令:
CLUSTER NODES
设置主从
先加入一台新的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机器加入集群,把master数据迁移,并且设置好对应从节点。
步骤四
把旧redis集群中的每个redis实例关闭
进入每个旧redis集群机器中执行
SHUTDOWN
步骤五
验证集群是否OK
进入新集群,登录任意一个redis客户端
执行
# 进入客户端
/usr/local/redis/bin/redis-cli -p 8002 -c
CLUSTER INFO
CLUSTER NODES
随便查询几个key,看能不能查看,这里有个小主意点,如果是slave节点,理论上也可以从slave节点查到数据,但是集群模式下默认会去mater节点拿数据。如果想数据在slave上有的话直接拿,先执行readonly 再执行get xx 就可直接从slave节点拿到数据
参考文档:
https://blog.csdn.net/QwQNightmare/article/details/105030277
https://blog.51cto.com/phpme/2447995
https://blog.csdn.net/jo_andy/article/details/97291190