Debezium 是由 Red Hat 開源的一種基于變更數據捕獲(CDC) 的分布式平臺,專為實時捕獲和傳播數據庫的變更事件而設計。Debezium 常見的使用場景包括:
- 實時數據集成:將數據庫變更同步到數據倉庫或數據湖,支撐實時分析。
- 維護緩存一致性:源頭數據庫變更時自動失效或者更新 Redis/Memcached 中的緩存條目。
- 微服務解耦:在單體應用拆分場景中,避免多系統“雙寫”一致性問題,通過 CDC 觸發下游業務邏輯(如更新搜索索引、發送通知等)。
- 共享數據庫:當多個應用共用同一個數據庫的時候,一個應用提交的更改通常要被另一個應用感知到。Debezium 可以讓每個應用直接監控數據庫的更改,并且響應更改。
- 命令查詢職責分離:在命令查詢職責分離(CQRS)架構模式中,Debezium 捕獲數據更改并且持久化到全序流里,然后供那些需要異步更新只讀視圖的服務消費。
系統架構
Debezium 提供了三種部署架構:Apache Kafka Connect、獨立服務器、嵌入式引擎。
Apache Kafka Connect
大多數情況下使用 Apache Kafka Connect 部署 Debezium,如上圖所示。其中:
- Debezium 作為源端連接器,將變更記錄發送給 Kafka;
- 目標連接器將記錄從 Kafka 主題傳播到其他系統。
例如,Debezium 提供 MySQL 或者 PostgreSQL 連接器分別用于捕獲這兩種數據庫的變更。每個 Debezium 連接器都會建立一個對應的源端數據庫連接:
- MySQL 連接器使用客戶端代碼庫來訪問 binlog。
- PostgreSQL 連接器從邏輯復制流讀取。
Kafka Connect 作為獨立的服務運行。
默認情況下,從一個數據庫表中的更改被寫入 Kafka 主題,主題名稱與表名稱對應。如果需要,可以通過配置 Debezium 的主題路由轉換來調整目標主題名稱。例如:
- 將記錄路由到名稱與表名不同的主題;
- 多個表的變更事件記錄到一個主題中。
在 Apache Kafka 中保存事件記錄后,Kafka Connect 生態中的不同連接器可以將記錄傳輸到其他系統和數據庫,例如 Elasticsearch、數據倉庫和分析系統或者緩存中。
獨立服務器
另外一種部署方式就是使用 Debezium 服務器,如下圖所示:
用戶可以配置 Debezium 服務器使用源端連接器捕獲數據庫變更,然后將其序列化成不同的格式(例如 JSON 或者 Apache Avro),然后將結果發送給各種消息平臺,例如 Redis、Amazon Kinesis,、Google Cloud Pub/Sub 或者 Apache Pulsar。
嵌入式引擎
這種部署方式不需要依賴 Kafka Connect,而是直接將 Debezium 連接器作為一個代碼庫嵌入 Java 應用程序中,捕獲數據變更,提供給應用程序使用,或者將數據流轉給消息平臺。
功能特性
Debezium 提供的主要功能如下:
- 支持各種源端數據庫,包括 MySQL、MariaDB、MongoDB、PostgreSQL、Oracle、SQL Server、Db2、Cassandra、Vitess、Spanner、Informix 等;
- 可以捕獲完整的數據變更,并且只捕獲已提交的事務,避免中間狀態或回滾操作,保證數據一致性。
- 通過讀取數據庫事務日志而非輪詢表,確保高性能和低侵入性,不影響源庫性能。例如,對于 MySQL 或者 PostgreSQL,延遲在毫秒級;
- 不需要對數據模型進行修改,例如增加 Last Updated 字段;
- 支持數據刪除操作的捕獲;
- 基于 Java 開發,資源占用低,支持分布式部署和高可用架構。通過 Kafka Connect 框架橫向擴展,應對大數據量同步需求;
- 支持模式、表、字段級別的過濾,可以指定捕獲的包含列表或者排除列表;
- 支持指定字段的數據脫敏,保護敏感信息;
- 支持消息轉換,包括路由、篩選、扁平化等;
- 大多數連接器都可以通過 JMX 進行監控。
下載安裝
Debezium 官方推薦使用 Docker 進行部署,并且給出了一個詳細的安裝步驟和示例,地址如下:
https://debezium.io/documentation/reference/3.1/tutorial.html