数据传输服务 数据同步冲突策略如何选择

DTS 支持多对一、一对多、联级单向、双向同步、联级双向同步等复杂拓扑结构,在复杂拓扑结构中,多个节点同时进行数据写入,可能会发生主键冲突问题,DTS 支持配置不同的主键冲突策略,可以在冲突时报错提示用户处理,或者使任务继续运行。不同策略的具体实现如下表所示。

相关产品
数据传输服务 产品页,含版本规格、价格与购买入口。

一、操作场景

主键冲突策略,对唯一键也同样适用。

主键冲突策略 DTS 在目标库上的 SQL 改写规则 策略效果说明
冲突报错 不做 SQL 改写。 同步任务中,源库插入(INSERT)主键数据与目标库存在冲突时,任务报错并暂停,需要用户手动处理后才能继续。
冲突忽略 将 INSERT 改写为 INSERT IGNORE。 同步任务中,源库的主键插入(INSERT)数据与目标库发生冲突时,忽略源库的主键插入数据,以目标库的内容为准。
冲突覆盖 将 INSERT 改写为 REPLACE INTO;将 UPDATE 改写为 DELETE + REPLACE INTO。 同步任务中,源库的主键更新(INSERT 和 UPDATE)数据与目标库发生冲突时,用源库的主键数据覆盖目标的主键数据。

二、冲突报错

冲突策略配置为冲突报错时,DTS 仅对主键插入(INSERT)操作产生的冲突进行干预。

构建 A > B 的单向同步,ID 为主键数据。图中的数字步骤,表示依次执行的操作。

·步骤1中,源库 INSERT 后,数据同步到目标库上引起主键冲突,任务报错。

·步骤4中,源库 UPDATE 后,数据同步到 B 上未引起主键冲突,正常更新到目标库。

·步骤6中,源库 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的数据发生交换。

赞 (0)
上一篇 4天前
下一篇 4天前