一、背景
最近项目上有一个需求,需要把aws的redis迁移至阿里云的redis,本来是想着用阿里云的dts实现在线迁移,但是aws对自己产品的redis高级命令作了限制,不允许用户使用,所以无法实现用dts迁移aws的redis。经过一番曲折之后,用下面的方法成功实现了aws的redis迁移至阿里云的redis。下面分享一下具体实现的过程。
二、实施过程
1、安装配置AWS的CLI
(1)安装AWS CLI
Amazon Linux(本环境) AWS CLI 预安装在 Amazon Linux AMI 上。
检查当前安装的版本,请使用以下命令:
$ aws --version
aws-cli/2.4.5 Python/3.8.8 Linux/4.14.133-113.105.amzn2.x86_64 botocore/1.13
(2)配置AWS CLI
AWS CLI 将此信息存储在文件中指定的配置文件(设置集合)default中 credentials。默认情况下,当您运行未明确指定要使用的配置文件的 AWS CLI 命令时,将使用此配置文件中的信息。
$aws configure
AWS Access Key ID [None]: ***************
AWS Secret Access Key [None]: wJa***************LEKEY
Default region name [None]: cn-northwest-1
Default output format [None]: json
注:regoin name根据自己的实际情况填写,目前国内主要有宁夏(cn-northwest-1)、北京(cn-north-1)两个区。
2、安装迁移工具redis-shake
前提条件
目标Redis实例的版本社区版(4.0或5.0版本)或企业版(5.0版本)
Redis-shake介绍
Redis-shake是阿里云自研的开源Redis数据传输工具,支持对Redis数据进行解析(decode)、恢复(restore)、备份(dump)和同步(sync或rump),易于部署,灵活高效。本案例通过使用Redis-shake的restore(恢复)模式,将本地RDB文件中的数据恢复至云数据库Redis,从而实现数据迁移上云。
安装Redis-shake
1、登陆待安装的Redis-shake机器。
2、下载Redis-shake文件。
wget 'http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/120287/cn_zh/1608173646665/redis-shake-v2.0.3.tar.gz'
3、解压Redis-shake文件。
tar xzf redis-shake-v2.0.3.tar.gz
4、修改参数文件。
参数 | 是否必填 | 说明 | 示例 |
source.rdb.input | 是 | 备份文件(RDB文件)的相对路径或绝对路径。多个文件请使用英文分号(;)分隔。 | /root/tools/RedisShake/demo.rdb |
target.address | 是 | 目标Redis实例的连接地址与端口号,连接地址和端口号之间使用英文冒号(:)分隔。 | r-bp1wcw2rlw76acc5k.redis.rds.aliyuncs.com:6379 |
target.password_raw | 是 | 目标Redis实例的账号(需具备读写权限)及其密码,账号和密码之间使用英文冒号(:)分隔。 | testaccount:Rp829dlwa |
key_exists | 否 | 当源库中的Key与目标库中的Key相同时,采取的数据写入策略,取值:rewrite:覆盖写入至目标库。none:默认值,停止运行Redis-shake程序并提示冲突的Key。ignore:直接跳过当前迁移的Key,保留目标库的数据,继续执行数据迁移。 | rewrite |
parallel | 否 | Redis-shake执行迁移的并发线程数,适当调大该值可提高同步性能。默认值为32,最小值为1。 | 32 |
3、开始执行迁移
为了实现迁移的自动化,写了一个一键迁移脚本。
迁移流程简介:
- 源库redis备份。
- 把备份文件复制至S3。
- 从s3下载备份文件至本地。
- 运行Redis-shake程序,开始执行迁移。
#!/bin/bash
date=$(date +%Y%m%d%H%M%S)
#dump redis file
aws elasticache create-snapshot --cache-cluster-id deviceredis --snapshot-name myredis${date}
sleep 120s
copy_status=`aws elasticache describe-snapshots --cache-cluster-id deviceredis --snapshot-name myredis${date} |grep "available" |wc -l`
until [ $copy_status -eq 1 ]
do
copy_status=`aws elasticache describe-snapshots --cache-cluster-id deviceredis --snapshot-name myredis${date} |grep "available" |wc -l`
sleep 5s
done
#copy redisfile to s3
aws elasticache copy-snapshot --source-snapshot-name myredis${date} --target-snapshot-name myredis${date} --target-bucket redistmp
#download redisfile from s3
get_status=`aws elasticache describe-snapshots --cache-cluster-id deviceredis --snapshot-name myredis${date} |grep "available" |wc -l`
until [ $get_status -eq 1 ]
do
get_status=`aws elasticache describe-snapshots --cache-cluster-id deviceredis --snapshot-name myredis${date} |grep "available" |wc -l`
sleep 5s
done
aws s3api get-object --bucket redistmp --key myredis${date}-0001.rdb ./myredis${date}-0001.rdb
#restore to aliyun redis
sed -i "s/\/root\/redis-shake-v2.0.3\/.*rdb$/\/root\/redis-shake-v2.0.3\/myredis${date}-0001.rdb/g" redis-shake.conf
./redis-shake.linux -type=restore -conf=redis-shake.conf
说明:
日志中出现restore: rdb done表示数据恢复完成,此时使用Ctrl+C组合键停止运行Redis-shake。如下图所示: