通过Redis-shake的sync(同步)模式,可以将自建Redis数据库的数据实时迁移至Redis实例,可帮助您平滑地完成自建Redis数据库的迁移上云。

前提条件

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

Redis-shake介绍

Redis-shake是阿里云自研的开源Redis数据传输工具,支持对Redis数据进行解析(decode)、恢复(restore)、备份(dump)和同步(sync或rump),易于部署,灵活高效。Redis-shake的sync(同步)模式支持全量数据迁移和增量数据迁移,详细的迁移流程如下图所示:
图 1. redis-shake迁移示意图
redis-shake迁移示意图
说明 通过DTS的数据同步功能也可以实现数据迁移的需求,且支持更加丰富的场景与功能。更多信息,请参见 Redis数据同步方案概览

注意事项

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

操作步骤

  1. 根据Redis-shake待安装的位置,完成下述操作:
    说明 推荐直接在自建数据库所在的设备上安装Redis-shake,可获得更低的网络延迟,同时可避免因自建数据库的防火墙设置导致的连接失败。
    Redis-shake待安装位置 需完成的操作
    ECS实例
    1. 确保ECS实例与Redis实例属于同一专有网络(即实例基本信息中的专有网络ID一致)。
      说明 如果专有网络不同,您需要更换ECS实例所属的专有网络。具体操作,请参见 更换ECS实例的VPC
    2. 获取ECS实例的内网IP地址。具体操作,请参见查询ECS实例的IP地址
    3. 将ECS实例的内网IP地址添加至Redis实例的白名单中。具体操作,请参见设置IP白名单
    本地设备
    1. Redis实例默认仅提供内网连接地址,通过公网连接时您需要手动申请公网连接地址。具体操作,请参见申请公网连接地址
    2. 在本地设备上执行curl ipinfo.io |grep ip命令,获取其公网IP地址,返回示例如下:查看公网IP结果
    3. 将本地设备的公网IP地址添加至Redis实例的白名单中。具体操作,请参见设置IP白名单
  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. 执行下述命令进入解压后的目录并修改配置文件:
      cd redis-shake-v2.0.3/ && vim redis-shake.conf
      说明 执行命令后,系统将进入编辑界面,输入 a可进入编辑模式。
      表 1. 主要参数说明
      参数 是否必填 说明 取值示例
      source.type 根据源库(自建数据库)的架构选择,取值:
      • standalone:主从架构。
      • cluster:集群架构。
      standalone
      source.address 源库的连接地址和端口号,连接地址和端口号之间使用英文冒号(:)分隔。
      说明
      • 如果源库与Redis-shake部署在同一设备,可填写为127.0.0.1:6379
      • 如果源库为集群架构,在填写连接地址时需要添加master@前缀,例如master@127.0.0.1:6379
      127.0.0.1:6379
      source.password_raw 源库的密码,如果源库未设置密码,无需填写。 Rp829dlwa
      target.type 根据目标Redis实例的架构选择,取值: standalone
      target.address 目标Redis实例的连接地址与端口号,连接地址和端口号之间使用英文冒号(:)分隔。关于如何获取连接地址和端口号,请参见查看连接地址
      • ECS实例通过专有网络连接:需获取Redis实例的专有网络连接地址。
      • 本地设备通过公网连接:需获取Redis实例的公网连接地址。
      说明 如果目标实例为集群架构,您需要通过直连地址连接(网络类型为专有网络),且在填写连接地址时需要添加 master@前缀,例如 master@r-bp1mfnrflszg75w****.redis.rds.aliyuncs.com:6379。关于如何申请直连地址,请参见 开通直连访问
      r-bp1wcw2rlw76acc5k****.redis.rds.aliyuncs.com:6379
      target.password_raw 目标Redis实例的账号(需具备读写权限)及其密码,账号和密码之间使用英文冒号(:)分隔。关于如何创建账号,请参见创建与管理账号 testaccount:Rp829dlwa
      target.db 将源库中所有库的数据都迁移至目标库的指定库中,取值范围为0~15
      说明 默认值为 -1,表示不启用该功能。
      -1
      key_exists 当源库中的Key与目标库中的Key相同时,采取的数据写入策略,取值:
      • rewrite:覆盖写入至目标库。
      • none:默认值,停止运行Redis-shake程序并提示冲突的Key。
      • ignore:直接跳过当前迁移的Key,保留目标库的数据,继续执行数据迁移。
      rewrite
      filter.db.whitelist 需要迁移的库名,多个库名间用英文分号(;)分隔,默认为空,即迁移所有库。 0;1
      filter.db.blacklist 不需要迁移的库名(即黑名单),多个库名间用英文分号(;)分隔。默认为空,即不设置黑名单。 1;2
      parallel Redis-shake执行迁移的并发线程数,适当调大该值可提高同步性能。
      说明 默认值为32,最小值为1,最大值取决于Redis-shake所在服务器的性能。
      32
      说明 其他参数如无特殊需求无需配置,如需了解更多,请查看 redis-shake.conf文件中各参数的注释。
    2. 按下Esc键退出编辑模式,输入:wq并按回车键保存配置并退出编辑界面。
    3. 执行下述命令启动Redis-shake,开始执行数据迁移:
      ./redis-shake.linux -type=sync -conf=redis-shake.conf
      Redis-shake将在屏幕上打印运行的日志信息。
      说明 如果出现提示报错,相关原因及解决方法,请参见 常见报错及解决方法
  4. 可选:选择合适的时机,结束数据迁移任务。
    说明 如果您需要长期运行Redis-shake用于实时迁移数据,无需执行本步骤。
    1. 观察打印的日志,等待迁移任务进入增量数据迁移状态。
      迁移任务阶段 对应打印的日志
      全量数据迁移
      2020/12/16 21:02:36 [INFO] DbSyncer[0] total = 4.00MB -       2.18MB [ 54%]  entry=52199
      2020/12/16 21:02:36 [INFO] DbSyncer[0] total = 4.00MB -       4.00MB [100%]  entry=97531
      2020/12/16 21:02:36 [INFO] DbSyncer[0] sync rdb done
      说明 当打印的日志出现 sync rdb done,表示完成全量数据迁移,接下来进入增量数据迁移阶段。
      增量数据迁移
      2020/12/16 21:03:07 [INFO] DbSyncer[0] sync:  +forwardCommands=5      +filterCommands=0      +writeBytes=5095
      2020/12/16 21:03:08 [INFO] DbSyncer[0] sync:  +forwardCommands=7      +filterCommands=0      +writeBytes=7133
      2020/12/16 21:03:09 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
      2020/12/16 21:03:10 [INFO] DbSyncer[0] sync:  +forwardCommands=645    +filterCommands=0      +writeBytes=657255
      2020/12/16 21:03:11 [INFO] DbSyncer[0] sync:  +forwardCommands=28     +filterCommands=0      +writeBytes=28532
      2020/12/16 21:03:12 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
      日志信息中各参数说明如下:
      • forwardCommands:源库发送过来的命令数。
      • filterCommands:被过滤的命令数,例如在Redis-shake配置文件中设置了过滤某些库。
      • writeBytes:源库发送过来的字节数。
    2. 暂停向源库写入数据,等待返回日志中writeBytes对应值连续多次为0时,使用Ctrl+C组合键停止运行Redis-shake。
      图 2. 停止运行示例
      停止运行示例
      说明 此时源和目标的数据完全一致,您可以将业务的数据库服务由自建Redis数据库切换至Redis实例。