一、什么是 CDC
????????CDC 是 Change Data Capture(變更數據獲取)的簡稱。核心思想是,監測并捕獲數據庫的變動(包括數據或數據表的插入、更新以及刪除等),將這些變更按發生的順序完整記錄下來,寫入到消息中間件中以供其他服務進行訂閱及消費。
二、Flink CDC
????????Flink CDC 通過捕獲數據庫的變更日志(如 MySQL binlog、Postgres WAL),實現高效、低延遲的數據同步。其核心工作原理可分為變更數據捕獲、轉換處理和輸出同步三個階段:
2.1 變更數據捕獲
- 日志抓取:
使用 Debezium (Flink CDC 底層引擎) 連接數據庫,通過各自協議讀取變更日志
MySQL ——> binlog
PostgreSQL ——> WAL
Oracle ——> Redo Log - 初始快照:
首次啟動時執行全量快照(snapshot),將表中已有數據轉為 INSERT 事件流。
? ? ? ? 采用分塊并行讀取(如按主鍵分片)加速同步。
2.2 轉換處理
- 日志解析與轉換
格式轉換:
Debezium 將原始二進制日志解析為 JSON / Avro 結構,Flink CDC將其轉換為 RowData結構(Flink 內部數據結構)。
Schema 映射:
? 自動推斷表結構(字段名、類型、主鍵),動態處理 DDL 變更(如新增列)。 - Flink 實時處理
流式處理:
變更事件(INSERT / UPDATE / DELETE)作為無界數據流進入 Flink。
Exactly-Once 語義:
?通過 Checkpoint 機制 + binlog 位點持久化(如 Kafka 或 Flink State)保證數據一致性。
轉換能力:
支持使用 Flink SQL 或 DataStream API 進行過濾、聚合、關聯維表等操作。
2.3?輸出同步
將處理后的數據寫入下游系統:
- 數據胡:Hudi / IceBerg
- OLAP 引擎:Clickhouse / Doris
- 消息隊列:Kafka / Pulsar
- 數據庫:Mysql / PostgreSQL(需要支持 Upsert)
三、關鍵技術
3.1 全量+增量無縫切換
- 無鎖讀取:
快照階段使用 SELECT ... FROM 而非鎖表(Mysql 使用 mysqldump 的輕量模式)。 - 斷點續傳:
Checkpoint 存儲 binlog 位點,故障恢復時從斷點繼續同步。? ? ? ? ? ? ? ? ? ? ? ? ?
3.2 動態表結構處理
- 自動 Schema 同步:
源表新增列時,Flink CDC 自動更新 Schema,下游系統需支持 DDL 傳播。 - 兼容性處理:
舊數缺失實新增列時填充 NULL。
3.3 并行讀取優化
- 分片策略:
按主鍵范圍或按時間分區并行快照。 - 增量階段并行度:
單任務串行讀取 binlog(避免亂序),但可并行處理后續計算。
四、典型應用場景
4.1 實時數倉同步
-- Flink SQL 實現 MySQL → Hudi
CREATE TABLE orders_cdc (id BIGINT,amount DECIMAL(10,2),PRIMARY KEY (id) NOT ENFORCED
) WITH ('connector' = 'mysql-cdc','hostname' = 'mysql-host','database-name' = 'test','table-name' = 'orders'
);CREATE TABLE hudi_orders (...) WITH ('connector'='hudi');INSERT INTO hudi_orders SELECT * FROM orders_cdc;
4.2 多源數據聚合
// DataStream 實現訂單+用戶表關聯
DataSource<Order> orders = env.fromSource(MySqlSource.<Order>builder().build(), ...);DataSource<User> users = env.fromSource(PostgresSource.<User>builder().build(), ...);orders.connect(users).keyBy(o -> o.userId, u -> u.id).process(new EnrichOrderFunction()); // 關聯用戶信息
4.3 微服務數據融合
將分散的數據庫變更同步到 Kafka 統一主題,供下游服務消費。
五、性能優化策略
增量階段跳過快照
配置?'scan.startup.mode'='latest-offset'
?僅同步新增數據(無需全量)。批量讀取加速
調整?debezium.snapshot.fetch.size
(單次讀取行數)提升快照效率。無主鍵表處理
啟用?'chunk-key.even-distribution'='false'
?優化全表掃描性能。資源隔離
將 CDC 源任務與其他計算任務部署在不同 TaskManager 上,避免資源競爭。