数据传输服务DTS(Data Transmission Service)支持云数据库MongoDB版(分片集群架构)间的双向同步,适用于异地多活(单元化)、数据异地容灾等多种应用场景。本文介绍双向数据同步的配置步骤。

前提条件

  • 已创建源和目标云数据库MongoDB版分片集群实例,创建方式,请参见创建分片集群实例
    说明 支持的版本,请参见同步方案概览
  • 目标云数据库MongoDB版实例的存储空间须大于源云数据库MongoDB版实例占用的存储空间。
  • 您需要将Shard和ConfigServer节点的参数replication.oplogGlobalIdEnabled设置为true,设置方式,请参见设置数据库参数
  • 源和目标云数据库MongoDB版为分片集群架构,您需要根据业务需求,在源和目标云数据库MongoDB版实例中创建需要分片的数据库和集合,并配置数据分片。具体操作,请参见设置数据分片以充分利用Shard性能
    说明
    • 配置数据分片可避免数据被同步至同一Shard,导致无法发挥集群性能。
    • Shard节点的账户密码和连接地址,且各shard的账号和密码需统一。设置方法,请参见创建Shard节点连接地址
    • 本配置场景以先配置后购买DTS任务为例,无需填写源云数据库MongoDB版(分片集群架构)下的Shard数量。

      如您先购买后配置DTS任务,则需要在购买DTS任务时填写其正确的Shard数量。

注意事项

类型 说明
源和目标库的限制
  • 带宽要求:源库所属的服务器需具备足够出口带宽,否则将影响数据同步速率。
  • 待同步的集合需具备主键或唯一约束,且字段具有唯一性,否则可能会导致目标数据库中出现重复数据。
  • 如同步对象为集合级别,且需进行编辑(如集合的名称映射),则单次同步任务仅支持同步至多1000张集合。当超出数量限制,任务提交后会显示请求报错,此时建议您拆分待同步的集合,分批配置多个任务,或者配置整库的同步任务。
  • Oplog日志:
    • 需开启。
    • 如为增量同步任务,DTS要求源数据库的Oplog日志保存24小时以上,如为全量同步和增量同步任务,DTS要求源数据库的Oplog日志至少保留7天以上(您可在全量同步完成后将Oplog日志保存时间设置为24小时以上),否则DTS可能因无法获取Oplog日志而导致任务失败,极端情况下甚至可能会导致数据不一致或丢失。由于您所设置的Oplog日志保存时间低于DTS要求的时间进而导致的问题,不在DTS的SLA保障范围内。

  • MongoDB分片集群为源的单向同步不支持源端做分片的扩缩容,双向同步源和目标都不支持分片数量的扩缩容,否则会导致DTS任务失败。
其他限制
  • 建议源和目标库的MongoDB的数据库版本保持一致,或者从低版本同步到高版本以保障兼容性。如为高版本同步至低版本,可能存在数据库兼容性问题。
  • 如双向同步任务的源实例或目标实例位于海外地域,则仅支持同地域的双向同步,不支持跨地域的双向同步。例如,支持日本地域间的双向同步,不支持日本地域与法兰克福地域间的双向同步。
  • 不支持同步admin和local库中的数据。
  • 不保留事务信息,即源库中的事务同步到目标库时会转变为单条的记录。
  • 执行数据同步前需评估源库和目标库的性能,同时建议业务低峰期执行数据同步。否则全量数据初始化时将占用源库和目标库一定的读写资源,可能会导致数据库的负载上升。
  • 全量初始化会并发执行INSERT操作,导致目标数据库的集合产生碎片,因此全量初始化完成后目标实例的集合空间比源实例的集合空间大。
  • 在DTS同步期间,不允许有除DTS外的数据写入目标库,否则会导致源库与目标库数据不一致。例如,有除DTS外的数据写入目标库时,使用DMS执行在线DDL变更,可能引起目标库数据丢失。

支持的双向同步架构

目前DTS仅支持两个云数据库MongoDB版实例(分片集群架构)之间的双向同步,暂不支持多个云数据库MongoDB版实例之间的双向同步。

支持的冲突检测

为保障同步数据的一致性,您需要确保同一个主键、业务主键或唯一键的记录只在双向同步的一个节点进行更新。如果同时更新则会按照您在数据同步作业中配置的冲突修复策略进行响应。

DTS通过冲突检测和修复最大程度地维护双向同步实例的稳定性。目前DTS支持进行检测的冲突类型包括:
  • INSERT导致的唯一性冲突

    同步INSERT语句时违背了唯一性约束,例如双向同步的两个节点同时或者在极为接近的时间INSERT某个主键值相同的记录,那么同步到对端时,会因为已经存在相同主键值的记录,导致Insert同步失败。

  • UPDATE更新的记录不完全匹配
    • UPDATE要更新的记录在同步目标实例中不存在时,DTS会自动转化为INSERT,此时可能会出现唯一键的唯一性冲突。
    • UPDATE要更新的记录出现主键或唯一键冲突。
  • DELETE对应的记录不存在

    DELETE要删除的记录在同步的目标实例中不存在。出现这种冲突时,不论配置何种冲突修复策略,DTS都会自动忽略DELETE操作。

注意
  • 由于数据同步两端的系统时间可能存在差异、同步存在延时等多种因素,DTS无法完全保证冲突检测机制能够完全防止数据的冲突。在使用双向同步时,您需要在业务层面配合进行相应的改造,保证同一个主键、业务主键或唯一键的记录只在双向同步的某个节点进行更新。
  • 对于上述数据同步的冲突,DTS提供了修复策略,您可以在配置双向同步时选择。

任务步骤说明

同步类型 说明
库表结构同步 将源云数据库MongoDB版中同步对象的结构同步到目标云数据库MongoDB版中。
全量同步 将源云数据库MongoDB版同步对象的存量数据全部同步到目标云数据库MongoDB版中。
说明 支持全量同步DATABASE、COLLECTION、INDEX。
增量同步 在全量同步的基础上,将源云数据库MongoDB版的增量更新同步到目标云数据库MongoDB版中。
说明 支持同步的增量更新如下:
  • CREATE COLLECTION、INDEX
  • DROP COLLECTION、INDEX
  • RENAME COLLECTION

操作步骤

注意 本配置场景以先配置后购买DTS任务为例,无需填写源云数据库MongoDB版(分片集群架构)下的Shard数量。

如您先购买后配置DTS任务,则需要在购买DTS任务时填写其正确的Shard数量。

  1. 登录新版DTS同步任务的列表页面
    说明 您也可以登录DMS数据管理服务。在顶部菜单栏中,选择集成与开发(DTS) > 数据集成 > 数据同步
  2. 在页面左上角,选择同步实例所属地域。
    地域
  3. 在页面左上方选择同步的目标实例所属地域。
  4. 单击创建任务,配置源库及目标库信息。
    警告 选择源和目标实例后,建议您仔细阅读页面上方显示的使用限制,以成功创建并执行同步任务。
    源目库信息
    类别 配置 说明
    任务名称

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

    源库信息
    数据库类型 选择MongoDB
    接入方式 选择阿里云实例
    实例地区 选择源云数据库MongoDB版所属地域。
    架构类型 选择分片集群架构
    实例ID 选择源云数据库MongoDB版实例ID。
    数据库名称 填入源云数据库MongoDB版实例中同步对象所属数据库的名称。
    数据库账号 填入源云数据库MongoDB版的数据库账号,需具备待同步库、admin库和local库的read权限。
    数据库密码

    填入该数据库账号对应的密码。

    shard账号 填入源云数据库MongoDB版的数据库shard账号,申请shard账号的具体操作请参见申请Shard节点
    shard密码 填入源云数据库MongoDB版的数据库shard密码。
    目标库信息
    数据库类型 选择MongoDB
    接入方式 选择阿里云实例
    实例地区 选择目标云数据库MongoDB版所属地域。
    架构类型 选择分片集群架构
    实例ID 选择目标云数据库MongoDB版实例ID。
    数据库名称 填入目标云数据库MongoDB版实例中同步对象所属数据库的名称。
    数据库账号 填入目标云数据库MongoDB版的数据库账号,需具备dbAdminAnyDatabase权限、目标库的readWrite权限和local库的read权限。
    数据库密码

    填入该数据库账号对应的密码。

    shard账号 填入目标云数据库MongoDB版的数据库shard账号。
    shard密码 填入目标云数据库MongoDB版的数据库shard密码。
  5. 配置完成后,单击页面右下角的测试连接以进行下一步
    说明
    • 如果源或目标数据库是阿里云数据库实例(例如RDS MySQL云数据库MongoDB版等)或ECS上的自建数据库,DTS会自动将对应地区DTS服务的IP地址添加到阿里云数据库实例的白名单或ECS的安全规则中,您无需手动添加,请参见DTS服务器的IP地址段
    • DTS任务完成或释放后,建议您手动删除添加的DTS服务器IP地址段。
  6. 配置任务对象及高级配置。
    • 基础配置mongnDB基础配置
      配置 说明
      任务步骤

      固定选中增量同步。默认情况下,您还需要同时选中库表结构同步全量同步。预检查完成后,DTS会将源实例中待同步对象的全量数据在目标集群中初始化,作为后续增量同步数据的基线数据。

      目标已存在表的处理模式
      • 预检查并报错拦截:检查目标数据库中是否有同名的表。如果目标数据库中没有同名的表,则通过该检查项目;如果目标数据库中有同名的表,则在预检查阶段提示错误,数据同步任务不会被启动。

        说明 如果目标库中同名的表不方便删除或重命名,您可以更改该表在目标库中的名称,请参见库表列名映射
      • 忽略报错并继续执行:跳过目标数据库中是否有同名表的检查项。
        警告 选择为忽略报错并继续执行,可能导致数据不一致,给业务带来风险,例如:
        • 表结构一致的情况下,如在目标库遇到与源库主键的值相同的记录:
          • 全量期间,DTS会保留目标集群中的该条记录,即源库中的该条记录不会同步至目标数据库中。
          • 增量期间,DTS不会保留目标集群中的该条记录,即源库中的该条记录会覆盖至目标数据库中。
        • 表结构不一致的情况下,可能会导致无法初始化数据、只能同步部分列的数据或同步失败。
      同步拓扑 请选择双向同步
      是否过滤DDL
      • 选择为是:不同步DDL操作。
      • 选择为否:同步DDL操作。
        说明 DDL语法同步方向限制 。为保障双向同步链路的稳定性,只支持正向同步任务同步DDL,不支持反向同步任务同步DDL。
      冲突修复策略 如遇到以上支持的冲突检测,根据业务需要,选择合适的冲突修复策略。
      • TaskFailed(遇到冲突,任务报错退出)

        当数据同步遇到冲突时,同步任务直接报错并退出,同步任务进入失败状态,需要您介入修复任务。

      • Ignore(遇到冲突,直接使用目标实例中的冲突记录)

        当数据同步遇到冲突时,直接跳过当前同步语句,继续往下执行,选择使用目标库中的冲突记录。

      • Overwrite(遇到冲突,直接覆盖目标实例中的冲突记录)

        当数据同步遇到冲突时,直接覆盖目标库中的冲突记录。

      说明 本场景仅支持Ignore
      同步对象

      源库对象框中单击待同步对象,然后单击向右小箭头将其移动至已选择对象框。

      说明 同步对象的选择粒度为DATABASE、COLLECTION。
      映射名称更改
      • 如需更改单个同步对象在目标实例中的名称,请单击已选择对象中的同步对象,设置方式,请参见库表列名单个映射
      • 如需批量更改同步对象在目标实例中的名称,请单击已选择对象方框右上方的批量编辑,设置方式,请参见库表列名批量映射
      过滤待同步数据

      支持设置WHERE条件过滤数据,请参见通过SQL条件过滤任务数据

    • 高级配置mongoDB高级配置
      配置 说明
      目标库对象名称大小写策略

      您可以配置目标实例中迁移对象的库名、集合名的英文大小写策略。默认情况下选择DTS默认策略,您也可以选择与源库、目标库默认策略保持一致。更多信息,请参见目标库对象名称大小写策略

      源库、目标库无法连接后的重试时间
      默认重试120分钟,您也可以在取值范围(10~1440分钟)内自定义重试时间,建议设置30分钟以上。如果DTS在设置的时间内重新连接上源、目标库,同步任务将自动恢复。否则,同步任务将失败。
      说明
      • 针对同源或者同目标的多个DTS实例,如DTS实例A和DTS实例B,设置网络重试时间时A设置30分钟,B设置60分钟,则重试时间以低的30分钟为准。
      • 由于连接重试期间,DTS将收取任务运行费用,建议您根据业务需要自定义重试时间,或者在源和目标库实例释放后尽快释放DTS实例。
  7. 上述配置完成后,单击页面下方的下一步保存任务并预检查
    说明
    • 在同步作业正式启动之前,会先进行预检查。只有预检查通过后,才能成功启动同步作业。
    • 如果预检查失败,单击具体检查项后的提示,查看失败详情。
      • 您可以根据提示修复后重新进行预检查。
      • 如无需修复告警检测项,您也可以选择确认屏蔽忽略告警项并重新进行预检查,跳过告警检测项重新进行预检查。
  8. 预检查通过率显示为100%时,单击下一步购买
  9. 购买页面,选择数据同步实例的计费方式、链路规格,详细说明请参见下表。
    类别 参数 说明
    信息配置 计费方式
    • 预付费(包年包月):在新建实例时支付费用。适合长期需求,价格比按量付费更实惠,且购买时长越长,折扣越多。
    • 后付费(按量付费):按小时扣费。适合短期需求,用完可立即释放实例,节省费用。
    链路规格 DTS为您提供了不同性能的同步规格,同步链路规格的不同会影响同步速率,您可以根据业务场景进行选择,详情请参见数据同步链路规格说明
    订购时长 在预付费模式下,选择包年包月实例的时长和数量,包月可选择1~9个月,包年可选择1~3年。
    说明 该选项仅在付费类型为预付费时出现。
  10. 配置完成后,阅读并勾选《数据传输(按量付费)服务条款》
  11. 单击购买并启动,正向同步任务正式开始,您可在任务列表查看具体任务进度。
  12. 等待正向同步任务的同步初始化完成,直至状态处于运行中。您可以在数据同步页面,查看数据同步状态。
  13. 数据同步页面,单击创建任务,参考步骤4配置源库及目标库信息
    注意 配置反向任务时,您需要选择正确的源和目标实例。反向同步中源实例为正向同步中的目标实例,目标实例为正向同步中的源实例,并且您还需仔细确认实例信息(如数据库名称、账号、密码)的一致性。
  14. 参考步骤6配置任务对象及高级配置。建议正反向任务的配置保持一致。其他说明,如下表所示。
    基础配置
    配置 说明
    目标已存在表的处理模式 目标已存在表的处理模式不检测正向同步任务同步至目标实例中的表。
    同步对象 建议与正向任务配置时选择的同步对象保持一致。

    您也可以按照业务需求,新增或删除同步对象。

    映射名称更改 反向任务配置时不建议您使用该功能,否则会存在数据不一致的风险。
  15. 上述配置完成后,单击页面下方的下一步保存任务并预检查
    说明
    • 在同步作业正式启动之前,会先进行预检查。只有预检查通过后,才能成功启动同步作业。
    • 如果预检查失败,单击具体检查项后的提示,查看失败详情。
      • 您可以根据提示修复后重新进行预检查。
      • 如无需修复告警检测项,您也可以选择确认屏蔽忽略告警项并重新进行预检查,跳过告警检测项重新进行预检查。
  16. 预检查通过率显示为100%时,单击返回列表
  17. 第二个同步任务配置完成后,等待两个同步任务的链路状态均处于同步中,即完成双向数据同步的配置流程。