作者:昶風
引言
CDC(Change Data Capture)指的是監聽上游數據變更,並將變更信息同步到下游業務以供進一步處理的一種應用場景。近年來事件驅動架構(EDA)熱度逐步上升,日漸成為項目架構設計者的第一選擇。EDA 天然契合 CDC 的底層基礎架構,其將數據變更作為事件,各個服務通過監聽自己感興趣的事件來完成一些列業務驅動。阿里雲 EventBridge 是阿里雲推出的一款無服務器事件總線服務,能夠幫助用户輕鬆快捷地搭建基於 EDA 架構的應用。近期,EventBridge 事件流已經支持了基於阿里雲 DTS [ 1] 服務的 CDC 能力。本文將從 CDC、CDC 在 EventBridge 上的應用以及若干最佳實踐場景等方面,為大家介紹如何利用 EventBridge 輕鬆構建 CDC 應用。
CDC 概述
基本原理與應用場景
CDC 從源數據庫捕獲增量的數據以及數據模式變更,以高可靠、低延時的數據傳輸將這些變更有序地同步到目標數據庫、數據湖或者其他數據分析服務。目前業界主流的開源 CDC 工具包括 Debezium [2 ] 、Canal [3 ] 以及 Maxwell [4 ] 。
圖片來源:https://dbconvert.com
目前業界主要有以下幾類 CDC 的實現:
1. 基於時間戳或版本號
基於時間戳的方式要求數據庫表有一個字段代表更新時間戳,當存在數據插入或更新時,對應時間戳字段就會隨之更新。CDC 組件週期性檢索更新時間大於上次同步時間的數據記錄,即可捕獲本週期內數據的變更。基於版本號跟蹤和基於時間戳跟蹤原理基本一致,要求開發者變更數據時必須更新數據的版本號。
2. 基於快照
基於快照的 CDC 實現在存儲層面使用到了數據源 3 份副本,分別是原始數據、先前快照和當前快照。通過對比 2 次快照之間的差異來獲取這之間的數據變更內容。
3. 基於觸發器
基於觸發器的 CDC 實現方式事實上是在源表上建立觸發器將對數據的變更操作(INSERT、UPDATE、DELETE)記錄存儲下來。例如專門建立一張表記錄用户的變更操作,隨後創建 INSERT、UPDATE、DELETE 三種類型的觸發器將用户變更同步到此表。
4. 基於日誌
以上三種方式都對源數據庫存在一定侵入性,而基於日誌的方式則是一種非侵入性的 CDC 方式。數據庫利用事務日誌實現災備,例如 MySQL 的 binlog 就記錄了用户對數據庫的所有變更操作。基於日誌的 CDC 通過持續監聽事務日誌來實時獲取數據庫的變化情況。
CDC 的應用場景廣泛,包括但不限於這些方面:異地機房數據庫同步、異構數據庫數據同步、微服務解耦、緩存更新與 CQRS 等。
基於阿里雲的 CDC 解決方案:DTS
數據傳輸服務 DTS(Data Transmission Service)是阿里雲提供的實時數據流服務,支持關係型數據庫(RDBMS)、非關係型的數據庫(NoSQL)、數據多維分析(OLAP)等數據源間的數據交互,集數據同步、遷移、訂閲、集成、加工於一體。其中,DTS 數據訂閲 [ 5 ] 功能可以幫助用户獲取自建 MySQL、RDS MySQL、Oracle 等數據庫的實時增量數據。
CDC 在EventBrige上的應用
阿里雲 EventBridge 提供了事件總線 [6 ] 與事件流 [7 ] 2 款不同應用場景的事件路由服務。
事件總線底層擁有事件的持久化能力,可以按照需要將事件路由到多個事件目標中。
事件流適用於端到端的流式數據處理場景,對源端產生的事件實時抽取、轉換和分析並加載至目標端,無需創建事件總線,端到端轉儲效率更高,使用更輕便。
為了更好地支持用户在 CDC 場景下的需求,EventBridge 在事件流源端支持了阿里雲 DTS 的數據訂閲功能,用户僅需簡單配置,即可將數據庫變更信息同步到 EventBridge 事件流。
EventBridge 定製了基於 DTS sdk 的 DTS Source Connector。當用户配置事件提供方為 DTS 的事件流時,source connector 會實時地從 DTS 服務端拉取 DTS record 數據。數據拉取到本地後,會進行一定的結構封裝,保留 id、operationType、topicPartition、beforeImage、afterImage 等數據,同時增加 streaming event 所需要的一些系統屬性。
DTS Event 樣例可參考 EventBridge 官方文檔
EventBridge Streaming 保證了 DTS 事件的順序性,但存在事件重複投遞的可能性,EventId 在保證了和每條 DTS record 的一一映射關係,用户可依據此字段來對事件做冪等處理。
創建源為 DTS 的 EventBridge 事件流
下面展示如何在 EventBridge 控制枱創建源為 DTS 的事件流
- 前期準備
- 開通 EventBridge 服務;
- 創建 DTS 數據訂閲任務;
- 創建用於消費訂閲數據的消費組賬號信息。
- 創建事件流
- 登陸 EventBridge 控制枱,點擊左側導航欄,選擇“事件流”,在事件流列表頁點擊“創建事件流”;
- “基本信息”中“事件流名稱”與“描述”按照需要填寫即可;
- 在創建事件流,選擇事件提供方時,下拉框選擇“數據庫 DTS”;
- 在“數據訂閲任務”一欄中選擇已創建的 DTS 數據訂閲任務。在消費組一欄,選擇要使用哪個消費組消費訂閲數據,同時填寫消費組密碼與初始消費時間。
- 事件流規則與目標按照需要填寫,保存啓動即可創建以 DTS 數據訂閲為事件源的事件流。
注意事項
使用時有以下幾點需要注意:
- EventBridge 使用的是 SUBSCRIBE 消費模式 [8 ] ,所以請保證當前 DTS 消費組沒有其他客户端實例在運行。如果設置的消費組在之前有運行,則傳入的位點失效,會基於此消費組上次消費過的位點繼續消費;
- 創建 DTS 事件源時傳入的位點僅在新消費組第一次運行時起效,後續任務重啓後會基於上次消費位點繼續消費;
- EventBridge 事件流訂閲 OperationType 為 INSERT、DELETE、UPDATE、DDL 類型的 DTS 數據;
- 使用 DTS 事件源可能會有消息重複,即保證消息不丟,但無法保證僅投遞一次,建議用户做好冪等處理;
5.用户如果需要保證順序消費,則需要將異常容忍策略設置為“NONE”,即不容忍異常。在這種情況下,如果事件流目標端消費消息異常,整個事件流將暫停,直至恢復目標端正常。
最佳實踐示例
基於EventBridge 實現 CQRS
在 CQRS(Command Query Responsibility Segregation)模型中,命令模型用於執行寫以及更新操作,查詢模型用於支持高效的讀操作。讀操作和寫操作使用的數據模型存在一定區別,需要使用一定方式保證數據的同步,基於 EventBridge 事件流的 CDC 可以滿足這樣的需求。
基於雲上服務,用户可以使用如下方式輕鬆構建基於 EventBridge 的 CQRS:
- 命令模型操作數據庫進行變更,查詢模型讀取 elasticsearch 獲取數據;
- 開啓 DTS 數據訂閲任務,捕獲 DB 變更內容;
3.配置 EventBridge 事件流,事件提供方為 DTS 數據訂閲任務,事件接收方為函數計算 FC;
- FC 中的服務即為更新 elasticsearch 數據操作。
微服務解耦
CDC 也可以用於微服務解耦。例如下文是一個電商平台的訂單處理系統,當有新建的未付款訂單產生時,數據庫會有一條 INSERT 操作,而當某筆訂單狀態由“未付款”變為“已付款”時,數據庫會有一條 UPDATE 操作。根據訂單狀態變化的不同,後端會有不同的微服務來對此進行處理。
- 用户下單/付款,訂單系統進行業務處理,將數據變更寫入 DB;
- 新建 DTS 訂閲任務捕獲 DB 數據變更;
- 搭建 EventBridge 事件流。事件提供方為 DTS 數據訂閲任務,事件接收方為 RocketMQ;
- 在消費 RocketMQ 數據時,同一個 topic 下啓用 3 個 group 代表不同的業務消費邏輯;
a. GroupA 將捕獲到的 DB 變更用户緩存更新,便於用户查詢訂單狀態;
b. GroupB 下游關聯財務系統,僅處理新建訂單,即處理 DB 操作類型為 INSERT 的事件,丟棄其餘類型事件;
c. GroupC 僅關心訂單狀態由“未付款”變為“已付款”的事件,當有符合條件事件到達時,調用下游物流、倉儲系統,對訂單進行進一步處理。
如果採用接口調用方式,那麼用户在下單之後訂單系統將分別需要調用緩存更新接口、新建訂單接口以及訂單付款接口,業務耦合性過高。除此之外,這種模式使得數據消費端不用擔心上游訂單處理接口返回內容的語義信息,在存儲模型不變的情況下,直接從數據層面判斷此次數據變更是否需要處理以及需要怎樣的處理。同時,消息隊列天然的消息堆積能力也可以幫助用户在訂單峯值到來時實現業務削峯填谷。
事實上,目前 EventBridge Streaming 支持的消息產品還包括 RabbitMQ、Kafka、MNS 等,在實際操作中用户可以根據自己的需要進行選擇。
數據庫備份&異構數據庫同步
數據庫災備和異構數據庫數據同步也是 CDC 重要的應用場景。使用阿里雲 EventBridge 亦可以快速搭建此類應用。
- 新建 DTS 數據訂閲任務,捕獲用户 MySQL 數據庫變更;
- 搭建 EventBridge 事件流,事件提供方為 DTS 數據訂閲任務;
- 使用 EventBridge 在目的數據庫執行指定 sql,實現數據庫備份;
- 數據變更事件投遞到函數計算,用户業務根據數據變化內容更新對應異構數據庫。
自建 SQL 審計
對於用户有自建 SQL 審計的需求,使用 EventBridge 也可以輕鬆實現。
- 新建 DTS 數據訂閲任務,捕獲數據庫變更;
- 搭建 EventBridge 事件流,事件提供方為 DTS,事件接收方為日誌服務 SLS;
- 用户需要對 SQL 進行審計時,通過查詢 SLS 進行。
總結
本文介紹了 CDC 的一些概念、CDC 在 EventBridge 上的應用以及若干最佳實踐場景。隨着支持產品的不斷增加,EventBridge 所承載的生態版圖也不斷擴大,從消息生態到數據庫生態,從日誌生態到大數據生態,EventBridge 不斷擴大其適用領域,鞏固雲上事件樞紐的地位,此後也將按照這個方向繼續發展,技術做深,生態做廣。
參考鏈接:
[1] DTS:
https://www.aliyun.com/produc...
[2] Debezium:
https://debezium.io/
[3] Canal:
https://github.com/alibaba/canal
[4] Maxwell:
https://github.com/zendesk/ma...
[5] DTS 數據訂閲:
https://help.aliyun.com/docum...
[6] 事件總線:
https://help.aliyun.com/docum...
[7] 事件流:
https://help.aliyun.com/docum...
[8] SUBSCRIBE 消費模式:
https://help.aliyun.com/docum...
感興趣的小夥伴們可以掃描下方二維碼加入釘釘羣討論(羣號:44552972)
點擊此處,進入 EventBridge 官網瞭解更多信息~