当业务侧需要MongoDB降配、活动数据迁移时都需要应用切换数据库实例进行发版,发版过程中需最大程度保证新旧数据库数据一致,这就涉及到了一种同步技术-数据双向同步。在同步过程中遇到了一些可能会产生问题或引发思考的点,希望利用这篇文档进行归纳总结。
一、双向同步能力
数据传输服务DTS(Data Transmission Service)支持两个MySQL数据库之间的双向数据实时同步,适用于异地多活(单元化)、数据异地容灾等多种应用场景。
二、双向同步功能
从业务视角看数据冲突场景
应用发版过程中,在很短的时间内对同记录执行insert和update操作,假设在A表执行insert操作,此时数据还未同步至B表,在B表执行了update操作,发现记录不存在,转为insert执行,产生了数据不一致。
同步id主键列是否会引发数据冲突?
会。主要还是由于在应用发版过程中同一数据操作时间间隔小于数据同步延迟时间所引发的冲突。
数据检查校验出来的不一致数据怎么处理?
通过数据校验确认源和目标库的差异数据,进行手动订正。
数据同步时是否可以只同步符合条件的数据?
可以。在全量阶段和增量阶段都支持对数据的过滤。
阿里云支持的数据冲突检测
INSERT导致的唯一性冲突
同步INSERT语句时违背了唯一性约束,例如双向同步的两个节点同时或者在极为接近的时间INSERT某个主键值相同的记录,那么同步到对端时,会因为已经存在相同主键值的记录,导致Insert同步失败。
UPDATE更新的记录不完全匹配
UPDATE要更新的记录在同步目标实例中不存在时,DTS会自动转化为INSERT,此时可能会出现唯一键的唯一性冲突。
UPDATE要更新的记录出现主键或唯一键冲突。
扫描二维码关注公众号,回复: 14663046 查看本文章
DELETE对应的记录不存在
DELETE要删除的记录在同步的目标实例中不存在。出现这种冲突时,不论配置何种冲突修复策略,DTS都会自动忽略DELETE操作。
阿里云支持的冲突修复策略
TaskFailed(遇到冲突,任务报错退出)
默认。当数据同步遇到上述冲突类型时,同步任务直接报错并退出,同步任务进入失败状态,需要用户介入修复任务。
Ignore(遇到冲突,直接使用目标实例中的冲突记录)
当数据同步遇到上述的冲突类型时,直接跳过当前同步语句,继续往下执行,选择使用目标库中的冲突记录。
Overwrite(遇到冲突,直接覆盖目标实例中的冲突记录)
当数据同步遇到上述的冲突类型时,直接覆盖目标库中的冲突记录。
这里在正向同步时一般选择 Overwrite,反向同步时选择 Ignore模式。 --以旧实例数据为准
三、同步流程说明
1、创建同步任务(最好提前一天创建 --与业务人员沟通同步规则)
2、待同步任务增量点位持平时,发起数据校验
3、业务人员根据数据校验出的问题数据进行原因定位,手工订正
4、应用发版
5、次日业务无异常,释放同步任务