云数据库Redis实例间单向数据迁移

如果您需要将一个云数据库 Redis 版实例的数据迁移到另一个云数据库 Redis 版实例中,且您未创建新实例,推荐您通过备份集克隆数据闪回功能将数据克隆至新实例,若您已创建新实例,建议您通过数据传输服务DTS(Data Transmission Service,简称DTS)实现Redis实例(自建Redis和云数据库 Redis 版)间的单向数据迁移。DTS支持全量数据迁移和增量数据迁移,可以实现在不停服的情况下,平滑地完成数据库的迁移。本文将简单对比三种数据迁移方式,并详细介绍通过DTS迁移Redis数据的详细步骤。

云数据库 Redis 版实例间数据迁移的方式对比

对比项\数据迁移方式

DTS

从备份集恢复至新实例

通过数据闪回按时间点恢复数据

适用场景

迁移数据到一个已有的云数据库Redis实例。

根据现有实例的备份数据,克隆一个新实例。

根据现有实例的备份数据,克隆一个新实例。

云数据库Redis实例数据迁移费用

  • 链路配置费用:

    • 全量数据迁移链路免费。

    • 增量数据迁移链路按量计费。

  • 公网流量费用:

    数据迁出阿里云以及接入方式为公网IP时,按流量计费。其余情况免费。

更多计费详情,请参见计费项

  • 数据恢复:免费。

  • 创建新实例:需支付新实例的费用。

  • 数据恢复:试用期间,可免费恢复7天内数据。详情请参见费用说明

  • 创建新实例:需支付新实例的费用。

迁移粒度

库粒度。

实例粒度:恢复实例中指定备份集中的所有数据。

  • 实例粒度:恢复实例中指定时间点的所有数据。

  • Key粒度:恢复指定的Key。

是否支持增量迁移

支持。

不支持。

不支持。

跨账号迁移

支持。

不支持。

不支持。

跨地域迁移

支持。

不支持。

不支持。

不同数据库版本间的数据迁移

支持1

不支持。

不支持。

不同架构的数据迁移

支持2

部分支持2

部分支持2

重要

1使用DTS迁移时,建议源库和目标库的数据库版本一致,避免发生兼容性问题。

2如需将标准架构实例的数据迁移到集群架构或读写分离架构,请先了解集群架构和读写分离架构命令限制。请参见集群架构与读写分离架构实例的命令限制

DTS功能概述

  • 全量迁移

    DTS将源库的存量数据全部迁移到目标库中,全量迁移不收费。

  • 增量迁移

    在全量迁移的基础上,DTS将源库的增量更新实时地同步到目标库中。若需执行增量迁移,请确保可在源库中正常执行PSYNCSYNC命令,否则只能进行全量迁移。增量迁移会根据使用时长产生费用(与迁移的数据量无关),更多信息请参见计费项

    说明

    为保障正常执行增量迁移,建议您关闭源库复制输出缓冲区的限制,设置方法:连接源库,执行CONFIG SET client-output-buffer-limit 'slave 0 0 0'

前提条件

已创建目标Redis实例,且该实例规格需大于原实例已使用的内存。更多信息请参见创建实例

说明

建议目标数据库总内存比源库的内存占用大10%以上。若因为目标数据库内存不足,可能会导致数据不一致、任务失败等问题,您需要清空目标数据库并重新配置任务。

注意事项

迁移期间,请勿对源库和目标库进行扩缩容、变配规格、变更连接地址等操作,否则会导致任务失败,您需重新配置任务。同时,执行迁移操作会占用源库和目标库资源,建议您在业务低峰期执行。

操作步骤

  1. 进入迁移任务的列表页面。

    1. 登录DMS数据管理服务

    2. 在顶部菜单栏中,单击集成与开发(DTS)

    3. 在左侧导航栏,选择数据传输(DTS) > 数据迁移

  2. 单击创建任务

  3. 配置源库及目标库信息,并单击页面下方的测试连接以进行下一步

    类别

    配置

    说明

    任务名称

    DTS会自动生成一个任务名称,建议配置具有业务意义的名称(无唯一性要求),便于后续识别。

    源库信息

    选择DMS数据库实例

    若您已将源库录入至DMS中,可在此选择,选择后无需填写下方的源库信息。若未录入,请忽略该选项。

    数据库类型

    选择Tair/Redis

    接入方式

    根据源库的部署位置进行选择,本示例选择云实例

    实例地区

    选择实例所属的地域。

    是否跨阿里云账号

    本示例为同一阿里云账号间的迁移,选择不跨账号

    实例ID

    选择源库的实例ID。

    数据库密码

    填入连接源Redis数据库的密码。

    说明
    • 非必填项,若没有设置密码可以不填。

    • 数据库密码格式为<user>:<password>。例如,Redis实例自定义的用户名为admin,密码为Rp829dlwa,则此处填入的数据库密码为admin:Rp829dlwa。

    目标库信息

    选择已有的DMS数据库实例

    若您已将目标库录入至DMS中,可在此选择,选择后无需填写下方的目标库信息。若未录入,请忽略该选项。

    数据库类型

    将默认选择Tair/Redis

    接入方式

    选择云实例

    实例地区

    选择目标Redis实例的所属地域。

    实例ID

    选择目标Redis实例ID。

    数据库密码

    填入连接目标Redis数据库的密码。

    说明

    数据库密码格式为<user>:<password>。例如,Redis实例自定义的用户名为admin,密码为Rp829dlwa,则此处填入的数据库密码为admin:Rp829dlwa。

  4. 配置任务对象,并单击页面下方的下一步高级配置

    配置

    说明

    迁移类型

    根据实际情况选择迁移类型

    • 全量迁移 + 增量迁移(默认):使用Redis原生同步逻辑,以内存快照方式将数据写入到目标端,实现源库不停机的迁移。

      若对源库没有SYNC或PSYNC权限,请选择全量迁移

    • 全量迁移:使用SCAN命令遍历整个源端,将遍历到的数据写入到目标端。为保障数据一致性,请勿在迁移期间对源实例写入新的数据。

    目标已存在表的处理模式

    • 预检查并报错拦截(默认):检查目标库中是否存在数据(Key)。

      若存在,则在预检查阶段提示错误,且不会启动迁移任务;若不存在,则通过。

    • 忽略报错并继续执行:跳过目标库对象数据存在性检查项,若目标库中已存在名称相同的Key,则会被覆盖。

    源库对象已选择对象

    源库对象框中勾选待迁移对象,然后单击image.png将其移动至已选择对象框。若您需要移除已选择的对象,可以在已选择对象框中单击目标对象,然后单击image.png将其移动至源库对象

    说明

    迁移对象的选择粒度为库(DB 0 ~ DB 255)。

  5. 进行高级配置,并单击页面下方的下一步校验配置

    通常情况下,该配置项保持默认即可,更多信息请参见配置数据校验附录:高级设置说明

  6. 进行校验配置,并单击页面下方的下一步保存任务并预检查

    通常情况下,该配置项保持默认即可,更多信息请参见在DTS同步或迁移实例中配置数据校验

  7. 进行预检查,完成后单击下一步购买

    若预检查产生警告失败项,请逐条确认。您可以单击查看详情,根据提示进行修复;您也可以单击点击确认告警详情,忽略检查项,但可能会产生数据不一致等问题,给业务带来风险,更多信息请参见预检查问题。完成上述操作后,请重新进行预检查。

  8. 购买页配置信息,并单击购买并启动

    • (可选)选择DTS迁移链路所属的资源组配置,默认为default resource group

    • (可选)选择DTS迁移链路的规格,规格越高,迁移速率越大,费用也越高,默认为large,更多信息请参见数据迁移链路规格说明

    • 阅读并勾选服务条款。

    购买后,迁移任务正式开始,您可在数据迁移界面查看具体进度。

后续步骤

  • 若您使用了增量迁移,请您在完成迁移后,在控制台手动结束或释放该任务。

  • 您可以进行数据校验,更多信息请参见校验迁移后的Redis数据

相关文档

如果您希望将云数据库Redis实例的全量数据克隆至一个新的云数据库Redis实例,可以考虑通过备份恢复的方式实现。通过备份恢复将数据克隆到新实例与通过DTS迁移数据的区别,请参见云数据库 Redis 版实例间数据迁移的方式对比

详细操作,请参见从备份集恢复至新实例通过数据闪回按时间点恢复数据

常见问题

  • 为什么测试连接失败?

    请排查以下几方面:

    • 账号密码错误,Redis的密码格式为user:password,更多信息请参见Redis实例登录方式

    • 若源库为IDC自建数据库或其他云数据库,可能存在网络防火墙,请您手动添加对应地区DTS服务的IP地址,以允许来自DTS服务器的访问,更多信息请参见添加DTS服务器的IP地址段

  • 为什么会运行失败?

    • 迁移期间,若对源库和目标库进行扩缩容、变配规格、变更连接地址等操作,会导致任务失败,您需重新配置任务。

    • 若目标实例内存空间不足,或目标实例为集群架构且某分片达到了内存上限,DTS任务会因内存溢出(Out of Memory)而失败。

    • 若目标实例已开启透明数据加密TDE功能,则暂不支持通过DTS迁移数据。

  • 为什么数据量不一致?

    • 若源库中的某些Key使用了过期(Expire)策略,由于可能存在Key已过期但未被及时删除的情况,所以目标库中的Key数量可能会比源库少。

    • 对于List列表,由于DTS在调用PSYNCSYNC传输数据时,不会对目标端已有的数据执行FLUSH操作,所以可能出现重复的数据。

    • 若在执行全量迁移过程中网络中断,DTS可能会执行多次全量迁移(会自动覆盖同名Key),若在此时对源库执行删除操作,则该命令不会被同步到目标库。可能会造成目标库大于源库的情况。

  • Q:为什么无法选择云数据库Redis 2.8版本实例?

    A:DTS不支持云数据库Redis 2.8版本实例。

  • 为什么会检查Redis逐出策略是否为noeviction

    由于云数据库Redis版的默认数据逐出策略(maxmemory-policy)为volatile-lru,若目标数据库内存不足,触发数据逐出会导致目标库与源库数据不一致的情况,但不会影响任务的正常运行。为避免该情况发生,建议将目标库的数据逐出策略设置为noeviction,当目标库内存不足时,数据会写入失败,同时任务也会失败,但目标库不会因为数据逐出而丢失数据。关于数据逐出策略详情,请参见Redis数据逐出策略介绍

  • 源库中为什么会有DTS_REDIS_TIMESTAMP_HEARTBEAT

    为保障迁移质量,DTS会在源库中插入一个前缀为DTS_REDIS_TIMESTAMP_HEARTBEAT的Key用于记录更新时间点,若源库为集群架构,DTS会在各个shard上均插入该Key。迁移过程中会过滤该Key,迁移任务结束,该Key就会过期。

  • 增量迁移支持哪些命令?

    • 支持如下命令:

      • 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

      • XADD、XCLAIM、XDEL、XAUTOCLAIM、XGROUP CREATECONSUMER、XTRIM

    • 对于通过EVAL或EVALSHA调用的Lua脚本,由于目标端在执行脚本时不会明确返回执行结果,DTS无法确认该类型脚本是否执行成功。