操作场景
DTS 支持多对一、一对多、联级单向、双向同步、联级双向同步等复杂拓扑结构,在复杂拓扑结构中,多个节点同时进行数据写入,可能会发生主键冲突问题,DTS 支持对主键冲突进行检测,并提供如下主键冲突的处理机制。
|
| 同步任务中,源库插入(INSERT)主键数据与目标库存在冲突时,任务报错并暂停,需要用户手动处理后才能继续。 | |
| 同步任务中检测到源库的主键插入(INSERT)数据与目标库发生冲突时,忽略源库的主键插入数据,以目标库的内容为准。 | INSERT 主键冲突时,将 INSERT 改写为 INSERT IGNORE。 |
| 同步任务中检测到源库的主键更新(INSERT 和 UPDATE)数据与目标库发生冲突时,用源库的主键数据覆盖目标的主键数据。 | INSERT 主键冲突时,将 INSERT 改写为 REPLACE INTO;UPDATE 主键冲突时,将 UPDATE 改写为 DELETE + REPLACE INTO。 |
冲突策略应用示例
主键冲突策略仅对 INSERT 主键冲突和 UPDATE 主键冲突进行干预,其他不冲突的场景不干预,应用冲突策略后可以使任务报错提醒给用户或者继续运行。如下将为您示例这两种主键冲突场景,在设置不同的冲突策略后的结果。
INSERT 主键冲突
构建 A > B 的单向同步,ID 为主键数据。INSERT 主键后,数据同步到 B 上引起冲突,DTS 按照设置的冲突策略进行干预处理。
设置不同的冲突策略,最终同步后 B 上的结果如下。
冲突报错:任务报错,B 上的数据保持不变 (ID=1, Price=10)。
冲突忽略:忽略 A 的主键数据,B 上的数据保持不变(ID=1, Price=10)。
冲突覆盖:用 A 的主键数据覆盖 B 上的主键数据,B 上的结果为 (ID=1, Price=20)。
UPDATE 主键冲突
在某些场景下,用户可能会修改主键数据引起主键冲突,如下在 A 上 UPDATE 主键后(ID=1 -> ID=2),与 B 上本身的 ID 为2的主键数据冲突。
设置不同的冲突策略,最终同步后 B 上的结果如下。
冲突报错:任务报错,B 上的数据保持不变。
冲突忽略:任务报错,B 上的数据保持不变。请特别注意,这种情况下 DTS 不会进行干预。
冲突覆盖:用 A 的主键数据覆盖 B 上的主键数据,B 上仅存在主键为2的数据 (ID=2, Price=10)。
冲突策略与数据一致性
在两地三中心,异地多活等复杂数据架构中,会有三个或三个以上节点需要同时进行数据写入,保证多个节点的一致性至关重要。许多用户误以为可以通过主键冲突策略来保证数据以某一个节点为准进行更新,这是不合理。
例如在下图的双向同步场景中,A > B,B > A 都设置为冲突覆盖,在 A,B 节点上同时 INSERT 主键为1的数据,最终的结果是 A、B 上主键1的数据发生交换。
实际场景中要实现多节点数据一致性,一般通过划分主键分区,引入额外的协调机制(例如给数据增加版本号,实现按版本号覆盖的机制)等方法,单独靠冲突策略无法达到这一诉求。
本页内容是否解决了您的问题?