分享AWS的Redis如何正确迁移至阿里云项目实践

一、背景

最近项目上有一个需求,需要把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。如下图所示:

 
友情链接
鄂ICP备19019357号-22