使用Redis-shake的restore模式,您可以将将自建数据库的备份文件(RDB文件)中的数据恢复至云数据库Redis,从而实现数据迁移上云。

前提条件

  • 自建Redis的版本为2.8、3.0、3.2、4.0或5.0版本。
    说明 如需跨版本迁移(例如从2.8迁移至4.0),建议您创建按量付费的Redis实例以进行兼容性验证,验证无误后可转换为包年包月。关于如何转换付费模式,请参见转包年包月
  • 目标Redis实例的版本社区版(4.0或5.0版本)或企业版(5.0版本)。如果尚未创建实例,请参见步骤1:创建实例

Redis-shake介绍

Redis-shake是阿里云自研的开源Redis数据传输工具,支持对Redis数据进行解析(decode)、恢复(restore)、备份(dump)和同步(sync或rump),易于部署,灵活高效。本案例通过使用Redis-shake的restore(恢复)模式,将本地RDB文件中的数据恢复至云数据库Redis,从而实现数据迁移上云。

说明

注意事项

  • 如果目标库的数据逐出策略(maxmemory-policy)配置为noeviction以外的值,可能导致目标库的数据与源库不一致。关于数据逐出策略详情,请参见Redis数据逐出策略介绍
  • 如果源库中的某些Key使用了过期(expire)机制,由于可能存在Key已过期但未被及时删除的情形,所以在目标库中查看(如通过info命令)到的Key数量会比源库的Key数量少。
    说明 源和目标库中,未设置过期机制或未过期的Key数量是一致的。

操作步骤

  1. 确认Redis-shake待安装的位置,并完成下述操作:
    说明 推荐在ECS实例上安装Redis-shake,通过专有网络连接源和目标Redis实例,可获得更低的网络延迟和更高的安全性。
    Redis-shake待安装位置 需完成的操作
    ECS实例(推荐)
    1. 确保ECS实例与Redis实例属于同一专有网络(即实例基本信息中的专有网络ID一致)。
      说明
    2. 获取ECS实例的内网IP地址。具体操作,请参见查询ECS实例的IP地址
    3. 将ECS实例的内网IP地址添加至Redis实例的白名单中。具体操作,请参见设置白名单
    本地设备
    1. Redis实例默认仅提供内网连接地址,通过公网连接时您需要手动申请公网连接地址。具体操作,请参见申请公网连接地址
    2. 在本地设备上执行curl ipinfo.io |grep ip命令,获取其公网IP地址,返回示例如下:查看公网IP结果
    3. 将本地设备的公网IP地址添加至Redis实例的白名单中。具体操作,请参见设置白名单
  2. 安装Redis-shake。
    1. 登录待安装Redis-shake的设备,例如ECS实例或本地设备。
    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'
      说明 本文以2.0.3版本为例演示操作流程,您也可以安装其他版本。更多信息,请参见RedisShake版本列表
    3. 执行下述命令解压Redis-shake文件:
      tar xzf redis-shake-v2.0.3.tar.gz
  3. 在安装了Redis-shake的设备上,执行数据迁移。
    1. 将自建Redis数据库的RDB备份文件复制到该设备中,本案例为/root/redisdump
    2. 执行下述命令进入解压后的目录并修改配置文件:
      cd redis-shake-v2.0.3/ && vim redis-shake.conf
      说明 执行命令后,系统将进入编辑界面,输入a可进入编辑模式。
      表 1. 主要参数说明
      参数 是否必填 说明 示例
      source.rdb.input 备份文件(RDB文件)的相对路径或绝对路径。
      说明 多个文件请使用英文分号(;)分隔。
      /root/redisdump/dump.rdb
      target.address 目标Redis实例的连接地址与端口号,连接地址和端口号之间使用英文冒号(:)分隔。关于如何获取连接地址和端口号,请参见查看连接地址
      • ECS实例通过专有网络连接:需获取Redis实例的专有网络连接地址。
      • 本地设备通过公网连接:需获取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,最大值取决于Redis-shake所在服务器的性能。
      32
      说明 其他参数如无特殊需求无需配置,如需了解更多,请查看redis-shake.conf文件中各参数的注释。
    3. 按下Esc键退出编辑模式,输入:wq并按回车键保存配置并退出编辑界面。
    4. 执行下述命令启动Redis-shake,开始执行数据迁移:
      ./redis-shake.linux -type=restore -conf=redis-shake.conf
      Redis-shake将在屏幕上打印运行的日志信息。
      说明 如果出现提示报错,相关原因及解决方法,请参见常见问题
  4. 等待数据迁移完成并结束任务。
    1. 观察打印的日志,等待数据迁移完成增量数据同步状态。
      2021/06/18 10:44:25 [INFO] restore from '[/root/redisdump/dump.rdb]' to '[r-bp1bjmqwlelmkhy****.redis.rds.aliyuncs.com:6379]'
      2021/06/18 10:44:25 [INFO] routine[0] starts restoring data from /root/redisdump/dump.rdb to [r-bp1bjmqwlelmkhy5ry933.redis.rds.aliyuncs.com:6379]
      2021/06/18 10:44:26 [INFO] routine[0] total = 11.15MB -       6.35MB [ 56%]  entry=5692
      2021/06/18 10:44:27 [INFO] routine[0] total = 11.15MB -      11.15MB [100%]  entry=10001
      2021/06/18 10:44:27 [INFO] routine[0] restore: rdb done
      2021/06/18 10:44:27 [INFO] restore from '[/root/redisdump/dump.rdb]' to '[r-bp1bjmqwlelmkhy****.redis.rds.aliyuncs.com:6379]' done
      2021/06/18 10:44:27 [INFO] Enabled http stats, set status (incr), and wait forever.
      说明 当打印的日志出现restore: rdb done,表示已完成数据迁移。
    2. 使用Ctrl+C组合键停止运行Redis-shake。
  5. 可选:校验迁移后的数据