有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
文档中心 > 数据传输服务 > 最佳实践 > 数据同步冲突策略如何选择

操作场景

DTS 支持多对一、一对多、联级单向、双向同步、联级双向同步等复杂拓扑结构,在复杂拓扑结构中,多个节点同时进行数据写入,可能会发生主键冲突问题,DTS 支持对主键冲突进行检测,并提供如下主键冲突的处理机制。
主键冲突策略,对非空唯一键也同样适用。
主键冲突策略
说明
冲突处理时 SQL 语句改写
冲突报错
同步任务中,源库插入(INSERT)主键数据与目标库存在冲突时,任务报错并暂停,需要用户手动处理后才能继续。
任务报错,不做 SQL 改写。
冲突忽略
同步任务中检测到源库的主键插入(INSERT)数据与目标库发生冲突时,忽略源库的主键插入数据,以目标库的内容为准。
INSERT 主键冲突时,将 INSERT 改写为 INSERT IGNORE。
冲突覆盖
同步任务中检测到源库的主键更新(INSERT 和 UPDATE)数据与目标库发生冲突时,用源库的主键数据覆盖目标的主键数据。
INSERT 主键冲突时,将 INSERT 改写为 REPLACE INTO;UPDATE 主键冲突时,将 UPDATE 改写为 DELETE + REPLACE INTO。

冲突策略应用示例

主键冲突策略仅对发生主键冲突的场景进行数据干预,没有发生主键冲突的场景不会干预,应用冲突策略后可以使任务报错提醒给用户或者继续运行。如下将为您示例不同冲突策略的效果。

冲突报错

构建 A > B 的单向同步,ID 为主键数据。图中的数字步骤,表示依次执行的操作。
步骤1中,源库 INSERT 后,数据同步到目标库上引起主键冲突,任务报错。
步骤3中,源库 UPDATE 后,数据同步到 B 上未引起主键冲突,正常更新到目标库。
步骤5中,源库 UPDATE 后,数据同步到 B 上引起主键冲突,任务报错。


冲突忽略

DTS 仅对主键插入(INSERT)操作产生的冲突进行干预。图中的数字步骤,表示依次执行的操作。
构建 A > B 的单向同步,ID 为主键数据。
步骤1中,源库 INSERT 后,数据同步到目标库上引起主键冲突,按照冲突忽略策略,目标库上的数据不变。
步骤2中,源库 UPDATE 后,数据同步到 B 上未引起主键冲突,正常更新到目标库。
步骤4中,源库 UPDATE 后,数据同步到 B 上引起主键冲突,请注意,这里任务会报错。


冲突覆盖

DTS 对主键更新(INSERT 和 UPDATE)操作产生的冲突会进行干预。图中的数字步骤,表示依次执行的操作。
构建 A > B 的单向同步,ID 为主键数据。
步骤1中,源库 INSERT 后,数据同步到目标库上引起主键冲突,按照冲突覆盖策略,目标库上的数据以源库为准。
步骤2中,源库 UPDATE 后,数据同步到 B 上未引起主键冲突,正常更新到目标库。
步骤4中,源库 UPDATE 后,数据同步到 B 上引起主键冲突,按照冲突覆盖策略,目标库上的数据以源库为准。


冲突策略与数据一致性

在两地三中心,异地多活等复杂数据架构中,会有三个或三个以上节点需要同时进行数据写入,保证多个节点的一致性至关重要。许多用户误以为可以通过主键冲突策略来保证数据以某一个节点为准进行更新,这是不合理。
例如在下图的双向同步场景中,A > B,B > A 都设置为冲突覆盖,在 A,B 节点上同时 INSERT 主键为1的数据,最终的结果是 A、B 上主键1的数据发生交换。

实际场景中要实现多节点数据一致性,一般通过划分主键分区,引入额外的协调机制(例如给数据增加版本号,实现按版本号覆盖的机制)等方法,单独靠冲突策略无法达到这一诉求。