有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
文档中心 > 数据传输服务 > 最佳实践 > 构建双向同步数据结构

操作场景

数据传输服务 DTS 支持两个数据库之间的双向数据同步,可应用于异地多活场景。双向同步通过创建两个单向同步任务来构建双向的拓扑,支持在同步过程中,两个数据库实例同时写入数据。
单向同步的约束、操作限制等要求双向同步都需要满足,请参考 数据同步 中的对应同步场景。

注意事项

DTS 在执行全量数据同步时,会占用一定源端实例资源,可能会导致源实例负载上升,增加数据库自身压力。如果您数据库配置过低,建议您在业务低峰期进行。
为了避免数据重复,请确保需要同步的表具有主键或者非空唯一键,对于没有主键或者非空唯一键的表,有数据重复的风险。
用户应提前规划好数据,两个源端负责更新(增、删、改)不同主键的数据,避免主键冲突或者相同主键数据互相覆盖等情况。例如 A 数据库上更新1,3,5的主键数据,B 数据库上更新2,4,6的主键数据。如果因为业务原因,两个源端负责的主键存在交叉,需要参考 推荐配置,选择合理的冲突策略,使同步行为和数据符合预期。
提前准备好目标数据库,并对执行同步任务的账号 授权源库和目标库的对应权限

应用限制

双向同步最多仅支持在一个方向进行 DDL,同步链路不能形成环路(正向同步、反向同步只能选择一个进行 DDL)。
仅 MySQL/TDSQL-C MySQL/MariaDB/Percona 之间的同步链接支持双向同步。
源端或者目标端有 MyISAM 引擎的表时,不支持构建双向同步任务,否则会形成数据回环。

典型场景推荐配置

双向同步是通过创建两个单向同步任务来构建双向拓扑,每个单向同步的步骤与普通的单向同步的步骤类似,只是在如下同步选项设置有差异。


如下列出了典型场景的推荐配置,请用户参考操作。
场景
时间要求
同步任务
初始化类型
已存在同名表
冲突处理机制
同步操作类型
场景一:实例 A 有库表结构和数据,实例 B 为空
需要等任务一进行到“同步增量”阶段再创建任务二
任务一:正向同步 A > B
结构初始化 + 全量数据初始化
前置校验并报错
请用户自行选择。
示例:如果某个主键发生冲突,用户需要以 A 的内容为准,则任务一选择冲突覆盖,任务二选择冲突忽略或者冲突报错。
冲突策略的生效对象仅对当前发生主键冲突时的主键数据。
DDL 最多支持在一个任务中选择。
除 DDL 外,其他操作类型两个任务保持一致。
任务二:反向同步 B > A
不选择
忽略并继续执行
场景二:实例 A 有库表结构和数据,实例 B 只有库表结构,无数据
任务一:正向同步 A > B
全量数据初始化
忽略并继续执行
任务二:反向同步 B > A
不选择
忽略并继续执行
场景三:实例 A、B 都有库表结构和数据
任务一:正向同步 A > B
全量数据初始化
忽略并继续执行
任务二:反向同步 B > A
全量数据初始化
忽略并继续执行

操作步骤

本场景以构建上海地域自建 MySQL A 与北京地域腾讯云 MySQL B 的双向同步为例,A 初始状态有库表结构和数据,B 初始状态为空。发生主键冲突时以 A 的更新为准。A > B 的同步,主键冲突策略为冲突覆盖,同步 DDL + DML;B > A 的同步,主键冲突策略为冲突忽略,仅同步 DML。




创建同步任务一:正向同步 A > B

1. 登录 数据同步购买页,选择相应配置,单击立即购买
参数
描述
计费模式
支持包年包月和按量计费。
源实例类型
选择 MySQL,购买后不可修改。
源实例地域
选择源实例 A 所在地域,购买后不可修改。
目标实例类型
选择 MySQL,购买后不可修改。
目标实例地域
选择目的实例 B 所在地域,购买后不可修改。
规格
请根据业务诉求选择规格,规格越高,性能越好。详情请参考 计费概述
2. 购买完成后,返回 数据同步列表,可看到刚创建的数据同步任务,刚创建的同步任务需要进行配置后才可以使用。
3. 在数据同步列表,单击操作列的配置,进入配置同步任务页面。


4. 在配置同步任务页面,配置源端实例、账号密码,配置目标端实例、账号和密码,测试连通性后,单击下一步



设置项
参数
描述
任务设置
任务名称
DTS 会自动生成一个任务名称,用户可以根据实际情况进行设置。
运行模式
支持立即执行和定时执行两种模式。
源实例设置
源实例类型
购买时所选择的数据库 A 的类型,不可修改。
源实例地域
购买时选择的数据库 A 所在地域,不可修改。
服务提供商
选择“普通”。
接入类型
自建数据库一般可以选择公网方式,也可以选择 VPN 接入,专线或者云联网的方式,需要根据实际的网络情况选择。本场景以“公网”为例,不同接入类型的准备工作请参考 准备工作概述
目标实例设置
目标实例类型
购买时选择的目标数据库 B 的类型,不可修改。
目标实例地域
购买时选择的目标数据库 B 所在地域,不可修改。
接入类型
本场景选择“云数据库”。
实例 ID
数据库 B 的实例 ID。
账号
数据库 B 的账号,账号权限需要满足要求。
密码
数据库 B 的密码。
5. 在设置同步选项和同步对象页面,将对数据初始化选项、数据同步选项、同步对象选项进行设置,在设置完成后单击保存并下一步


设置项
参数
描述
数据初始化选项
初始化类型
本场景选择结构初始化 + 全量数据初始化。
结构初始化:同步任务执行时会先将源实例中表结构初始化到目标实例中。
全量数据初始化:同步任务执行时会先将源实例中数据初始化到目标实例中。
已存在同名表
本场景选择前置校验并报错。
前置校验并报错:存在同名表则报错,流程不再继续。
忽略并继续执行:全量数据和增量数据直接追加目标实例的表中。
数据同步选项
冲突处理机制
根据业务情况自行选择,本场景选择冲突覆盖。
冲突报错:在同步时发现表主键冲突,报错并暂停数据同步任务。
冲突忽略:在同步时发现表主键冲突,保留目标库主键记录。
冲突覆盖:在同步时发现表主键冲突,用源库主键记录覆盖目标库主键记录。
同步操作类型
支持操作:Insert、Update、Delete、DDL。打开 “DDL 自定义”,可以根据需要选择不同的 DDL 同步策略。详情请参考 设置 SQL 过滤策略双向同步最多支持在一个同步任务中选择 DDL。本场景在任务一中选择 DDL,在任务二中不选择。
同步对象选项
源实例库表对象
选择待同步的对象。
已选对象
支持库表映射(库表重命名),将鼠标悬浮在库名、表名上即显示编辑按钮,单击后可在弹窗中填写新的名称。
6. 在 A > B 的正向同步任务中,DTS 会进行源库和目标库参数校验。完成校验并全部校验项通过后,单击启动任务。在 B > A 的反向同步任务中,DTS 还会增加 DDL 校验。
说明:
如果校验任务不通过,可以参考 校验不通过处理方法 修复问题后重新发起校验任务。
在校验结果中出现告警项不影响启动任务,但推荐单击查看详情获取建议进行调整。
DDL 校验


源库和目标库参数校验


7. 返回数据同步任务列表,任务开始进入运行中状态。



创建同步任务二:反向同步 B > A

正向同步和反向同步操作基本一致,以下仅对差异点进行详细说明。
1. 确定任务一的状态,在任务一进行到“同步增量”阶段,再开始配置任务二。 这个时间要求,仅对 B 数据为空的场景,其他场景不需要等待。



2. 设置同步源和目标数据库。 本步骤中的源和目标数据需要与任务一中的数据进行互换。



3. 设置同步选项和同步对象。
初始化类型:不选择。
已存在同名表:忽略并继续执行。
主键冲突处理机制:根据业务情况自行选择,本场景选择冲突忽略。
同步操作类型:双向同步仅支持在一个同步任务中选择 DDL。本场景在任务一中选择 DDL,在任务二中不选择。


4. 在校验任务页面,进行 DDL 校验。



结束同步任务

如不需要同步任务,可选择操作列的更多 > 结束,关闭同步任务。