再见,数据延迟!增量同步与差异更新的原理
上海奥腾科技 2023年08月12日 23:08

一、数据归集的现状

  很多数据中心都具备了数据归集的手段,但是普遍存在大量数据未归集、数据延时长的问题。究其原因如下:

1,方法自我

  很多数据中心提出了中心的标准,让数据提供方来适配中心的标准。比如,一些数据中心提供中间缓冲区,要求数据提供方自己将数据先存放到缓存区;再有一些数据中心提供了API接口,让数据提供方将数据推送进来;还有要求数据提供方开启归档日志,一定要通过日志方式同步数据,并且数据库限定在Mysql某版本上。这样的方案非常自我,要求其他部门适应自己,给其他部门增加了巨额工作量。那么其他部门也就做做样子,因为没有合适的软件来推送并兼容数据中心的数据库,也没有人力编写众多的推送接口,更不敢随意开启在线系统的日志。其导致的结果就是,数据中心虽然很有权威却拿不到业务部门的数据。

  解决方案:数据中心应该具备全方位数据归集的能力,主动适应纷繁复杂的业务部门情况。技术的问题,应该用技术手段来解决。

2,逐表开发、全量延时

  数据中心可能有数据采集软件并兼容各业务部门的数据库,但是需要每次操作一张单表,还需要经过层层转换,或编写脚本来实现。那么,如果有几万张表,需要多久时间呢?

  每张表采用全量同步的方式,定时运行。由于很多表数据量比较大,每归集一次时间比如耗时8小时,就算源数据每天只增加一条数据甚至没增加数据,数据中心每天也要单独为其运行8小时。如果对众多的表都采用全量归集方式,那么不仅仅获取更新数据间隔时间长,而且要造成大量的算力浪费。

  解决方案:允许针对全库直接估计,或者针对很多张表一次同时归集,系统为众多的表自动排队,这样操作简便,可以省去90%以上的配置时间。而且,要提供增量归集手段,降低延时到最低,且节省算力资源。

二、数据归集的方法

  针对不同业务部门的限制,一方面要沟通疏导,建议其开放数据库或者帮助其建设数据库镜像,进行库表对接归集。另一方面,某些业务部门的确存在客观限制条件,因而,数据中心要提供多种数据归集方案,适配数据提供方各种情况,最终目的是能全面完成数据归集任务。

  我们提供的数据归集手段包括:库表同步、CDC实时同步、API对接源数据同步、文件导入方式。

增量1.png

图1-数据同步的方式

1、库表同步

  全量同步(Full Synchronization):指将所有数据从源系统一次性全部同步到目标系统,不论数据是否有所变化。这种方式适用于首次数据加载或者在数据集被完全重建时使用。

  增量同步(Incremental Synchronization):指只同步自上次同步以来发生变化的数据,通常通过记录变化的数据(如变更时间戳)来实现。这种方式效率较高,适用于实时或近实时的数据更新场景。

  差异更新(Delta Update):通常是指在增量更新的基础上,针对数据的实际变化进行局部更新,可以是增量的形式,但也侧重于仅更新目标系统中有差异的数据。这是一个相似的概念,有时与增量同步可互换使用,但差异更新通常更强调数据状态的比对。

增量2.png

图2-库表同步

2、CDC实时同步

  CDC日志同步是通过监控数据库的日志文件(如事务日志)来捕获数据的变更。这些变更可以是插入、更新和删除操作。

工作原理:

  • CDC通常会设置在数据库的日志层级,监控日志文件的变化。
  • 一旦有数据变更发生,CDC会立即捕获这些变更,并将其传递到目标系统,如数据仓库或实时分析平台。
  • 由于CDC直接在数据库层面工作,因此它能够高效地捕获所有变更,而不需要进行全表扫描。

优点:

  • 实时性: CDC能够几乎实时地捕获数据的变更,提升了数据的时效性。
  • 完善性: 能够捕获所有数据变更,包括历史数据的变化,便于审计和数据分析。
  • 性能影响小: 由于不进行全量提取,CDC在性能上影响较小。

缺点:

  • 实现复杂性: 需要针对底层数据库的支持进行配置,可能涉及较多的技术细节。
  • 依赖性: 依赖数据库的日志机制,若数据库日志会被清理或截断,可能会导致数据缺失。

增量3.png

图3-CDC日志同步

3、API对接源数据同步

  API对接源数据同步是通过应用程序编程接口(API)将数据从一个系统同步到另一个系统。我们提供API配置界面,而不需要程序员编写程序,并且能将源端加密的数据在后端自动解密。

优点:

(1)用户友好的API配置界面:我们的方案提供了一个直观的配置界面,用户无需具备编程技能或依赖程序员,就可以轻松地进行API的配置和数据同步设置。

(2)自动解密功能:在数据传输的过程中,源系统中的数据通常可能会被加密以确保安全性。我们的系统可以在后端自动解密这些加密数据,用户不需要手动处理解密过程。这一功能增强了数据的安全性,同时简化了用户的操作流程。

(3)灵活的数据同步:通过API实现的源数据同步可以支持多种数据格式和结构,用户可以根据实际需求灵活配置,从而实现高效的数据集成。

缺点:

  • 实时性限制: API的调用可能受网络延迟或请求处理时间的影响,实时性可能不如CDC。
  • 数据量限制: 如果需要大量数据的同步,可能造成性能瓶颈,特别是在大数据量的情况下。

增量4.png

图4-API接口归集

三、增量同步和差异更新的原理

  在数据管理过程中,我们面临着尚未归集大量重要信息的挑战,这不仅影响了数据分析的全面性,还制约了决策的准确性。因此,加快数据的归集与整合工作至关重要,以更有效地支持业务发展和提升管理效率。在此背景下,我们不能仅依赖全量同步的方法,而应引入增量同步和差异更新的策略,以提高数据处理的效率。建议项目在初始阶段可以采取“粗暴”的方式进行全库同步,或一次性选择大批表进行全量同步。随着对某些关键数据及时性的需求提高,再逐步将这些全量同步的表改为增量同步或差异更新,以更好地适应项目实施的实际情况。

  然而增量同步和差异更新的机制,技术实现也不简单,这就是为什么我们看到开源的产品比较少见到增量同步和差异更新功能的原因。

  下面用图示展现一下核心技术要点。

1、增量补齐问题

增量5.png

图5-增量补齐数据

  假设增量同步是按照时序递增采集数据的。

  现有的很多系统计算机最小时间是毫秒,而1毫秒内却可能有上千数据写入一张表中。这是增量同步容易漏数据的原因。举例如下:

  第一次取全量数据。在读到第一条“20200206015802005 李四”数据截止的005毫秒同时,又有第二条“20200206015802005 王五”写入,这条数据没有读取。

  第二次开始取增量数据。正常情况下,是从下个时序即“20200206020601016 赵六”开始取数,这就导致“20200206015802005 王五”遗漏。

  在1毫秒期间产生了多条数据,如何保证后续增量抽取能补齐上次的遗漏数据,这是增量算法的核心点。

  我们通过算法来解决这个问题,也要保证事务一致性。

2、差异增量更新

增量6.png

图6-update_time的变更

  上图显示,由于“checkout_update_time”退房时间的变更,导致数据记录的顺序发生了变化,退房时间的数据需要按变化获取。

  这种情况就不能采用增量同步(Incremental Synchronization)方法,而是需要通过ID+checkout_update_time 两个字段配合实现差异更新(Delta Update)。

四、并行计算的框架

  当然,仅仅靠增量方式,还是无法解决海量数据的归集性能问题。需要采用分布式并行计算的方式,其核心是底层的并行计算引擎。

  下图展示了系统将多个任务按组负载均衡地分配到不同节点进行计算,而且同一张大表也会自动拆分成多个任务,在不同节点并行归集。

增量7.png

图7-并行计算架构

核心思想:

  负载均衡:源端抽取的多张表进行拆分后,自动负载均衡地分配到多台服务器上归集运行。

  并行计算:利用多线程分片技术并行计算。

五、总结

  当前很多数据中心的数据归集存在延时较长的问题,这会影响到应用系统取数的时效性。为了应对这一挑战,数据中心需要适配数据提供方的不同场景,并通过技术手段解决复杂的数据归集性能问题和兼容性问题,从而确保数据的及时性和准确性。