通过redis-shake的restore模式,您可以将Redis备份文件(RDB文件)中的数据恢复至云原生内存数据库Tair云数据库Redis版实例中,从而实现数据迁移上云。

前提条件

  • 自建Redis的版本为2.8、3.0、4.0、5.0、6.0或7.0版本。
  • 已创建Tair或Redis实例,如未创建实例,请参见创建实例
    说明 建议目标实例的版本等于或大于自建Redis版本,例如将Redis 2.8恢复至Redis 6.0。

    跨版本恢复时,建议您创建按量付费的实例以进行兼容性验证,验证无误后可转换为包年包月。关于如何转换付费模式,请参见转包年包月

redis-shake介绍

redis-shake是阿里云用于Redis数据传输与过滤的开源工具,该工具易于部署,灵活高效。redis-shake的Sync(同步)模式支持全量数据迁移和增量数据迁移;Restore(恢复)模式支持将本地RDB文件中的数据恢复至目标端;Scan模式是使用SCAN命令来获取源端Redis中的Key,然后使用DUMP命令获取Key的值,最终使用RESTORE命令将Key(与其值)恢复至目标端。不同模式的同步流程如下图所示:
图 1. redis-shake模式介绍
redis-shake迁移示意图

注意事项

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

操作步骤

  1. 根据redis-shake待安装的位置,完成白名单配置。
    说明 建议在自建Redis数据库所在的设备上安装redis-shake,获得更低的网络延迟,同时可避免因自建数据库的防火墙设置导致的连接失败。
    redis-shake待安装位置 需完成的操作
    ECS实例
    1. 确保ECS实例与Redis实例属于同一专有网络(即实例基本信息中的专有网络ID一致)。
      说明 如果专有网络不同,您需要更换ECS实例所属的专有网络。具体操作,请参见更换ECS实例的VPC
    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 'https://github.com/alibaba/RedisShake/releases/download/v3.1.7/redis-shake-linux-amd64.tar.gz'
      说明 本文以redis-shake 3.1.7版本为例演示操作流程。如有更新版本,推荐使用最新版本,更多版本,请参见redis-shake版本列表
    3. 执行下述命令解压redis-shake文件:
      tar xzf redis-shake-linux-amd64.tar.gz
  3. 在安装redis-shake的设备上,执行数据恢复操作。
    1. redis-shake目录中,执行下述命令,进入配置文件编辑界面:
      vim restore.toml
    2. 输入a进入编辑模式。
    3. 修改配置文件。
      表 1. 主要参数说明
      类别 参数 说明 示例
      type

      redis-shake模式,固定为restore,为恢复模式。

      restore
      source rdb_file_path 备份文件(RDB文件)的相对路径或绝对路径,本示例的RDB文件路径为/root/redisdump
      说明
      • 若未生成RDB文件,可执行BGSAVE命令生成RDB文件。
      • redis-shake单次仅支持恢复一个RDB文件。

        若源库为集群架构,可将多个节点的RDB文件逐个进行恢复,也可以同时开启多个redis-shake进行恢复。

      /root/redisdump/dump.rdb
      target type 目标实例的架构,取值: standalone
      address 目标实例的连接地址与端口号,连接地址和端口号之间使用英文冒号(:)分隔。关于如何获取连接地址和端口号,请参见查看连接地址
      • ECS实例与目标实例为同一专有网络时,可通过专有网络进行恢复,需获取Redis实例的专有网络连接地址。

        若ECS实例与目标实例为跨地域或不在同一个专有网络下,则需要通过公网进行恢复。

      • 本地设备可通过公网进行恢复,需获取Redis实例的公网连接地址。
      r-bp1wcw2rlw76acc5k****.redis.rds.aliyuncs.com:6379
      password 目标实例的账号(需具备读写权限)及其密码。
      • 使用默认账号(以实例ID命名的账号):直接填写密码即可。
      • 使用新创建的账号:密码格式为user:password。例如自定义账号为testaccount,密码为Rp829dlwa,密码需填写为testaccount:Rp829dlwa
      关于如何创建账号,请参见创建与管理账号
      testaccount:Rp829dlwa
      说明 其他参数如无特殊需求无需配置,如需了解更多,请查看restore.toml文件中各参数的注释。
    4. 按下Esc键退出编辑模式,输入:wq并按回车键保存配置并退出编辑界面。
    5. 执行下述命令启动redis-shake,开始执行数据恢复:
      ./redis-shake restore.toml
      redis-shake将在屏幕上打印运行的日志信息。
      说明 如果出现提示报错,相关原因及解决方法,请参见常见报错及解决方法
  4. 观察打印的日志,等待数据恢复完成。
    2022-10-20 14:47:51 INF RDB AUX fields. key=[ctime], value=[1666148547]
    2022-10-20 14:47:51 INF RDB AUX fields. key=[used-mem], value=[2467744]
    2022-10-20 14:47:51 INF RDB repl-stream-db: 0
    2022-10-20 14:47:51 INF RDB AUX fields. key=[repl-id], value=[22851cf87ab1c8fd3fad0101471626bbccb837e7]
    2022-10-20 14:47:51 INF RDB AUX fields. key=[repl-offset], value=[0]
    2022-10-20 14:47:51 INF RDB AUX fields. key=[aof-preamble], value=[0]
    2022-10-20 14:47:51 INF RDB resize db. db_size=[9], expire_size=[0]
    2022-10-20 14:47:51 INF send RDB finished. path=[/root/redisdump/dump.rdb]
    2022-10-20 14:47:51 INF finished.
    当打印的日志出现send RDB finished,表示已完成数据恢复,redis-shake工具会自动停止。
  5. 可选:校验迁移后的数据