在前面的文章中我們給大家介紹了什么是變化數(shù)據(jù)捕獲?(點此閱讀),接下來為給大家?guī)砀嚓P(guān)于CDC的介紹與如何做變化數(shù)據(jù)捕獲。
CDC的使用場景有哪些呢?
CDC技術(shù)的應(yīng)用場景非常廣泛,包括:
→數(shù)據(jù)分發(fā):將一個數(shù)據(jù)源的數(shù)據(jù)分發(fā)給多個下游業(yè)務(wù)系統(tǒng),常用于業(yè)務(wù)解耦、微服務(wù)系統(tǒng)。
→數(shù)據(jù)采集:面向數(shù)據(jù)倉庫、數(shù)據(jù)湖的ETL數(shù)據(jù)集成,消除數(shù)據(jù)孤島,便于后續(xù)的分析。
→數(shù)據(jù)同步:常用于數(shù)據(jù)備份、容災等。
常見的變化數(shù)據(jù)捕獲方法
→基于查詢的CDC
這種方法中,需要不斷的查詢源數(shù)據(jù)庫表中的數(shù)據(jù),以獲取更改的數(shù)據(jù)記錄;查詢過程中需要通過某些列來判斷那些數(shù)據(jù)是變更的;常見的有時間戳列、自增序列列,可以通過保存創(chuàng)建時間列、修改時間列來表示插入、變更的記錄,自增列也很容易識別出新插入的記錄。
→基于觸發(fā)器的CDC
在這個方法中,當業(yè)務(wù)系統(tǒng)執(zhí)行插入、更新、刪除這些SQL時,以激活數(shù)據(jù)庫的觸發(fā)器,使其對數(shù)據(jù)記錄進行變更捕獲,并將數(shù)據(jù)保存在一個臨時表中,最后在將變更數(shù)據(jù)從臨時表中抽取到數(shù)據(jù)倉庫中。
→基于快照的CDC
如果上述的觸發(fā)器以及增加列查詢的方式都不被允許的情況下,就可以使用快照表等方式進行變更數(shù)據(jù)的捕獲;其實現(xiàn)思路就是通過比較源表和快照表的方式,獲取數(shù)據(jù)的變更信息,通過快照的方式可以檢測到插入、更新以及刪除的數(shù)據(jù)記錄。
→基于日志的CDC
當數(shù)據(jù)庫表完成一個的新的DML(insert,update,delete)操作后,數(shù)據(jù)庫都會將它實時記錄到日志文件中;通過解析數(shù)據(jù)庫操作日志的方式,可以將插入、更新、刪除的數(shù)據(jù)更改操作都可以捕獲,發(fā)送下游系統(tǒng)。
上述4種CDC的實現(xiàn)方式中,基于日志方式的CDC是最優(yōu)的實現(xiàn)方式,其實時性高、無侵入性,并且能將所有的更改捕獲;如果無法獲取并解析數(shù)據(jù)庫日志文件,則可以選擇其他三種方式進行CDC;基于快照的方式雖然可以捕獲所有的變更記錄,但是其有個明顯的缺點就是需要大量的存儲空間來保存快照數(shù)據(jù),且實時性低;基于觸發(fā)器的方式因為要增加觸發(fā)器,則對變更數(shù)據(jù)進行多次寫入操作,有一定的侵入性;基于查詢的方式則需要在數(shù)據(jù)表上進行時間列、自增列的添加,侵入性強,且無法獲取刪除操作,因此很少使用。
CDC變更日志流
前邊我們已經(jīng)對CDC有了初步的了解,CDC的核心思想是進行數(shù)據(jù)更改的捕獲和識別,并將其發(fā)送下游系統(tǒng),那數(shù)據(jù)的變更過程是以什么樣的形式發(fā)送下游系統(tǒng)的呢,那就是CDC變更日志流。
CDC程序?qū)ú迦?、更新、刪除的數(shù)據(jù)操作通過進行解析處理轉(zhuǎn)換,形成統(tǒng)一規(guī)范的變更消息傳遞給下游的系統(tǒng),這些消息流包括INSERT(+I),UPDATE_BEFORE(-U),UPDATE_AFTER(+U),DELETE(-D)四種消息狀態(tài)語義:
→INSERT(+I):新插入的數(shù)據(jù)記錄行
→UPDATE_BEFORE(-U):數(shù)據(jù)記錄行被更新前的數(shù)據(jù)
→UPDATE_AFTER(+U):數(shù)據(jù)記錄行被更新后的數(shù)據(jù)
→DELETE(-D):刪除的數(shù)據(jù)記錄行
下面我們以一張人員信息表的業(yè)務(wù)數(shù)據(jù)變化過程為例,進行CDC變更日志流的解釋。人員表有人員ID(id),姓名(name),年齡(age)等字段,對其進行如下插入、更新、刪除的數(shù)據(jù)記錄事務(wù)操作:
→在人員表中插入一條人員信息,ID為1,姓名為小明,18歲。
→再向人員表中插入一條人員信息,ID為2,姓名為李華,32歲。
→修改小明的年齡為20歲。
→從人員表中將李華刪除。
→最后向人員表中插入一條人員信息,ID為3,姓名為麗麗,年齡為8歲。
上述人員表的CDC變更日志流如下:
+I{id: 1, name: '小明', age: 18}
+I{id: 2, name: '李華', age: 32}
-U{id: 1, name: '小明', age: 18}
+U{id: 1, name: '小明', age: 20}
-D{id: 2, name: '李華', age: 32}
+I{id: 3, name: '麗麗', age: 8}
最終的人員表數(shù)據(jù)如下:
User(人員信息表) |
id(人員ID) |
name(姓名) |
age(年齡) |
1 |
小明 |
20 |
3 |
麗麗 |
8 |
除過上述示例中的變更日志流的表示方式外,還可以通過其他格式進行表示,只要準確描述上述4中更改消息語義即可。
CDC變更日志流可以記錄整張表的數(shù)據(jù)變更記錄,使得我們可以通過執(zhí)行變更流,在任意位置停止,而將CDC表的數(shù)據(jù)恢復到任何時刻,這比定時備份更加可靠及節(jié)省空間。
在Tempo數(shù)據(jù)工廠中如何進行CDC
Tempo數(shù)據(jù)工廠是集海量數(shù)據(jù)集成、實時數(shù)據(jù)加工、離線數(shù)據(jù)處理、自定義組件擴展、一體化監(jiān)控運維五大核心功能的大數(shù)據(jù)開發(fā)平臺,為企業(yè)用戶降低了多源異構(gòu)數(shù)據(jù)的融合成本,賦能全鏈路數(shù)據(jù)開發(fā),讓數(shù)據(jù)更好發(fā)揮價值。在Tempo數(shù)據(jù)工廠平臺中,用戶可以通過拖拉拽的方式快速配置完成一個實時自助流程進行業(yè)務(wù)數(shù)據(jù)的CDC,并且可以進行后續(xù)的計算處理,最終將數(shù)據(jù)寫入目標源中,一個完整的CDC業(yè)務(wù)數(shù)據(jù)流,如下圖:
我們可以將左側(cè)輸入節(jié)點中的MySQL CDC拖入右側(cè)畫布中,雙擊打開節(jié)點配置面板,通過選擇已經(jīng)配置好的MySQL數(shù)據(jù)源,選擇需要進行CDC的庫表,節(jié)點自動讀取表的列信息展示,最后點擊右上角的應(yīng)用按鈕,這樣一個MySQL數(shù)據(jù)源表的CDC輸入節(jié)點就配置完成了,配置如下圖:
目前Tempo數(shù)據(jù)工廠支持的可進行CDC的數(shù)據(jù)庫列表如下:
Oracle |
版本: 12c, 19c, 21c |
MySQL |
版本: 5.7, 8.0.x |
PostgreSQL |
版本: 10, 11, 12, 13, 14
插件: decoderbufs, pgoutput |
SQL Server(孵化中) |
版本: 2017, 2019 |
Db2(孵化中) |
版本: 11.5 |
如果大家在實際的業(yè)務(wù)數(shù)據(jù)分析過程中,想要提高數(shù)據(jù)的時效性,降低處理數(shù)據(jù)變更的難度,可以嘗試使用CDC進行實時數(shù)據(jù)同步,而Tempo數(shù)據(jù)工廠可以讓您更快的應(yīng)用它。