草庐IT

ROMA集成关键技术:增量数据集成

华为云开发者社区 2023-03-28 原文
摘要:本文将详解ROMA集成关键技术-增量数据集成技术。

本文分享自华为云社区《ROMA集成关键技术(2)-增量数据集成技术》,作者:华为云PaaS服务小智 。

1.概述

ROMA平台的核心系统ROMA Connect源自华为流程IT的集成平台,在华为内部有超过15年的企业业务集成经验。依托ROMA Connect,可以将物联网、大数据、视频、统一通信、GIS等基础平台及各个应用的服务、消息、数据统一集成适配以及编排,屏蔽各个平台对上层业务的接口差异性,对上提供服务、消息、数据集成使能服务,以支撑新业务的快速开发部署,提升应用开发效率。适用于平安园区、智慧城市、企业数字化转型等场景,图1展示了ROMA Connect的功能视图。

图1 ROMA Connect功能视图

FDI(Fast Data Integration)通过应用间的数据交换从而达到集成,主要解决数据的分布性和异构性的问题,FDI应用场景如下:

  • 跨异构数据源集成
  • 跨应用间集成
  • 跨云数据集成
  • 跨网络数据集成(B2B、集团分子公司跨域集成)

FDI功能视图如图所示:

图2 FDI功能视图

本文将介绍FDI的关键技术-增量数据集成技术。

体验ROMA Connect入门版

2.技术背景

在数据集成场景,将一个数据源中的数据定时或者实时方式同步到其他异构数据源。

数据源类型可以是API、MQ(Message queue)、DB、大数据、文件存储等。

当源端是DB,一个任务通常调度一个或几个表的部分字段数据。同时有几百上千个任务需要调度。

3.常见技术

在介绍ROMA FDI增量数据集成技术之前,我们先了解下当前业界主要采用的数据集成技术。

常见技术一:

定时方式进行数据集成任务,根据时间周期进行调度,如根据年、月、日、小时、分等为周期进行调度,每周期执行一次。每个任务可以分别设置自己的任务调度周期策略。

针对增量的数据,一般通过时间戳或者增量ID进行过滤,每次执行只同步新产生的数据,针对删除数据的同步,通过时间戳一般无法支持同步。

另外也有通过触发器记录所有变化数据到一张辅助表,定时从辅助表拉取数据进行同步。

常见技术一缺点:

机械的调度执行,不管实际有没有增量数据产生,会浪费调度资源,也会增加不必要的执行,对源数据源资源产生浪费。

调度针对每个任务调度进行调度,一般是一张数据库表一个任务,如果表的数量特别多的话,调度的负担比较大。且如果多个表之间有主外键关联关系的话,无法保证同步时实际数据的先后依赖关系,容易产生冲突导致同步失败。

采用时间戳或者增量ID同步增量数据要求表中必须有时间戳字段或者增量ID字段,用户的表不一定能满足这样的要求。

针对源表中delete的数据,通过查询方式无法获取,导致无法同步到目标数据源。

采用触发器记录所有数据的方式,由于触发器与用户的sql执行是同步执行方式,会对系统性能造成比较大的影响。存储也造成比较大的浪费。

常见技术二:

实时任务,主要面向对时延要求比较高的场景。一般调度调度一次,一直在后台执行,有增量数据产生时,可以比较及时同步到目的数据源。

针对增量数据,通常通过解析数据库的增量日志(如MySQL的binlog)来进行同步。

常见技术二缺点:

不同数据库的增量日志格式和获取接口均不同,如果需要支持多种数据库难度会比较大。

由于数据库的增量日志一般包括该数据库实例下的所有库表,不能在源端进行过滤和清洗。只能在任务执行时接收完全部数据后才能进行过滤清洗,所以会造成巨大的网络流量浪费。

4.ROMA FDI增量数据集成技术

我们再回顾总结一下前面提到的现有技术问题:

1、任务调度有很多非必须的调度,即无实际增量数据的任务调度

2、非必须的数据迁移造成的网络流量浪费

3、时间戳或者增量ID对用户表结构的侵入性,无法同步delete数据。

4、对表的主外键约束关系的无法很好的支持

4.1增量数据集成技术思路

1、通过触发器在元数据表记录数据变化信息,分割时间段记录关键元数据信息,并不记录所有数据内容,有时间戳记录时间戳,无时间戳记录主键/ddl。

2、通过元数据表的信息以及主外键关系来针对所有表进行统一任务调度排序

3、增量数据的高效获取和写入方式

4.2处理流程

在数据集成场景,将一个数据源中的数据定时或者实时方式同步到其他数据源。数据源类型可以是API、MQ、DB、大数据平台、文件等。

本方案主要面向源端数据源是数据库类型,其他数据源类型可以根据本思路进行相应的适配。

总体步骤概述如下:

  1. 调度器在源端数据库中创建本发明所需要的元数据表和触发器。数据库中的数据发生变化时,通过触发器写入关键元数据到元数据表中。
  2. 调度器从元数据表获取所有表的变化元数据,进行依赖分析,然后调度排序
  3. 调度器根据策略下发任务到任务执行器进行实际任务的执行。
  4. 任务执行器从源端数据源中获取数据
  5. 任务执行器讲源端获取到的数据写入目标端数据源

4.3元数据表结构设计

在源端数据库元数据表结构主要包括如下关键元素:

自增ID:代表元数据表的主键,主要用来在调度器中排序时使用。

表名:用来存储实际业务表的名称或者唯一标识。

Start时间戳:将所有时间进行分段,分的时间段的起始值。

End时间戳:将所有时间进行分段,分的时间段的结束值。

操作类型:用来标识对数据的操作类型,如insert、update或者对表结构的DDL操作。

主键/ddl:用来记录主键或者ddl。主键值能按范围则按照范围来存,用以节省空间。

以下针对源表是否有时间戳字段给出两张场景下的数据的示例。

1.针对有时间戳字段

2.针对无时间戳字段

4.4触发器逻辑

流程详细描述如下,其中流程1负责触发器和元数据表的创建,2到4流程主要描述触发器的内部逻辑:

1、触发器和元数据表的创建

调度器在首次连接源端数据源时,需要进行触发器和元数据表的创建。可选的也可以调度器下发任务给执行器,由执行器去执行创建任务。

2、当源端数据库的数据产生变化时,如新增数据、修改数据、删除数据、修改表结构等。触发器会先获取当前时间所属的时间段,其中时间段是指根据一定的时间长度将所有时间切分成很多的段。

3、触发器计算出当前时间段后,会在元数据表中根据时间段和表名查询对应的记录是否存在。是否存在决定了后续是要insert还是update数据入元数据表。

4、在触发器中,写入或更新变化信息到元数据表,主要包括当前时间段、表名、操作类型、表名、主键、ddl语句等信息。更新时需要带上原有的主键/ddl等信息保证数据不能丢失。

  • 针对源表无时间戳字段或delete类型需要记录主键的值。
  • 针对源表有时间戳且为insert 或update则不记录主键值,若有记录则无需更新,可以降低对源数据库的影响。
  • 针对ddl类操作则记录ddl语句或者也可以根据需要自定义格式进行记录。

其中主键属于数字类型等能按范围划分时则按照范围存储记录,不能按照范围则直接拼接主键进行存储,这样可以最大可能降低对存储空间的占用和对性能的影响。

注意不同类型操作间隔开的,不能合并到一个时间段里记录里。只有同一种类型且连续在一个一个时间段内才可以合并为一条记录。如果在同一个时间段内先执行表A的两条insert,然后执行delete,之后再执行insert,那么这两次的insert不能合并。

4.5调度迁移流程

流程详细描述如下:

  1. 调度器定时访问源端数据源中的元数据表,获取关于所有表的源数据变化信息。由于是针对所有表,通常实现的定时周期一般设置比较短。根据元数据表的时间戳字段每次只取最新的未处理过的数据。针对已调度处理过的数据可以进行一定周期进行老化删除。
    注意获取数据需要严格排序,根据自增主键值进行排序,一般不能根据时间戳排序,除非时间戳可以保证前后顺序。
  2. 针对同一个表的连续的多个insert/update类型操作合并,时间段取并集,如有主键也同样取并集。中间有其他类型如delete等间隔开的则不能做合并操作。
  3. 针对同一个表的连续的多个delete类型操作进行合并,同样时间段取并集,主键也同样取并集。有其他类型间隔开非连续的情况下则不能做合并。
    ddl类型操作不做合并处理。
  4. 针对上述步骤2、3中已经合并排序好的任务记录之间插入屏障,确保最终的执行先后顺序一定按排序好的执行。
  5. 从源数据源获取表结构的数据,根据主外键依赖关系,将前述已经排序好的任务分配任务组。有主外键依赖分配在同一个任务组。一个任务组内根据主外键关系进行排序,针对insert/update类,主表排在子表前。针对delete则子表排在主表前。针对ddl则按原有顺序,不另外排序。
  6. 调度器将排序好的任务下发到执行器进行执行。执行器执行任务时需要满足任务屏障和依赖先后关系,在此前提基础上,任务可分配在任意一个合适的执行器上执行。针对同一种任务如insert/update或delete可以根据策略适度并发执行。
  7. 执行器执行任务时,根据不同场景生成不同的获取数据的sql语句。针对源表有时间戳字段insert/update,生成查询语句:select * from 表 where 时间戳 between 最早起始时间 and 最晚结束时间。无时间戳字段则生成:
    select * from 表 where 主键 in(主键值1,主键值2……) 或者 主键 between 最小主键值 and 最大主键值。
  8. 执行器将查询到数据通过生成特定语句写入目标端数据源。insert/update数据生成类merge into语句,可以批量执行,当确定目标数据源中无此数据会由数据源自动做insert操作,有此数据则自动进行update。如此可以保证该任务是幂等执行,即可以重复执行,在任务执行失败时可以安全的重试。此外该语法可以将insert和update两类操作进行合并后批量执行。Oracle、SQL SERVER的语法是merge into,MySQL的类似语法是replace或 insert into on duplicate key update,PostgreSQL的语法是UPSERT,其他数据源可以参考此原理,若不支持该语句则用原生的insert或者update语法或者相对应的接口等。
  9. 如果是delete类型操作,执行器则无需到源端获取数据,直接根据元数据表获取到的主键来进行同步。目标端数据源如果是数据库类型,则生成delete from 表 where 主键 in(主键值1,主键值2……) 或者 主键 between 最小主键值 and 最大主键值。如果目标端是其他类型则调用其删除接口传入主键值。

体验ROMA Connect入门版

 

点击关注,第一时间了解华为云新鲜技术~

有关ROMA集成关键技术:增量数据集成的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  3. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  4. ruby-on-rails - 我如何将 Hoptoad 与 DelayedJob 和 DaemonSpawn 集成? - 2

    我一直很高兴地使用DelayedJob习惯用法:foo.send_later(:bar)这会调用DelayedJob进程中对象foo的方法bar。我一直在使用DaemonSpawn在我的服务器上启动DelayedJob进程。但是...如果foo抛出异常,Hoptoad不会捕获它。这是任何这些包中的错误...还是我需要更改某些配置...或者我是否需要在DS或DJ中插入一些异常处理来调用Hoptoad通知程序?回应下面的第一条评论。classDelayedJobWorker 最佳答案 尝试monkeypatchingDelayed::W

  5. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  6. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  7. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  8. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  9. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  10. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

随机推荐