文档首页> 分布式缓存服务 DCS> 数据迁移指南> 自建Redis迁移至DCS> 使用Redis-cli和Redis-port工具迁移自建Codis集群
更新时间:2022-05-07 GMT+08:00
分享

使用Redis-cli和Redis-port工具迁移自建Codis集群

DCS的Proxy集群基于开源Codis架构,因此运行在Codis集群的数据,可以平滑迁移到DCS Proxy集群实例中。本文以Redis-cli和Redis-port工具为例介绍Redis集群间的数据迁移。

  • “自建Codis集群”迁移到“DCS Proxy集群”

    包括在本地数据中心自建、华为云或其他公有云上自建。自建的Codis集群,数据导出不受限制。

  • “其他云厂商Codis集群”迁移到“DCS Proxy集群”

    部分云厂商对数据导出相关命令做了限制,可通过其控制台界面提供的备份文件下载功能,将数据文件导出。

迁移准备

  • 创建DCS Proxy集群实例。

    集群实例的可用内存须大于待导入数据量。

  • 准备一台服务器,用作数据文件中转,以及数据导入的客户端。

    该中转服务器与DCS Proxy集群实例网络相通,且保证有足够的磁盘空间,供待迁移的数据文件存放。

    为了确保导入效率,建议使用华为云的弹性云服务器(ECS),且ECS与Proxy集群实例配置相同虚拟私有云、子网与安全组。

迁移操作

  1. 导出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.",表示文件导出成功。

    1. 建议选择业务量较少的时间段进行迁移。
    2. 需要针对Codis集群的每个Redis分片分别导出备份文件,然后逐一导入DCS Proxy集群。

  2. 上传RDB文件至中转服务器,以下以华为云ECS为例。

    如果RDB文件较大,可将其压缩后再传输。

  3. 下载迁移工具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

  4. 导入数据。

    使用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# 

  5. 迁移后验证。

    数据导入成功后,请连接DCS缓存实例,通过info命令查看Keyspace中的Key数量,确认数据是否完整导入。

    如果导入不成功,可使用flushall或者flushdb命令清理实例中的缓存数据后重新导入。

分享:

    相关文档

    相关产品

close