數據庫實時同步利器

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