数据实时同步中的一种特殊场景说明及处理方法
数据实时同步简要介绍:
数据同步或数据集成一般选用两类技术或工具,即:
1、ETL(Extract-Transform-Load)工具,它是将数据从源系统加载到数据仓库的过程。用来描述将数据从来源端经过萃取(extract)、转置(transform)、加载(load)至目的端的过程。
2、CDC工具,全称Change Data Capture,变更数据捕捉,从数据库内部捕捉变更数据,将变更数据推送到推送到目的库中。CDC机制速度极快,数据精准,且与应用程序耦合少,可抽象脱离业务系统。
实时同步场景中因对数据的实时性要求较高,所以一般选用CDC工具。
特殊场景说明:
普通场景下,使用CDC工具解析源库日志信息,实时同步源库数据到目的地,如下图所示:
但在一些特定业务场景中,为尽量减轻主数据库业务压力,一般设置一个备数据库,定期将主数据库中超过一定期限的数据迁移到备数据库中。备份时先将主数据库中超过一定期限未更新的数据复制到备数据库中,再将主库中已复制的数据删除。如下图所示:
类似以上既有主库也有备库的情况,若要做数据的实时同步,则主库和备库都需要将数据实时同步到目的地,避免因为主库的备份动作导致目的端数据误删、重复等与源端产生不一致,如下图所示:
这种情景下,主库、备库的表名、字段名完全一致,目的库需要正确识别同步数据来源于主库还是备库,并分类处理,保证目的库中数据与源端数据一致。以下介绍一种解决此类需求的方式。
主备库同时进行数据同步时的解决方案:
使用CDC工具进行数据同步时,为了便于目的端处理,需要在原始数据的基础上添加一些扩展字段,如原表名、操作类型、时间戳等,如下图所示:
为了解决上述源库有主备的情况,可在以上扩展字段的基础上再增加一个扩展字段,如优先级字段,规定若源库为主数据库,优先级字段值为“100”,若源库为备数据库,优先级字段值为“200”,则目的端在处理来自源端同步过来的数据时,在原处理基础上增加以下处理逻辑:
- 若同步过来的数据为“插入”操作,检查目的端中是否存在与待插入数据相同的数据(注:比较不带扩展字段的原始部分是否一致),若没有则正常插入,若有则比较两条数据中“优先级”扩展字段,目的端保存“优先级”扩展字段更大的那一条数据;
- 若同步过来的数据为“删除”操作,检查目的端中是否存在与待删除数据相同的数据(注:比较不带扩展字段的原始部分是否一致),若没有则不做任何操作,若有则比较两条数据中“优先级”扩展字段:若两条数据中“优先级”扩展字段一样的话则删除目的端中数据,若同步过来的数据中“优先级”扩展字段值小于目的端中相同数据的“优先级”扩展字段值则不做任何操作,若同步过来的数据中“优先级”扩展字段值大于目的端中相同数据的“优先级”扩展字段值则删除目的端中数据;