以下是对 redis 2.8 迁移到 redis 5.0 的操作实践,主要用到了下面两个工具
- redis-port: https://github.com/CodisLabs/redis-port
- redis-shake: https://github.com/alibaba/RedisShake
缘起
我们很多服务使用了阿里云的云数据库 Redis 产品,当时是 2.8 版本,使用后一直没有动过。2024年1月31日阿里云发送了一封邮件,告知用户从 2024年7月31日 起,对 2.8 版本的云数据库 Redis 停止全面支持 EOFS (End of Full Support):
尊敬的阿里云Redis用户,
云数据库 Redis 版2.8版本实计划于2024年07月31日起停止全面支持,进入EOFS(End of Ful Support) 阶段,此阶段我们将停止功能送代升级、停止续费、停止升降配和扩容、停止售后服务,请尽快升级实例至高版本。详情请看公告https://click.aliyun.com/m/1000389479/
在阿里云的文档里关于如何进行兼容性测试的环节里说:“您可以在原实例中,通过数据恢复功能,将当前Redis实例的备份数据克隆至一个新的高版本实例中,并进行测试、验证,更多信息请参见从备份集恢复至新实例。”。于是我们开始尝试对线上 Redis 实例进行升级测试。
问题
- 阿里云官方的 Redis 2.8 实例已经不能再购买了,所以不能买个新的 2.8 实例做测试
- 阿里云官方的数据导出任务,从 2.8 到 5.0 实例,尝试失败,报不支持的版本错误
- 从 2.8 的落盘备份 rdb 文件导入到阿里云 5.0 实例,使用阿里云推荐的 redis-shake 导入失败,redis-shake 进程在没导入完成就自杀掉了……
尝试
本地导入
我在本地的一台服务器上搭建了 redis 5.0.13 服务器(注:阿里云上的 5.0 实例小版本为 5.2.6,为阿里云自行基于官方 5.0.13 修改后的版本),将 2.8 实例上的备份 rdb 文件下载(约 3 GB)后,使用 redis-port 导入。第一次导入失败,报超出 maxmemory 限制。于是修改了 redis.conf
,设定 5G 最大内存 maxmemory 5368709120
:
daemonize yes
pidfile /var/run/redisi_6379.pid
port 6379
bind 0.0.0.0
timeout 600
loglevel verbose
logfile /var/log/redis/redis_6379.log
databases 16
appendonly yes
appendfsync everysec
appendfilename appendonly.aof
dir /home/redisdata
maxclients 1000
maxmemory 5368709120
slowlog-log-slower-than 20000
slowlog-max-len 500
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
requirepass password
再次使用 redis-port 导入成功:
#!/bin/bash
REDIS_INSTANCE=r-abcdef1234567
DATE=$(date -d "yesterday" '+%Y-%m-%d')
LOG=$(pwd)/logs/redis_sync_$DATE.log
# Download yesterday's backup file
#cd /root/aliyun_client
#python3 -u alibabacloud_sample/sample.py $REDIS_INSTANCE $DATE true |& tee -a $LOG 2>&1
cd /root
./redis-port restore -i /root/aliyun_client/$REDIS_INSTANCE.rdb -t 127.0.0.1:6379 -A 'password' --redis |& tee -a $LOG 2>&1
echo "Restore to local redis instance DONE!"
尝试使用 redis-shake 导入报错,错误信息乱码,也就没有再尝试。
阿里云服上尝试
因为使用阿里云内网速度更快,所以在一台测试用的阿里云服务器上尝试使用同样的办法将 2.8 的 rdb 备份导入到新购买的一个 5.0 实例(r-1234567abcdef.redis.rds.aliyuncs.com:6379
)上。
redis-port
这次尝试 redis-port 执行到了 60% 到 85% 就会中断。
./redis-port restore -i ./r-abcdef1234567.rdb