本文分享自華為雲社群《華為雲ROMA內建關鍵技術-增量資料內建技術-雲社群-華為雲》,作者:華為雲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的關鍵技術-增量資料內建技術。
了解更多華為雲內建技術,請關注華為雲應用內建領域資深産品專家直播。
(直播連結:https://bbs.huaweicloud.com/live/DTT_live/202210271600.html)
2 技術背景
在資料內建場景,将一個資料源中的資料定時或者實時方式同步到其他異構資料源。
資料源類型可以是API、MQ(Message queue)、DB、大資料、檔案存儲等。
當源端是DB,一個任務通常排程一個或幾個表的部分字段資料。同時有幾百上千個任務需要排程。
3 常見技術
在介紹ROMA FDI增量資料內建技術之前,我們先了解下目前業界主要采用的資料內建技術。
常見技術一:
定時方式進行資料內建任務,根據時間周期進行排程,如根據年、月、日、小時、分等為周期進行排程,每周期執行一次。每個任務可以分别設定自己的任務排程周期政策。
針對增量的資料,一般通過時間戳或者增量ID進行過濾,每次執行隻同步新産生的資料,針對删除資料的同步,通過時間戳一般無法支援同步。
另外也有通過觸發器記錄所有變化資料到一張輔助表,定時從輔助表拉取資料進行同步。
常見技術一缺點:
機械的排程執行,不管實際有沒有增量資料産生,會浪費排程資源,也會增加不必要的執行,對源資料源資源産生浪費。
排程針對每個任務排程進行排程,一般是一張資料庫表一個任務,如果表的數量特别多的話,排程的負擔比較大。且如果多個表之間有主外鍵關聯關系的話,無法保證同步時實際資料的先後依賴關系,容易産生沖突導緻同步失敗。
采用時間戳或者增量ID同步增量資料要求表中必須有時間戳字段或者增量ID字段,使用者的表不一定能滿足這樣的要求。
針對源表中delete的資料,通過查詢方式無法擷取,導緻無法同步到目标資料源。
采用觸發器記錄所有資料的方式,由于觸發器與使用者的sql執行是同步執行方式,會對系統性能造成比較大的影響。存儲也造成比較大的浪費。
常見技術二:
實時任務,主要面向對時延要求比較高的場景。一般排程排程一次,一直在背景執行,有增量資料産生時,可以比較及時同步到目的資料源。
針對增量資料,通常通過解析資料庫的增量日志(如MySQL的binlog)來進行同步。
常見技術二缺點:
不同資料庫的增量日志格式和擷取接口均不同,如果需要支援多種資料庫難度會比較大。
由于資料庫的增量日志一般包括該資料庫執行個體下的所有庫表,不能在源端進行過濾和清洗。隻能在任務執行時接收完全部資料後才能進行過濾清洗,是以會造成巨大的網絡流量浪費。
4 ROMA FDI增量資料內建技術
我們再回顧總結一下前面提到的現有技術問題:
- 任務排程有很多非必須的排程,即無實際增量資料的任務排程
- 非必須的資料遷移造成的網絡流量浪費
- 時間戳或者增量ID對使用者表結構的侵入性,無法同步delete資料。
- 對表的主外鍵限制關系的無法很好的支援
4.1 增量資料內建技術思路
1.通過觸發器在中繼資料表記錄資料變化資訊,分割時間段記錄關鍵中繼資料資訊,并不記錄所有資料内容,有時間戳記錄時間戳,無時間戳記錄主鍵/ddl。
2.通過中繼資料表的資訊以及主外鍵關系來針對所有表進行統一任務排程排序。
3.增量資料的高效擷取和寫入方式。
4.2 處理流程
在資料內建場景,将一個資料源中的資料定時或者實時方式同步到其他資料源。資料源類型可以是API、MQ、DB、大資料平台、檔案等。
本方案主要面向源端資料源是資料庫類型,其他資料源類型可以根據本思路進行相應的适配。
總體步驟概述如下:
- 排程器在源端資料庫中建立本發明所需要的中繼資料表和觸發器。資料庫中的資料發生變化時,通過觸發器寫入關鍵中繼資料到中繼資料表中。
- 排程器從中繼資料表擷取所有表的變化中繼資料,進行依賴分析,然後排程排序
- 排程器根據政策下發任務到任務執行器進行實際任務的執行。
- 任務執行器從源端資料源中擷取資料
- 任務執行器講源端擷取到的資料寫入目标端資料源
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 排程遷移流程
流程較長的描述如下:
- 排程器定時通路源端資料源中的中繼資料表,擷取關于所有表的源資料變化資訊。由于是針對所有表,通常實作的定時周期一般設定比較短。根據中繼資料表的時間戳字段每次隻取最新的未處理過的資料。針對已排程處理過的資料可以進行一定周期進行老化删除。注意擷取資料需要嚴格排序,根據自增主鍵值進行排序,一般不能根據時間戳排序,除非時間戳可以保證前後順序。
- 針對同一個表的連續的多個insert/update類型操作合并,時間段取并集,如有主鍵也同樣取并集。中間有其他類型如delete等間隔開的則不能做合并操作。
- 針對同一個表的連續的多個delete類型操作進行合并,同樣時間段取并集,主鍵也同樣取并集。有其他類型間隔開非連續的情況下則不能做合并。ddl類型操作不做合并處理。
- 針對上述步驟2、3中已經合并排序好的任務記錄之間插入屏障,確定最終的執行先後順序一定按排序好的執行。
- 從源資料源擷取表結構的資料,根據主外鍵依賴關系,将前述已經排序好的任務配置設定任務組。有主外鍵依賴配置設定在同一個任務組。一個任務組内根據主外鍵關系進行排序,針對insert/update類,主表排在子表前。針對delete則子表排在主表前。針對ddl則按原有順序,不另外排序。
- 排程器将排序好的任務下發到執行器進行執行。執行器執行任務時需要滿足任務屏障和依賴先後關系,在此前提基礎上,任務可配置設定在任意一個合适的執行器上執行。針對同一種任務如insert/update或delete可以根據政策适度并發執行。
- 執行器執行任務時,根據不同場景生成不同的擷取資料的sql語句。針對源表有時間戳字段insert/update,生成查詢語句:select * from 表 where 時間戳 between 最早起始時間 and 最晚結束時間。無時間戳字段則生成:select * from 表 where 主鍵 in(主鍵值1,主鍵值2……) 或者 主鍵 between 最小主鍵值 and 最大主鍵值。
- 執行器将查詢到資料通過生成特定語句寫入目标端資料源。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文法或者相對應的接口等。
- 如果是delete類型操作,執行器則無需到源端擷取資料,直接根據中繼資料表擷取到的主鍵來進行同步。目标端資料源如果是資料庫類型,則生成delete from 表 where 主鍵 in(主鍵值1,主鍵值2……) 或者 主鍵 between 最小主鍵值 and 最大主鍵值。如果目标端是其他類型則調用其删除接口傳入主鍵值。
點選下方,第一時間了解華為雲新鮮技術~
華為雲部落格_大資料部落格_AI部落格_雲計算部落格_開發者中心-華為雲