https://www.nexiq-usblink.com 960 0 0

SQLServer 数据异构实时同步之数据时序的问题-syncnavigator数据库同步syncnavigator 授权码

购买事宜请联系QQ:1793040

数据异构实时同步是指将数据从源端数据库近实时的同步至目的端数据库的一个过程,比如将SQLServer中的数据同步至HBase或Kafka中。

不同于离线同步,实时同步需要解决变更数据采集与数据时序等问题,以此保证数据的一致性。

本文主要介绍以SQLServer为源端进行数据同步的过程中产生的数据时序相关的问题。

不同于MySQL可以通过解析BinLog的方式采集变更数据,在SQLServer中,由于其本身的特征,主要使用以下方式采集变更数据:

Trigger:使用触发器将变更数据记录在一张单独的表中,通常仅记录源表主键及操作类型;

CT:开启CT,以记录数据的变更,包含事务信息及源表主键;

CDC:开启CDC,以记录数据的变更,包含全量数据;

CDC由于需要太多的资源,所以仅考虑Trigger以及CT的方式,其大致流程为:通过Trigger或CT的方式获取到变更数据的主键,然后根据主键再去源表拿到源数据即可实现变更数据的获取。

在获取到变更数据后,数据需要写入目的端数据库并且同时推进游标(比如记录最后完成的主键或版本号等)才算完成了整个同步流程。

推进游标是为了程序在重启或发生故障后,能继续上一次结束的位置继续同步数据。

如果仅仅是使用单线程,并且仅写入一个目的端且写入数据与游标推进是同步操作的情况,那么便不太可能会出现数据时序的问题。

但现实中,我们很可能需要将一份源端的数据同步至多个目的端,并且为了提高吞吐量并减少数据的延迟,需要使用多线程以及利用流的特点来完成数据同步。

此时便可能发生数据时序的问题。

数据时序的问题是指数据的操作能否按照在源端操作的顺序有序同步到目的端。

比如针对x=1的数据,在源端进行了x=2以及x=3的两次操作,当它们被同步到目的端的时候,必须保证x=2的这次操作优先于x=3操作执行,才能保证目前端的数据最终为x=3。

如果x=3优先于x=2执行,那么目的端的数据将最终为x=2,此时系统中的数据将处于不一致的状态。

所以解决数据时序的问题的主要目的是要保证数据的一致性。

如果我们能在数据写入即使乱序也仍然能保证数据的一致性,那么数据时序的问题便不是问题。

比如HBase可以利用timestamp来实现数据的幂等性更新。

但是仍然会有系统需要保证数据的操作顺序是一致的,基于此,可将数据的顺序分为以下两种:

数据全局有序;

数据以主键为单位的有序;

数据全局有序是指数据的所有操作都按照先后顺序依次同步至目的端,这通常只能使用单线程完成,效率低下且应用场景较少。

实际场景中,仅需要以key(行)为单位,保证其有序,即可满足大部分应用场景,所以这里仅讨论数据以key为单位的有序的情况。


PREVIOUSNEXT
CLOSE
Your contact info here.
+001 321 65 98
狗65备用_狗65怎么注册_狗65游戏平台下载