使用Redis-cli和Redis-port工具迁移自建Codis集群
DCS的Proxy集群基于开源Codis架构,因此运行在Codis集群的数据,可以平滑迁移到DCS Proxy集群实例中。本文以Redis-cli和Redis-port工具为例介绍Redis集群间的数据迁移。
- “自建Codis集群”迁移到“DCS Proxy集群”
- “其他云厂商Codis集群”迁移到“DCS Proxy集群”
迁移准备
迁移操作
- 导出RDB文件。
下载并安装Redis:http://download.redis.io/releases/redis-5.0.8.tar.gz。
使用如下命令对集群的每一个Redis分片导出RDB文件:
redis-cli -h {source_redis_address} -p {source_redis_port} -a {source_redis_password} --rdb {output.rdb}
执行命令后回显"Transfer finished with success.",表示文件导出成功。
- 建议选择业务量较少的时间段进行迁移。
- 需要针对Codis集群的每个Redis分片分别导出备份文件,然后逐一导入DCS Proxy集群。
- 上传RDB文件至中转服务器,以下以华为云ECS为例。
如果RDB文件较大,可将其压缩后再传输。
- 下载迁移工具Redis-port。
登录ECS,下载和解压工具,可直接使用,无需编译。
wget https://github.com/CodisLabs/redis-port/releases/download/v2.0-beta/redis-port-v2.0-beta-go1.10.1-linux.tar.gz
tar -xvf redis-port-v2.0-beta-go1.10.1-linux.tar.gz
- 导入数据。
使用redis-port工具将所有RDB文件导入华为云Redis。如果ECS和Proxy集群实例在相同VPC,导入100w数据(每条数据20字节),大概耗时4~10秒。
redis-restore -n {N} -i {outputfile.rdb} -t {password}@{dcs_instance_address}:{port} [--unixtime-in-milliseconds="yyyy-MM-dd hh:mm:ss"]
该redis-port工具为开源工具,实例密码不支持特殊字符。
参数db,表示可以单独导入文件中的指定DB编号里的缓存数据。-n表示允许多个CPU并行处理数据导入。其他参数说明如下:
root@redis-nodelete:~/port/redis-port-v2.0-beta-go1.10.1-linux# ./redis-restore --help Usage: redis-restore [--ncpu=N] [--input=INPUT|INPUT] --target=TARGET [--aof=FILE] [--db=DB] [--unixtime-in-milliseconds=EXPR] redis-restore --version Options: -n N, --ncpu=N Set runtime.GOMAXPROCS to N. -i INPUT, --input=INPUT Set input rdb encoded file. -t TARGET, --target=TARGET The target redis instance ([auth@]host:port). -a FILE, --aof=FILE Also restore the replication backlog. --db=DB Accept db = DB, default is *. --unixtime-in-milliseconds=EXPR Update expire time when restoring objects from RDB. Examples: $ redis-restore dump.rdb -t 127.0.0.1:6379 $ redis-restore -i dump.rdb -t 127.0.0.1:6379 --aof dump.aof --db=1 $ redis-restore -t 127.0.0.1:6379 --aof dump.aof $ redis-restore -t 127.0.0.1:6379 --db=0 $ redis-restore -i dump.rdb -t 127.0.0.1:6379 --unixtime-in-milliseconds="@209059200000" // ttlms += (now - '1976-08-17') $ redis-restore -i dump.rdb -t 127.0.0.1:6379 --unixtime-in-milliseconds="+1000" // ttlms += 1s $ redis-restore -i dump.rdb -t 127.0.0.1:6379 --unixtime-in-milliseconds="-1000" // ttlms -= 1s $ redis-restore -i dump.rdb -t 127.0.0.1:6379 --unixtime-in-milliseconds="1976-08-17 00:00:00" // ttlms += (now - '1976-08-17')
实测演示:
root@redis-nodelete:~/port/redis-port-v2.0-beta-go1.10.1-linux# ./redis-restore -i save196.rdb -t ******@192.168.0.171:6379 2018/03/26 09:15:33 restore.go:70: [INFO] restore: input = "save196.rdb", aoflog = "" target = "******@192.168.0.171:6379" 2018/03/26 09:15:33 restore.go:126: [INFO] restore: (r,f,s/a,f,s) = (rdb,rdb.forward,rdb.skip/aof,rdb.forward,rdb.skip) 2018/03/26 09:15:34 restore.go:155: [INFO] restore: size = 46721058 - [ 49.94%, 0.00%] (r,f,s/a,f,s)=(23330816,0,599496/0,0,0) ~ (22.25mb,-,-/0,-,-) 2018/03/26 09:15:35 restore.go:155: [INFO] restore: size = 46721058 - [ 99.31%, 0.00%] (r,f,s/a,f,s)=(46399488,12558,1179884/0,0,0) ~ (44.25mb,-,-/0,-,-) 2018/03/26 09:15:35 restore.go:155: [INFO] restore: size = 46721058 - [100.00%, 0.00%] (r,f,s/a,f,s)=(46721058,20000,1179884/0,0,0) ~ (44.56mb,-,-/0,-,-) 2018/03/26 09:15:35 restore.go:159: [INFO] restore: done root@redis-nodelete:~/port/redis-port-v2.0-alpha-go1.9.2-linux#
- 迁移后验证。
数据导入成功后,请连接DCS缓存实例,通过info命令查看Keyspace中的Key数量,确认数据是否完整导入。
如果导入不成功,可使用flushall或者flushdb命令清理实例中的缓存数据后重新导入。
