从ECS上的自建Redis同步至Redis实例

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

数据传输服务DTS(Data Transmission Service)支持Redis数据库的单向同步,适用于异地多活、数据异地容灾等多种应用场景。本文以ECS上的自建Redis同步至Redis实例为例,介绍数据同步作业的配置流程。

警告

完成数据同步作业的配置后,请勿变更源数据库或目标数据库的架构类型(例如将主从架构变更为集群架构),否则会导致数据同步失败。

前提条件

  • 源Redis数据库的版本为2.8、3.0、3.2、4.0或5.0版本。

    说明

    如需跨版本同步(仅支持从低版本同步到高版本)请提前确认兼容性。例如创建按量付费的Redis实例来测试,测试完成后可将该实例释放或转为包年包月。

  • 目标Redis实例的存储空间需大于源Redis数据库已使用的存储空间。

  • 当源Redis数据库为集群架构时,集群的每个节点必须能够执行psync命令,且连接的密码一致。

  • 源Redis实例Slave和Master之间的复制超时时间参数repl-timeout,默认为60秒, 建议使用config set repl-timeout 600命令设置为600秒。若源数据库数据量比较大,可以适当增大repl-timeout参数的值。

注意事项

  • DTS在执行全量数据初始化时将占用源库和目标库一定的资源,可能会导致数据库服务器负载上升。如果数据库业务量较大或服务器规格较低,可能会加重数据库压力,甚至导致数据库服务不可用。建议您在执行数据同步前谨慎评估,在业务低峰期执行数据同步。

  • 如果源库中的某些Key使用了过期(expire)策略,由于可能存在Key已过期但未被及时删除的情况,所以在目标库中查看到的Key数量(例如通过info命令查看)会比源库的Key数量少。

    说明

    源和目标库中,未设置过期策略或未过期的Key数量是一致的。

  • 如果在源数据库的配置文件redis.conf中配置了bind参数,请将该参数的值设置为ECS的内网IP地址以保障DTS可以正常连接源数据库。

  • 为保障同步链路稳定性,建议将源Redis数据库的配置文件redis.confrepl-backlog-size参数的值适当调大。

  • 为保障同步质量,DTS会在源Redis数据库中插入一个key:DTS_REDIS_TIMESTAMP_HEARTBEAT,用于记录更新时间点。

  • 如果配置Redis集群间的数据同步,请勿在源集群中执行FLUSHDBFLUSHALL命令,否则将导致源和目标的数据不一致。

  • 若目标数据库内存不足,触发数据逐出时,由于云数据库 Tair(兼容 Redis)的默认数据逐出策略(maxmemory-policy)为volatile-lru,会导致目标库与源库数据不一致的情况,但不会影响任务的正常运行。

    为避免该情况发生,建议将目标库的数据逐出策略设置为noeviction,当目标库内存不足时,数据会写入失败,同时任务也会失败,但目标库不会因为数据逐出而丢失数据。

    说明

    关于数据逐出策略详情,请参见Redis数据逐出策略介绍

  • 同步期间,如自建Redis发生扩缩容(如增加或者减少分片)、规格变配(如扩大内存),则您需重新配置任务。且为保障数据一致性,建议重新配置任务前,先清空已同步至目标Redis的数据。

  • 同步期间,如自建Redis连接地址变化,则您需要重新配置任务。

  • 源库单机版Redis同步到目标库集群版Redis的操作限制:由于集群cluster只允许单个命令操作单个slot,若在源库执行多Key操作时,Key不在同一个slot或涉及多个slot,则会出现以下报错:

    CROSSSLOT Keys in request don't hash to the same slot

    建议在DTS同步过程中仅执行单Key操作,以免导致链路中断。

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

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

  • 如果源库为只读实例或者DTS账号没有写(SETEX)权限,上报的延迟可能不准确。

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

  • 若在数据同步过程中出现包括但不限于以下情况,可能会使全量数据重新同步至目标端,从而导致数据不一致。

    • 源端或目标端Redis发生连接闪断,导致断点续传失败。

    • 源端或目标端Redis发生主备切换或故障切换。

    • 源端或目标端Redis的连接地址发生变化。

    • 修改DTS实例的同步对象。

  • 云数据库Tair(兼容Redis)实例已开启TLS(Transport Layer Security)加密功能,则必须以SSL安全连接的方式接入到DTS(不支持TLSv1.3)。当前暂不支持已开启SSL的云数据库Tair(兼容Redis)实例,以云实例的方式接入DTS。

  • 若实例运行失败,DTS技术支持人员将在8小时内尝试恢复该实例。在恢复失败实例的过程中,可能会对该实例进行重启、调整参数等操作。

    说明

    在调整参数时,仅会修改实例的参数,不会对数据库中的参数进行修改。可能修改的参数,包括但不限于修改实例参数中的参数。

费用说明

同步类型链路配置费用
库表结构同步和全量数据同步不收费。
增量数据同步收费,详情请参见计费概述

支持的同步拓扑

  • 一对一单向同步

  • 一对多单向同步

  • 级联单向同步

关于各类同步拓扑的介绍及注意事项,请参见数据同步拓扑介绍

支持的同步命令

  • APPEND

  • BITOP、BLPOP、BRPOP、BRPOPLPUSH

  • DECR、DECRBY、DEL

  • EVAL、EVALSHA、EXEC、EXPIRE、EXPIREAT

  • 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

  • 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

  • SWAPDB、UNLINK(仅当源端Redis实例的版本为4.0时支持)

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

说明
  • 不支持同步PUBLISH命令。

  • 对于通过EVAL或者EVALSHA调用Lua脚本,在增量数据同步时,由于目标端在执行脚本时不会明确返回执行结果,DTS无法确保该类型脚本能够执行成功。

  • 对于List,由于DTS在调用sync或psync进行重传时,不会对目标端已有的数据进行清空,可能导致出现重复数据。

操作步骤

  1. 购买数据同步实例,详情请参见购买数据同步任务

    说明

    购买时,源实例和目标实例均选择为Redis

  2. 登录数据传输控制台

    说明

    若数据传输控制台自动跳转至数据管理DMS控制台,您可以在右下角的jiqiren中单击返回旧版,返回至旧版数据传输控制台。

  3. 在左侧导航栏,单击数据同步

  4. 同步作业列表页面顶部,选择同步的目标实例所属地域。

  5. 定位至已购买的数据同步实例,单击配置同步链路

  6. 配置数据同步的源实例及目标实例信息。同步源目实例信息配置

    类别

    配置

    说明

    同步作业名称

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

    源实例信息

    实例类型

    选择ECS上的自建数据库

    实例地区

    购买数据同步实例时选择的源实例地域信息,不可变更。

    ECS实例ID

    选择作为同步数据源的ECS实例ID。

    说明

    当源Redis数据库为集群架构时,选择任一节点的Master所在的ECS实例ID。

    数据库类型

    固定为Redis

    实例模式

    根据源Redis数据库的架构选择单机版集群版

    端口

    填入源Redis数据库的服务端口,默认为6379,本案例填入7000

    说明

    当源Redis数据库为集群架构时,填入任一节点的Master的服务端口。

    数据库密码

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

    说明

    非必填项,如果没有设置密码可以不填。

    目标实例信息

    实例类型

    选择Redis实例

    实例地区

    购买数据同步实例时选择的目标实例地域信息,不可变更。

    实例ID

    选择目标Redis实例ID。

    数据库密码

    填入连接目标Redis实例的密码。

    说明

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

  7. 单击页面右下角的授权白名单并进入下一步

    说明
    • 如果源或目标数据库是阿里云数据库实例(例如RDS MySQL云数据库MongoDB版等)或ECS上的自建数据库,DTS会自动将对应地区DTS服务的IP地址添加到阿里云数据库实例的白名单或ECS的安全规则中,您无需手动添加,请参见DTS服务器的IP地址段

    • DTS任务完成或释放后,建议您手动删除添加的DTS服务器IP地址段。

  8. 配置目标已存在表的处理模式和同步对象。配置处理模式和同步对象

    配置

    说明

    目标已存在表的处理模式

    • 预检查并报错拦截:检查目标库是否为空。如果待同步的目标库为空,则通过该检查项目;如果不为空,则在预检查阶段提示错误,数据同步作业不会被启动。

    • 忽略报错并继续执行:跳过目标库是否为空的检查项。

      警告

      选择为忽略报错并继续执行后,如果在同步过程中遇到目标库中的Key与源库中的Key相同,会将源库的数据覆盖写入目标库中,请谨慎选择。

    同步对象

    • 源库对象框中单击待同步的数据库,然后单击将其移动到已选择对象框。

    • 同步对象的选择粒度为库,暂不支持Key粒度的选择。

    映射名称更改

    不支持更改映射名称。

    源表DMS_ONLINE_DDL过程中是否复制临时表到目标库

    如源库使用数据管理DMS(Data Management)执行Online DDL变更,您可以选择是否同步Online DDL变更产生的临时表数据。

    • :同步Online DDL变更产生的临时表数据。

      说明

      Online DDL变更产生的临时表数据过大,可能会导致同步任务延迟。

    • :不同步Online DDL变更产生的临时表数据,只同步源库的原始DDL数据。

      说明

      该方案会导致目标库锁表。

    源、目标库无法连接重试时间

    当源、目标库无法连接时,DTS默认重试720分钟(即12小时),您也可以自定义重试时间。如果DTS在设置的时间内重新连接上源、目标库,同步任务将自动恢复。否则,同步任务将失败。

    说明

    由于连接重试期间,DTS将收取任务运行费用,建议您根据业务需要自定义重试时间,或者在源和目标库实例释放后尽快释放DTS实例。

  9. 上述配置完成后单击页面右下角的下一步

  10. 配置同步初始化选项,当前固定为包含全量数据+增量数据Redis同步初始化

    说明
    • DTS会将源Redis实例中的存量数据同步至目标Redis实例中,并同步增量数据。

    • 如果跳出版本相关的报错提示,请您按照提示将源Redis实例升级至指定版本。关于升级版本方式,请参见升级大版本升级小版本与代理版本

  11. 上述配置完成后,单击页面右下角的预检查并启动

    说明
    • 在同步任务正式启动之前,会先进行预检查。只有预检查通过后,才能成功启动同步任务。

    • 如果预检查失败,单击具体检查项后的提示,查看失败详情。

      • 您可以根据提示修复后重新进行预检查。

      • 如无需修复告警检测项,您也可以选择确认屏蔽忽略告警项并重新进行预检查,跳过告警检测项重新进行预检查。

  12. 预检查对话框中显示预检查通过后,关闭预检查对话框,同步作业将正式开始。

  13. 等待同步作业的链路初始化完成,直至处于同步中状态。数据同步状态

    说明

    您可以在数据同步页面,查看数据同步作业的状态。