全部产品
阿里云办公

自建 Redis 实例到阿里云 Redis 实例的迁移方案

更新时间:2018-04-23 00:19:52

使用 数据传输 DTS 可以进行从自建 Redis 实例到云 Redis 的数据迁移。从自建 Redis 实例到云 Redis 的数据迁移支持增量数据同步功能,可以实现在本地应用不停写的情况下,平滑完成 Redis 的数据迁移。

注意:由于进行 Redis 迁移时,需迁移源端支持执行 psync 或者 sync 命令,因此当前 Redis 的迁移仅支持从自建 Redis 实例进行数据迁移,暂时无法对源端为云 Redis 实例的迁移提供支持。

本小节简单介绍使用 数据传输 DTS(以下简称 DTS)进行自建 Redis 实例->云 Redis 实例数据迁移的迁移流程。

迁移类型简介

从自建 Redis 实例到云 Redis 实例的数据迁移,可以支持全量数据迁移+增量数据迁移,全量数据迁移及增量数据迁移的功能及限制如下。

  • 全量数据迁移

    DTS 将自建 Redis 中现有的 Key 全部迁移到阿里云 Redis 实例中。

  • 增量数据迁移

    增量数据迁移将迁移过程中,自建 Redis 实例的更新 key 同步到阿里云 Redis 实例。最终,自建 Redis 和云 Redis 实例进入动态数据复制的过程。通过增量数据迁移,可以实现在自建 Redis 实例正常提供服务的同时,平滑完成自建 Redis 实例->云 Redis 实例的数据迁移。

迁移功能

Redis 增量迁移支持的命令包括:
APPEND
BITOP, BLPOP, BRPOP, BRPOPLPUSH
DECR, DECRBY, DEL
EVAL, EVALSHA,EXEC, EXPIRE, EXPIREAT
FLUSHALL, FLUSHDB
GEOADD, GETSET
HDEL, HINCRBY, HINCRBYFLOAT, HMSET, HSET, HSETNX
INCR, INCRBY, INCRBYFLOAT
LINSERT, LPOP, LPUSH, LPUSHX, LREM, LSET, LTRIM
MOVE, MSET, MSETNX, MULTI
PERSIST, PEXPIRE, PEXPIREAT, PFADD, PFMERGE, PSETEX,PUBLISH
RENAME, RENAMENX, RESTORE,RPOP, RPOPLPUSH, RPUSH, RPUSHX
SADD, SDIFFSTORE, SELECT, SET, SETBIT, SETEX, SETNX, SETRANGE, SINTERSTORE, SMOVE, SPOP, SREM, SUNIONSTORE
ZADD, ZINCRBY, ZINTERSTORE, ZREM, ZREMRANGEBYLEX, ZUNIONSTORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE

迁移前置条件

迁移的源端前置需求

通过 DTS 进行迁移的源端前置需求包括:

  • DTS 能够在源端运行 psync 或者 sync 命令。
  • DTS 支持有公网 IP 的本地自建 Redis 实例,ECS 中自建的 Redis 实例,通过专线(高速链路)接入阿里云 VPC 的自建 Redis 实例,或者通过 VPN 接入阿里云 VPC 的自建 Redis 实例作为迁移的源端。
  • 暂不支持 Redis 4.0 版本作为源端的迁移。

注意:由于进行 Redis 迁移时,需要迁移源端支持执行 psync 或者 sync 命令,因此当前 Redis 的迁移仅支持从自建 Redis 实例进行数据迁移,暂时无法对源端为云 Redis 实例的迁移提供支持。如需以云 Redis 实例为源端进行迁移,请联系阿里云 Redis 实例的技术支持。

DTS 能够支持的源端接入方式包括:

  • 如果待迁移的 Redis 实例能够直接提供 IP:Port 的连接方式,则 DTS 可以直接接入待迁移的 Redis 实例。
  • 如果待迁移的 Redis 实例是通过专线(高速链路)接入阿里云 VPC 的自建 Redis 实例,可以通过 DTS 进行通过专线接入阿里云的本地自建数据库上云迁移任务的配置,您可以参考 通过专线接入阿里云的本地自建数据库的上云迁移 进行配置。
  • 如果待迁移的 Redis 实例是通过 VPN 连接到阿里云 VPC 的 Redis 实例,那么需要架设代理,进行数据转发,提供可供 DTS 访问的 IP:Port 连接方式。具体方式见 nginx 代理搭建示例 章节。

迁移的目标端前置需求

通过 DTS 进行迁移的目标端前置需求包括:

  • DTS 支持阿里云端经典网络和 VPC 网络的 Redis 实例,有公网 IP 的本地自建 Redis 实例,ECS 中自建的 Redis 实例或者专线接入阿里云 VPC 的自建 Redis 实例作为迁移的目标。

迁移限制条件

通过 DTS 进行迁移的限制条件包括:

  • 对于通过 EVAL 或者 EVALSHA 调用 Lua 脚本,在增量数据迁移时,由于目标端在执行脚本时不会明确返回执行结果,所以 DTS 无法确保该类型脚本的执行成功。
  • 对于 Redis 中的 List 列表,由于 DTS 在调用 sync 或者 psync 进行重传时,不会对目标端已有的数据进行 Flush,所以可能导致重复数据的出现。

nginx 代理搭建示例

为了让 DTS 能够访问通过 VPN 接入阿里云 VPC 的自建 Redis 实例, 需要在接入的 VPC 内选择一台有公网 EIP 的 ECS,并在 ECS 上部署 nginx,通过 nginx 进行代理转发。
对于通过 VPN 接入阿里云的自建 Redis,ECS 所在的 VPC 必须为专线对端的阿里云 VPC。
下面介绍在以通过 VPN 接入阿里云的自建 Redis为源端时,如何使用 nginx 进行 Redis 实例的转发配置,让 DTS 服务器可以访问专有网络内的 Redis 实例。

(1) nginx 代理的部署
首先在 ECS 服务器上,通过如下命令部署 nginx 代理。

  1. yum install nginx

(2) nginx 转发配置

安装完 nginx,修改 nginx 配置文件 /etc/nginx/nginx.conf , 设置后端监听 Redis。 注释掉配置文件中 HTTP 的相关配置,添加 TCP 的配置内容。需要注释掉的 HTTP 配置内容如下:

HTTP 配置内容

需要在配置文件中添加 TCP 配置内容:

  1. stream{
  2. upstream backend{
  3. hash $remote_addr consistent;
  4. #设置后端 Redis 连接串和端口,失败超时时间为 10s,最多尝试 3 次。
  5. server r-bp1b294374634044.redis.rds.aliyuncs.com:6379 max_fails=3 fail_timeout=10s;
  6. }
  7. server{
  8. # nginx 访问端口
  9. listen 3333;
  10. #指定 nginx 连接后端服务器的超时时间,指定为 20s。
  11. proxy_connect_timeout 20s;
  12. #距离上一次成功访问(连接或读写)后端服务器的时间超过了 5 分钟就判定为超时,断开此连接。
  13. proxy_timeout 5m;
  14. #将 TCP 连接及数据收发转向叫 "backend" 的后端服务器。
  15. proxy_pass backend;
  16. }
  17. }

例如,需要访问的 Redis 的连接地址为: r-bp1b294374634044.redis.rds.aliyuncs.com:6379,nginx 代理转发端口为 3333,那么 TCP 相关配置如下:

TCP 配置

(3) 通过转发接口访问 Redis 实例

当完成上面的配置后,运行 nginx 即成功启动 nginx 代理服务。
假设 nginx 部署的 ECS 服务的 EIP 为:114.55.89.152,那么可以直接用redis_cli 访问 nginx 转发端口,测试代理转发是否正常。

nginx 测试

如上图所示,可以通过访问 nginx 代理转发端口来访问 Redis 实例。
下面配置 DTS 迁移任务时,对于通过 VPN 接入阿里云的自建 Redis 实例,直接配置刚才指定的 nginx 代理的连接地址即可。

迁移任务配置

当上面的所有前置条件都配置完成后,就可以开始正式的数据迁移了。本小节以有公网 IP 的本地自建 Redis 实例到阿里云经典网络云 Redis 实例的数据迁移为例,详细介绍迁移任务配置流程。

一、进入 数据传输 DTS 控制台,点击右上角的创建迁移任务,开始配置迁移任务。

二、 实例连接信息配置

这个步骤主要配置迁移任务名称,有公网 IP 的本地自建 Redis 实例的连接信息及阿里云经典网络 Redis 实例连接信息。其中:

  • 任务名称
    DTS 为每个任务自动生成一个任务名称,任务名称没有唯一性要求。您可以根据需要修改任务名称,建议为任务配置具有业务意义的名称,便于后续的任务识别。
  • 源实例信息
    实例类型:选择 有公网 IP 的自建数据库
    实例区域:对于有公网 IP 的本地自建 Redis 实例,选择跟该 Redis 实例物理距离最近的地域,以便获得更高的迁移性能
    数据库类型: 选择 Redis
    实例模式:默认为 单机,后续 DTS 将支持集群模式的 Redis 实例
    主机名或 IP 地址: 有公网 IP 的本地自建 Redis 实例的访问地址,如果配置了 nginx 代理转发,那么为 nginx 代理转发的访问地址
    端口:有公网 IP 的本地自建 Redis 实例的监听端口。如果配置了 nginx 代理转发,那么为 nginx 代理转发端口
    数据库密码:上面指定的 Redis 实例的访问密码,为非必填项,如果自建 Redis 没有设置密码,那么可以不填

  • 目标实例信息
    实例类型: 选择 Redis 实例
    实例区域: 实例区域为云 Redis 实例所在区域
    Redis实例ID: 配置迁移的目标阿里云 Redis 实例的实例 ID
    数据库密码:上面指定的阿里云 Redis 实例的密码

步骤一

当连接信息配置完成后,即可点击页面右下角的 授权白名单并进入下一步,开始进行迁移库的选择。

三、选择迁移对象及迁移类型

在这个步骤中,需要配置迁移类型及迁移对象。

  • 迁移类型

对于 Redis 实例的迁移,DTS 支持全量数据迁移及增量数据迁移。
如果只需要进行全量数据迁移,那么迁移类型选择:全量数据迁移。
如果需要进行源库不停服迁移,那么迁移类型选择:全量数据迁移+增量数据迁移。

  • 迁移对象

这个步骤需要选择要迁移的库。目前 DTS 只支持对 Redis 实例的整库迁移,所以只能选择要迁移的库,而不能选择要部分 Key。

步骤2

四、预检查

在迁移任务正式启动之前,会先进行前置预检查,只有预检查通过后,才能成功启动迁移。预检查的内容及修复方式可以参考本文末尾的 预检查简介 一节。

如果预检查失败,那么可以点击具体检查项后的按钮,查看具体的失败详情,并根据失败原因修复后,重新进行预检查。
·预检查

五、 启动迁移任务

当预检查通过后,可以启动迁移任务,任务启动成功后,可以在任务列表中查看迁移的具体状态及迁移进度。

至此,完成自建 Redis 实例到阿里云 Redis 实例的数据迁移任务配置。

预检查

DTS 在启动迁移之前,会进行前置预检查,本小节简单介绍 Redis 实例数据迁移的预检查内容:

检查项 检查内容 备注(建议排查项目)
源库连接性检查 检查 DTS 服务器跟自建 Redis 实例的连通性 (1) 填写信息是否有误?如果填写信息有误,请修改后重新预检查
(2) 检查端口是否允许从其他服务器连接访问
目标库连接性检查 检查 DTS 服务器跟目标 Redis 实例的连通性 检查填写信息是否有误,如果有误请先修改后重新预检查
库一对一检查 检查是否存在多个库迁移到一个库的情况 DTS 暂不支持多个库迁移到一个库,如果出现这种情况,那么请先修改任务配置后,重新预检查
目标库是否为空 检查待迁移库在目标 Redis 实例中是否为空 如果检查失败,请先删除目标 Redis 实例中对应库的 Key 后,重新预检查
增量拓扑冲突检查 检查目标 Redis 实例上是否有其他增量迁移任务正在运行 如果检查失败,那么需要结束其他的增量迁移任务后,重新预检查
本文导读目录