Redis——版本升级&数据迁移

摘要:
前言最近,我在做中间件升级工作,发现Redis的服务器版本低于3.2.3。为了更好地利用Redis的新功能,我计划将Redis升级到新版本6.0.9。新版本的Redis被用作从设备,以在线同步Redis的数据。同步完成后,从属只读也设置为no,然后恢复在线流量。此时,检查替代Redis的QPS是否为0。
前言

最近在做中间件升级工作,发现服务器redis版本较低3.2.3,为了更好利用redis新特性,于是打算把redis升级到新版本6.0.9。

注意:redis 偶数为稳定版本,奇数为开发版本。下面是升级版本的两种方法:

  • 线上平滑升级
  • 离线手动升级
线上平滑升级

为了能够降低服务中断时间对应用产生的影响,我们首先在另外一台服务器上,配置要升级服务器的从库,做为“替身”,然后做如下步骤。

  1. 配置好从库“替身”,执行命令:slaveof 10.xxx.xxx.xxx 6379 同步数据,需要等待一段时间主库把数据同步到从库,这期间可以使用 info replication 查看对比slave和master offset 复制偏移量。
  2. 让替身slave成为线上机器,同步完成后,将slave-read-only 设置为no
  3. 将线上流量引入到slave上, 此时slave成为线上机器,查看线上机器的QPS,直至为0。
  4. 趁此时,卸载线上的旧Redis,然后安装新版本的Redis
  5. 新版本的Redis作为slave同步线上Redis的数据,同步完成后同样将slave-read-only设置为no, 然后将线上流量引回来,此时查看刚才的替身RedisQPS为0即可。
在这个过程中,查看redis请求的QPS最好的方法就是通过monitor来实现:
redis-cli -h 127.0.0.1 -p 6379 monitor | cut -d "." -f1 | uniq -c

 可以通过ss -anp | grep redis:port 命令 查看连接情况:

ss -anp | grep .7777

Redis——版本升级&数据迁移第1张

然后可以通过ps aux命令查看具体是什么命令在连接redis:

ps aux|grep 22982

Redis——版本升级&数据迁移第2张

离线手动升级

离线手动升级Redis,采用以下方案进行,这也是我在生产环境使用的方案。

  1. 在新的三台服务器上安装部署最新稳定版本(6.0.9)的Redis集群;
  2. 使用Redis-Shake工具,将旧Redis集群上的数据迁移到新Redis集群,并验证数据完整性;
  3. 修改相关应用的配置,指向新Redis集群地址,然后重启相关应用的服务;
  4. 通知相关业务人员进行业务验证,新Redis集群开始运行;
  5. 新Redis集群稳定运行一段时候后,将旧Redis集群进行下线操作。

1、搭建新的集群 

  请参考:https://www.cnblogs.com/caoweixiong/p/14235807.html

2、使用Redis-Shake迁移数据

  • 下载Redis-Shake
cd /opt
wget https://github.com/alibaba/RedisShake/releases/download/release-v2.0.3-20200724/redis-shake-v2.0.3.tar.gz
tar -xvf redis-shake-v2.0.3.tar.gz
cd redis-shake-v2.0.3
ls -l

Redis——版本升级&数据迁移第3张

  • 配置Redis-Shake

1、获取源集群和目标集群的Master节点和IP:

redis-cli -h {redis_address} -p {redis_port}  cluster nodes

在命令返回的结果中,获取所有master节点的IP端口,如下如所示:

Redis——版本升级&数据迁移第4张

2、编辑RedisShake配置文件:

编辑redis-shake工具配置文件redis-shake.conf,补充源端与目标端所有master节点的连接信息:

log.file = /var/log/redis-shake.log
source.type = cluster
source.address = 172.16.0.150:7000;172.16.0.150:7001;172.16.0.150:7002;172.16.0.151:7000;172.16.0.151:7001;172.16.0.151:7002          #源端集群master节点
target.address = 172.16.0.89:7000; 172.16.0.89:7001;172.16.0.89:7002;172.16.0.90:7000;172.16.0.90:7001;172.16.0.90:7002               #目标集群master节点
target.rdb.output = local_dump
key_exists = rewrite
  • 在线迁移(实时同步数据)

1、使用如下命令同步源Redis集群和目标Redis集群数据:

./redis-shake -type sync -conf redis-shake.conf
tail -1000f /var/log/redis-shake.log

2、执行日志中出现如下信息,代表全量数据同步完成,进入增量同步阶段:

sync rdb done.

3、执行日志出现如下信息时,代表增量同步无新增内容:

sync:  +forwardCommands=0  +filterCommands=0  +writeBytes=0

4、如果确定已经全部同步完成,且后续不会有新的业务数据进来,可手动停止同步(Ctrl + C)

redis-shake在线迁移示意图:

Redis——版本升级&数据迁移第5张

  • 离线迁移(备份文件导入)

1、使用以下命令从源集群中导出RDB文件:

./redis-shake.linux -type dump -conf redis-shake.conf

执行日志中出现如下信息时导出备份文件完成:

Redis——版本升级&数据迁移第6张

导出的文件存储在RedisShake根目录下:

Redis——版本升级&数据迁移第7张

2、使用以下命令把RDB文件导入到目标集群

编辑RedisShake配置文件:

source.rdb.input = local_dump.0;local_dump.1;local_dump.2;local_dump.3;local_dump.4;local_dump.5    #将需要导入的文件配置到source.rdb.input中

3、执行导入命令:

./redis-shake.linux -type restore -conf redis-shake.conf

执行日志中出现如下信息时导入文件完成:

Redis——版本升级&数据迁移第8张

  • 迁移后验证  

数据同步结束后,可使用redis-cli工具连接Redis Cluster集群,通过info命令查看Keyspace中的Key数量,确认数据是否完整导入。

Redis——版本升级&数据迁移第9张

1、检查对比源端集群和目标集群中的每一个master节点的keys数量是否一致。

2、检查目标集群中的slave节点的keys数量是否跟master节点的一致。

3、如果数据不完整,可使用flushall或者flushdb命令清理实例中的缓存数据后重新同步。

参考:

免责声明:文章转载自《Redis——版本升级&数据迁移》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PHP输入流php://input介绍阿里巴巴iconfont的正确使用方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Redis主备自动切换

    Sentinel(哨兵)是用于监控redis集群中Master状态的工具. 一、Sentinel作用  1、Master状态检测   2、如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave;  3、Master-Slave切换后,master_redis.conf、s...

Redis时延问题分析及应对

Redis时延问题分析及应对 Redis的事件循环在一个线程中处理,作为一个单线程程序,重要的是要保证事件处理的时延短,这样,事件循环中的后续任务才不会阻塞; 当redis的数据量达到一定级别后(比如20G),阻塞操作对性能的影响尤为严重; 下面我们总结下在redis中有哪些耗时的场景及应对方法; 耗时长的命令造成阻塞 keys、sort等命令 keys命...

(转)淘淘商城系列——Redis持久化方案

http://blog.csdn.net/yerenyuan_pku/article/details/72858975 Redis中设置key的过期时间 Redis中的expire命令用于设置key的过期时间,以毫秒计。key过期后将不再可用。Redis中的expire命令基本语法如下: expire key second 设置成功返回1。当key不存在或...

phpredis中incr以及decr等自增命令出现的问题

在做项目中使用redis的incr以及hincrby自增时,出现自增失败,set之后的数据,无法自增,当redis中不存在该key时,直接用incr是成功的。查找了原因,是因为phpredis初始化的时候,设置了php序列化,即: $redis->setOption( Redis::OPT_SERIALIZER, Redis::SERIALIZER_...

c# 操作Redis的五种基本类型总结

引言 在我们的大多数项目中,通常会把数据存储到关系型数据库中,比如Oracle,SQL Server,Mysql等,但是关系型数据库对于并发的支持并不是很强大,这样就会造成系统的性能不佳, 而且存储的数据多为结构化数据,对于非结构数据(比如文本)和半结构化数据(比如JSon) 就显得不够灵活,而非关系型数据库则很好的弥补了这两点,  我们通常把读操作频繁...

设置redis访问密码

在服务器上,这里以linux服务器为例,为redis配置密码。 1.第一种方式 (当前这种linux配置redis密码的方法是一种临时的,如果redis重启之后密码就会失效,) (1)首先进入redis,如果没有开启redis则需要先开启:[root@iZ94jzcra1hZ bin]# redis-cli -p 6379127.0.0.1:6379>...