摘要:本文将详解ROMA集成关键技术-增量数据集成技术。
本文分享自华为云社区《ROMA集成关键技术(2)-增量数据集成技术》,作者:华为云PaaS服务小智 。
ROMA平台的核心系统ROMA Connect源自华为流程IT的集成平台,在华为内部有超过15年的企业业务集成经验。依托ROMA Connect,可以将物联网、大数据、视频、统一通信、GIS等基础平台及各个应用的服务、消息、数据统一集成适配以及编排,屏蔽各个平台对上层业务的接口差异性,对上提供服务、消息、数据集成使能服务,以支撑新业务的快速开发部署,提升应用开发效率。适用于平安园区、智慧城市、企业数字化转型等场景,图1展示了ROMA Connect的功能视图。
图1 ROMA Connect功能视图
FDI(Fast Data Integration)通过应用间的数据交换从而达到集成,主要解决数据的分布性和异构性的问题,FDI应用场景如下:
FDI功能视图如图所示:
图2 FDI功能视图
本文将介绍FDI的关键技术-增量数据集成技术。
在数据集成场景,将一个数据源中的数据定时或者实时方式同步到其他异构数据源。
数据源类型可以是API、MQ(Message queue)、DB、大数据、文件存储等。
当源端是DB,一个任务通常调度一个或几个表的部分字段数据。同时有几百上千个任务需要调度。
在介绍ROMA FDI增量数据集成技术之前,我们先了解下当前业界主要采用的数据集成技术。
定时方式进行数据集成任务,根据时间周期进行调度,如根据年、月、日、小时、分等为周期进行调度,每周期执行一次。每个任务可以分别设置自己的任务调度周期策略。
针对增量的数据,一般通过时间戳或者增量ID进行过滤,每次执行只同步新产生的数据,针对删除数据的同步,通过时间戳一般无法支持同步。
另外也有通过触发器记录所有变化数据到一张辅助表,定时从辅助表拉取数据进行同步。
机械的调度执行,不管实际有没有增量数据产生,会浪费调度资源,也会增加不必要的执行,对源数据源资源产生浪费。
调度针对每个任务调度进行调度,一般是一张数据库表一个任务,如果表的数量特别多的话,调度的负担比较大。且如果多个表之间有主外键关联关系的话,无法保证同步时实际数据的先后依赖关系,容易产生冲突导致同步失败。
采用时间戳或者增量ID同步增量数据要求表中必须有时间戳字段或者增量ID字段,用户的表不一定能满足这样的要求。
针对源表中delete的数据,通过查询方式无法获取,导致无法同步到目标数据源。
采用触发器记录所有数据的方式,由于触发器与用户的sql执行是同步执行方式,会对系统性能造成比较大的影响。存储也造成比较大的浪费。
实时任务,主要面向对时延要求比较高的场景。一般调度调度一次,一直在后台执行,有增量数据产生时,可以比较及时同步到目的数据源。
针对增量数据,通常通过解析数据库的增量日志(如MySQL的binlog)来进行同步。
不同数据库的增量日志格式和获取接口均不同,如果需要支持多种数据库难度会比较大。
由于数据库的增量日志一般包括该数据库实例下的所有库表,不能在源端进行过滤和清洗。只能在任务执行时接收完全部数据后才能进行过滤清洗,所以会造成巨大的网络流量浪费。
我们再回顾总结一下前面提到的现有技术问题:
1、任务调度有很多非必须的调度,即无实际增量数据的任务调度
2、非必须的数据迁移造成的网络流量浪费
3、时间戳或者增量ID对用户表结构的侵入性,无法同步delete数据。
4、对表的主外键约束关系的无法很好的支持
1、通过触发器在元数据表记录数据变化信息,分割时间段记录关键元数据信息,并不记录所有数据内容,有时间戳记录时间戳,无时间戳记录主键/ddl。
2、通过元数据表的信息以及主外键关系来针对所有表进行统一任务调度排序
3、增量数据的高效获取和写入方式
在数据集成场景,将一个数据源中的数据定时或者实时方式同步到其他数据源。数据源类型可以是API、MQ、DB、大数据平台、文件等。
本方案主要面向源端数据源是数据库类型,其他数据源类型可以根据本思路进行相应的适配。
总体步骤概述如下:
在源端数据库元数据表结构主要包括如下关键元素:
自增ID:代表元数据表的主键,主要用来在调度器中排序时使用。
表名:用来存储实际业务表的名称或者唯一标识。
Start时间戳:将所有时间进行分段,分的时间段的起始值。
End时间戳:将所有时间进行分段,分的时间段的结束值。
操作类型:用来标识对数据的操作类型,如insert、update或者对表结构的DDL操作。
主键/ddl:用来记录主键或者ddl。主键值能按范围则按照范围来存,用以节省空间。
以下针对源表是否有时间戳字段给出两张场景下的数据的示例。
1.针对有时间戳字段
2.针对无时间戳字段
流程详细描述如下,其中流程1负责触发器和元数据表的创建,2到4流程主要描述触发器的内部逻辑:
1、触发器和元数据表的创建
调度器在首次连接源端数据源时,需要进行触发器和元数据表的创建。可选的也可以调度器下发任务给执行器,由执行器去执行创建任务。
2、当源端数据库的数据产生变化时,如新增数据、修改数据、删除数据、修改表结构等。触发器会先获取当前时间所属的时间段,其中时间段是指根据一定的时间长度将所有时间切分成很多的段。
3、触发器计算出当前时间段后,会在元数据表中根据时间段和表名查询对应的记录是否存在。是否存在决定了后续是要insert还是update数据入元数据表。
4、在触发器中,写入或更新变化信息到元数据表,主要包括当前时间段、表名、操作类型、表名、主键、ddl语句等信息。更新时需要带上原有的主键/ddl等信息保证数据不能丢失。
其中主键属于数字类型等能按范围划分时则按照范围存储记录,不能按照范围则直接拼接主键进行存储,这样可以最大可能降低对存储空间的占用和对性能的影响。
注意不同类型操作间隔开的,不能合并到一个时间段里记录里。只有同一种类型且连续在一个一个时间段内才可以合并为一条记录。如果在同一个时间段内先执行表A的两条insert,然后执行delete,之后再执行insert,那么这两次的insert不能合并。
流程详细描述如下: