前言
最近在做中间件升级工作,发现服务器redis版本较低3.2.3,为了更好利用redis新特性,于是打算把redis升级到新版本6.0.9。
注意:redis 偶数为稳定版本,奇数为开发版本。下面是升级版本的两种方法:
- 线上平滑升级
- 离线手动升级
线上平滑升级
为了能够降低服务中断时间对应用产生的影响,我们首先在另外一台服务器上,配置要升级服务器的从库,做为“替身”,然后做如下步骤。
- 配置好从库“替身”,执行命令:slaveof 10.xxx.xxx.xxx 6379 同步数据,需要等待一段时间主库把数据同步到从库,这期间可以使用
info replication
查看对比slave和master offset 复制偏移量。 - 让替身
slave
成为线上机器,同步完成后,将slave-read-only
设置为no
。 - 将线上流量引入到
slave
上, 此时slave
成为线上机器,查看线上机器的QPS
,直至为0。 - 趁此时,卸载线上的
旧Redis
,然后安装新版本的Redis
。 - 新版本的
Redis
作为slave
同步线上Redis
的数据,同步完成后同样将slave-read-only
设置为no
, 然后将线上流量引回来,此时查看刚才的替身Redis
的QPS
为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
然后可以通过ps aux
命令查看具体是什么命令在连接redis:
ps aux|grep 22982
离线手动升级
离线手动升级Redis,采用以下方案进行,这也是我在生产环境使用的方案。
- 在新的三台服务器上安装部署最新稳定版本(6.0.9)的Redis集群;
- 使用Redis-Shake工具,将旧Redis集群上的数据迁移到新Redis集群,并验证数据完整性;
- 修改相关应用的配置,指向新Redis集群地址,然后重启相关应用的服务;
- 通知相关业务人员进行业务验证,新Redis集群开始运行;
- 新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-Shake
1、获取源集群和目标集群的Master节点和IP:
redis-cli -h {redis_address} -p {redis_port} cluster nodes
在命令返回的结果中,获取所有master节点的IP端口,如下如所示:
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在线迁移示意图:
- 离线迁移(备份文件导入)
1、使用以下命令从源集群中导出RDB文件:
./redis-shake.linux -type dump -conf redis-shake.conf
执行日志中出现如下信息时导出备份文件完成:
导出的文件存储在RedisShake根目录下:
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-cli工具连接Redis Cluster集群,通过info命令查看Keyspace中的Key数量,确认数据是否完整导入。
1、检查对比源端集群和目标集群中的每一个master节点的keys数量是否一致。
2、检查目标集群中的slave节点的keys数量是否跟master节点的一致。
3、如果数据不完整,可使用flushall或者flushdb命令清理实例中的缓存数据后重新同步。
参考:
- https://www.cnblogs.com/xingxia/p/redis_versions.html
- https://juejin.cn/post/6844903506801868807
- https://blog.csdn.net/jiahao1186/article/details/81038868
- https://developer.aliyun.com/article/691794
- https://github.com/alibaba/RedisShake/wiki/%E7%AC%AC%E4%B8%80%E6%AC%A1%E4%BD%BF%E7%94%A8%EF%BC%8C%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8C%E9%85%8D%E7%BD%AE%EF%BC%9F