Redis5 集群迁移方案

 

 

一、KEY优化

1.按原来要求进行优化与大KEY分拆。

二、现Redis 集群缩容(对业务无影响)

  1. 主节点按要求合并至3个主节点。
  2. 业务配置为3主4从
  3. 删除没有槽的主节点与相应从节点。

三、配置新Redis集群

  1. 按集群方式配置2个虚拟机或3台虚拟机(按最终集群要求,主从采用2个虚拟机,集群采用3台虚拟机,从节点先不建)。
  2. 增加监控。
  3. 测试,主集群备份RDB数据,复制至待迁移节点,查看过程时间与KEY数据是否相差不大。(测试脚本详细见附件)
  4. 把源集群至所有目标主节点的免密认证打开

四、正式迁移

  1. 关闭目标集群AOF与RDB备份文件。
  2. 更新配置回写至本地配置文件
  3. 关闭目标集群(注意非删除节点)
  4. 停止源集群(shudown save方式)
  5. 删除目标节点所有RDB文件与AOF文件。
  6. 复制源集群RDB至目标集群主节点(按主节点一一对应)。
  7. 启动目标集群
  8. 检查目标集群状态
  9. 核对目标集群与源集群KEY数量是否一至。
  10. 启动目标集群
  11. 开启所有集群AOF备份(从节点)
  12. 配置回写
  13. 修改业务模块Redis配置,并重启模块。
  14. 检查业务是否恢复。
  15. 更新完成

五、缩容与优化

  1. 等非本集群KEY过期与清理
  2. 按方案设计迁移槽点数量
  3. 修改模块Redis配置。
  4. 删除空主节点与增加相关从节点。

六、示例脚本

#!/bin/sh

#获取源集群KEY数量

r1=`redis-cli -c -h 192.168.115.106 -p 7000 info|grep db0:keys|awk -F "=" '{print$2}'|awk -F "," '{print$1}'`

r2=`redis-cli -c -h 192.168.115.108 -p 7004 info|grep db0:keys|awk -F "=" '{print$2}'|awk -F "," '{print$1}'`

r3=`redis-cli -c -h 192.168.115.107 -p 7002 info|grep db0:keys|awk -F "=" '{print$2}'|awk -F "," '{print$1}'`

echo $r1-$r2-$r3

#获取目标集群KEY数量

s1=`redis-cli -c -h 192.168.115.106 -p 8001 info|grep db0:keys|awk -F "=" '{print$2}'|awk -F "," '{print$1}'`

s2=`redis-cli -c -h 192.168.115.106 -p 8002 info|grep db0:keys|awk -F "=" '{print$2}'|awk -F "," '{print$1}'`

s3=`redis-cli -c -h 192.168.115.106 -p 8003 info|grep db0:keys|awk -F "=" '{print$2}'|awk -F "," '{print$1}'`

echo $s1-$s2-$s3

##关闭目标集群的AOF

redis-cli -c -h 192.168.115.106 -p 8001 CONFIG SET appendonly 'no'

redis-cli -c -h 192.168.115.106 -p 8002 CONFIG SET appendonly 'no'

redis-cli -c -h 192.168.115.106 -p 8003 CONFIG SET appendonly 'no'

#配置持久化到本地

redis-cli -c -h 192.168.115.106 -p 8001 CONFIG REWRITE

redis-cli -c -h 192.168.115.106 -p 8002 CONFIG REWRITE

redis-cli -c -h 192.168.115.106 -p 8003 CONFIG REWRITE

#关闭目标节点,如果有从节点,先关闭从节点

 

redis-cli -c -h 192.168.115.106 -p 8004 SHUTDOWN save

redis-cli -c -h 192.168.115.106 -p 8005 SHUTDOWN save

redis-cli -c -h 192.168.115.106 -p 8006 SHUTDOWN save

 

redis-cli -c -h 192.168.115.106 -p 8001 SHUTDOWN save

redis-cli -c -h 192.168.115.106 -p 8002 SHUTDOWN save

redis-cli -c -h 192.168.115.106 -p 8003 SHUTDOWN save

#清理目标集群AOF与RDB文件,主节点

rm -rf /dfs/redis5_test/8001/*.aof

rm -rf /dfs/redis5_test/8001/*.rdb

rm -rf /dfs/redis5_test/8002/*.aof

rm -rf /dfs/redis5_test/8002/*.rdb

rm -rf /dfs/redis5_test/8003/*.aof

rm -rf /dfs/redis5_test/8003/*.rdb

#源集群主节点备份

redis-cli -c -h 192.168.115.106 -p 7000 bgsave

redis-cli -c -h 192.168.115.108 -p 7004 bgsave

redis-cli -c -h 192.168.115.107 -p 7002 bgsave

#判断备份文件是否生成

i4=0

i4=`ls /dfs/redis_cluster/7000/dump.rdb |wc -l`

echo $i4

for i4 in {0}

do

sleep 5

i4=`ls /dfs/redis_cluster/7000/dump.rdb |wc -l`;

done

cp -rf /dfs/redis_cluster/7000/dump.rdb /dfs/redis5_test/8001/

 

i4=0

i4=`ssh 192.168.115.108 'ls /dfs/redis_cluster/7004/dump.rdb |wc -l'`

 

for i4 in {0}

do

sleep 5

i4=`ssh 192.168.115.108 'ls /dfs/redis_cluster/7004/dump.rdb |wc -l'`;

done

scp  192.168.115.108:/dfs/redis_cluster/7004/dump.rdb /dfs/redis5_test/8002/

 

i4=0

i4=`ssh 192.168.115.107 'ls /dfs/redis_cluster/7002/dump.rdb |wc -l'`

 

for i4 in {0}

do

sleep 5

i4=`ssh 192.168.115.107 'ls /dfs/redis_cluster/7002/dump.rdb |wc -l'`;

done

scp  192.168.115.107:/dfs/redis_cluster/7002/dump.rdb /dfs/redis5_test/8003/

 

#启动目标集群

redis-server /dfs/redis5_test/8001/redis.conf

redis-server /dfs/redis5_test/8002/redis.conf

redis-server /dfs/redis5_test/8003/redis.conf

#获取目标集群KEY数量

s1=`redis-cli -c -h 192.168.115.106 -p 8001 info|grep db0:keys|awk -F "=" '{print$2}'|awk -F "," '{print$1}'`

s2=`redis-cli -c -h 192.168.115.106 -p 8002 info|grep db0:keys|awk -F "=" '{print$2}'|awk -F "," '{print$1}'`

s3=`redis-cli -c -h 192.168.115.106 -p 8003 info|grep db0:keys|awk -F "=" '{print$2}'|awk -F "," '{print$1}'`

echo $s1-$s2-$s3

七、注意事项

集群槽要对槽