本文作者徐榜江 (雪盡)
以下視訊為伍翀 (雲邪) 分享的 Flink CDC 前世今生:
https://www.bilibili.com/vide...
前言
CDC (Change Data Capture) 是一種用於捕捉資料庫變更資料的技術,Flink 從 1.11 版本開始原生支援 CDC 資料(changelog)的處理,目前已經是非常成熟的變更資料處理方案。
Flink CDC Connectors 是 Flink 的一組 Source 聯結器,是 Flink CDC 的核心元件,這些聯結器負責從 MySQL、PostgreSQL、Oracle、MongoDB 等資料庫讀取存量歷史資料和增量變更資料。Flink CDC Connectors 是一個獨立的開源專案,從去年 7 月份開源以來,社群保持了相當高速的發展,平均兩個月一個版本,在開源社群的關注度持續走高,也逐漸有越來越多的使用者使用 Flink CDC 來快速構建實時數倉和資料湖。
在今年 7 月份,Flink CDC Maintainer 徐榜江 (雪盡) 在北京的 Flink Meetup 首次分享了 Flink CDC 2.0 的設計。隨後的 8 月份,Flink CDC 社群釋出 2.0 版本,解決了諸多生產實踐上的痛點,Flink CDC 社群的使用者群也隨之迅速壯大。
除了社群使用者群體的迅速擴大,社群的開發者也在快速增加,目前已經有國內外多家公司的開發者加入到 Flink CDC 社群的開源共建,有來自北美 Cloudera 的開發者,也有來自歐洲 Vinted,Ververica 的開發者,國內的開發者更加活躍,有來自騰訊,阿里,位元組等網際網路公司的開發者,也有來自 XTransfer,新華文軒等創業公司和傳統企業的開發者。此外,國內外的多家雲廠商,其流計算產品都已經整合了 Flink CDC,讓更多的使用者體驗到 Flink CDC 的強大與便捷。
一、Flink CDC 2.1 概覽
在社群開發者們共同努力下,今天 Flink CDC 社群很開心地宣佈 Flink CDC 2.1 正式釋出了:https://github.com/ververica/...
本文帶著你 10 分鐘瞭解 Flink CDC 2.1 版本的重大改進和核心功能。 2.1 版本包含 23 位貢獻者貢獻的 100+ PR,重點提升了 MySQL CDC 聯結器的效能和生產穩定性,重磅推出 Oracle CDC 聯結器和 MongoDB CDC 聯結器。
- MySQL CDC 支援百億級資料的超大表,支援 MySQL 全部資料型別,通過連線池複用等優化大幅提升穩定性。同時提供支援無鎖演算法,併發讀取的 DataStream API,使用者可以藉此搭建整庫同步鏈路;
- 新增了 Oracle CDC 聯結器, 支援從 Oracle 資料庫獲取全量歷史資料和增量變更資料;
- 新增了 MongoDB CDC 聯結器,支援從 MongoDB 資料庫獲取全量歷史資料和增量變更資料;
- 所有聯結器均支援了 metadata column 功能, 使用者通過 SQL 就可以訪問庫名,表名,資料變更時間等 meta 資訊,這對分庫分表場景的資料整合非常實用;
- 豐富 Flink CDC 入門文件,增加多種場景的端到端實踐教程。
二、MySQL CDC 聯結器改進詳解
在 Flink CDC 2.0 版本里,MySQL CDC 聯結器提供了無鎖演算法,併發讀取,斷點續傳等高階特性, 一併解決了諸多生產實踐上的痛點,隨後大量使用者開始投入使用並大規模上線。在上線過程中,我們配合使用者解決了諸多生產問題,同時也開發了一些使用者迫切需要的高優功能,Flink CDC 2.1 版本針對 MySQL CDC 聯結器的改進主要包括兩類,一類是穩定性提升,一類是功能增強。
1. 穩定性提升
- 針對不同的主鍵分佈,引入動態分片演算法
對主鍵是非數值、Snowflake ID、稀疏主鍵、聯合主鍵等場景,通過動態分析源表的主鍵分佈的均勻程度,根據分佈的均勻程度自動地計算分片大小,讓切片更加合理,讓分片計算更快。動態分片演算法能夠很好地解決稀疏主鍵場景下分片過多的,聯合主鍵場景下分片過大等問題,讓每個分片包含的行數儘量維持在使用者指定的 chunk size,這樣使用者通過 chunk size 就能控制分片大小和分片數量,無需關心主鍵型別。
- 支援百億級超大規模表
在表規模非常大時,以前會報 binlog 分片下發失敗的錯誤,這是因為在超大表對應的 snapshot 分片會非常多,而 binlog 分片需要包含所有 snapshot 分片資訊,當 SourceCoordinator 下發 binglog 分片到 SourceReader 節點時,分片 size 超過 RPC 通訊框架支援的最大 size 會導致分片下發失敗。雖然可以通過修改 RPC 框架的引數緩解分片 size 過大問題,但無法徹底解決。2.1 版本里通過將多個 snapshot 分片資訊劃分成 group 傳送,一個 binlog 分片會切分成多個 group 逐個傳送,從而徹底解決該問題。
- 引入連線池管理資料庫連線,提升穩定性
通過引入連線池管理資料庫連線,一方面降低了資料庫連線數,另外也避免了極端場景導致的連線洩露。
- 支援分庫分表 schema 不一致時,缺失欄位自動填充 NULL 值
2. 功能增強
- 支援所有 MySQL 資料型別
包括列舉型別、陣列型別、地理資訊型別等複雜型別。
- 支援 metadata column
使用者可以在 Flink DDL 中通過 db_name STRING METADATA FROM 'database_name' 的方式來訪問庫名(database_name)、表名(table_name)、變更時間(op_ts)等 meta 資訊。這對分庫分表場景的資料整合非常使用。
- 支援併發讀取的 DataStream API
在 2.0 版本中,無鎖演算法,併發讀取等功能只在 SQL API 上透出給使用者,而 DataStream API 未透出給使用者,2.1 版本支援了 DataStream API,可通過 MySqlSourceBuilder 建立資料來源。使用者可以同時捕獲多表資料,藉此搭建整庫同步鏈路。同時通過 MySqlSourceBuilder#includeSchemaChanges 還能捕獲 schema 變更。
- 支援 currentFetchEventTimeLag,currentEmitEventTimeLag,sourceIdleTime 監控指標
這些指標遵循 FLIP-33 [1] 的聯結器指標規範,可以檢視 FLIP-33 獲取每個指標的含義。其中,currentEmitEventTimeLag 指標記錄的是 Source 傳送一條記錄到下游節點的時間點和該記錄在 DB 裡產生時間點差值,用於衡量資料從 DB 產生到離開 Source 節點的延遲。使用者可以通過該指標判斷 source 是否進入了 binlog 讀取階段:
- 即當該指標為 0 時,代表還在全量歷史讀取階段;
- 當大於 0 時,則代表進入了 binlog 讀取階段。
三、詳解新增 Oracle CDC 聯結器
Oracle 也是使用很廣泛的資料庫, Oracle CDC 聯結器支援捕獲並記錄 Oracle 資料庫伺服器中發生的行級變更,其原理是使用 Oracle 提供的 LogMiner [2] 工具或者原生的 XStream API [3] 從 Oracle 中獲取變更資料。
LogMiner 是 Oracle 資料庫提供的一個分析工具,該工具可以解析 Oracle Redo 日誌檔案,從而將資料庫的資料變更日誌解析成變更事件輸出。通過 LogMiner 方式時,Oracle 伺服器對解析日誌檔案的程式做了嚴格的資源限制,所以對規模特別大的表,資料解析會比較慢,優點是 LogMiner 是可以免費使用的。
XStream API 是 Oracle 資料庫為 Oracle GoldenGate (OGG) 提供的內部介面, 客戶端可以通過 XStream API 高效地獲取變更事件,其變更資料不是從 Redo 日誌檔案中獲取,而是從 Oralce 伺服器中的一塊記憶體中直接讀取,省去了資料落盤到日誌檔案和解析日誌檔案的開銷,效率更高,但是必須購買 Oracle GoldenGate (OGG) 的 License。
Oracle CDC 聯結器支援 LogMiner 和 XStream API 兩種方式捕獲變更事件。理論上能支援各種 Oracle 版本,目前 Flink CDC 專案裡測試了 Oracle 11,12 和 19 三個版本。使用 Oracle CDC 聯結器,使用者只需要宣告如下 Flink SQL 就能實時捕獲 Oracle 資料庫中的變更資料:
利用 Flink 豐富的周邊生態,使用者可以非常方便地寫入各種下游儲存,如訊息佇列,資料倉儲,資料湖等。
Oracle CDC 聯結器已經將底層的 CDC 細節遮蔽,整個實時同步鏈路,使用者只需要幾行 Flink SQL,不用開發任何 Java 程式碼,就可以將 Oracle 的資料變更實時捕獲併傳送。
此外,Oracle CDC 聯結器也提供兩種工作模式,即讀取全量資料 + 增量變更資料,和只讀取增量變更資料。Flink CDC 框架均保證一條不多一條不少的 exactly-once 語義。
四、詳解新增 MongoDB CDC 聯結器
MongoDB CDC 聯結器並不依賴 Debezium,是在 Flink CDC 專案裡獨立開發。 MongoDB CDC 聯結器支援捕獲並記錄 MongoDB 資料庫中實時變更資料,其原理是偽裝一個 MongoDB 叢集裡副本 [4],利用 MongoDB 叢集的高可用機制,該副本可以從 master 節點獲取完整 oplog(operation log) 事件流。Change Streams API 則提供實時訂閱這些 oplog 事件流的能力,可以將這些實時的 oplog 事件流推送給訂閱的應用程式。
從 ChangeStreams API 獲取的更新事件中,對於 update 事件,沒有 update 事件的前映象值,即 MongoDB CDC 資料來源只能作為一個 upsert source。不過 Flink 框架會自動為 MongoDB CDC 附加一個 Changelog Normalize 節點,補齊 update 事件的前映象值(即 UPDATE_BEFORE 事件),從而確保 CDC 資料的語義正確性。
使用 MongoDB CDC 聯結器,使用者只需要宣告如下 Flink SQL 就能實時捕獲 MongoDB 資料庫中的全量和增量變更資料,藉助 Flink 強大的整合能力,使用者可以非常方便地將 MongoDB 中的資料實時同步到 Flink 支援的所有下游儲存。
整個資料捕獲過程,使用者不需要學習 MongoDB 的副本機制和原理,極大地簡化了流程,降低了使用門檻。MongoDB CDC 也支援兩種啟動模式:
- 預設的initial 模式是先同步表中的存量的資料,然後同步表中的增量資料;
- latest-offset 模式則是從當前時間點開始只同步表中增量資料。
此外,MongoDB CDC 還提供了豐富的配置和優化引數,對於生產環境來說,這些配置和引數能夠極大地提升實時鏈路的效能和穩定性。
五、總結和展望
在短短的一年多時間裡,Flink CDC 專案取得了現象級的發展和關注,這離不開 Flink CDC 開源社群的貢獻者們的無私貢獻, 也離不開廣大 Flink CDC 使用者的積極反饋,正是這兩者的良性互動才使得 Flink CDC 專案健康發展,這種良性互動也是開源社群的魅力所在。
Flink CDC 社群將會繼續做好開源社群建設,在未來規劃中,主要有三個方向:
做深 CDC 技術
如抽象複用 mysql-cdc 實現,讓 Oracle, MongoDB 等也能快速支援無鎖讀取、併發讀取等特性。
做廣資料庫生態
我們會支援更豐富的資料庫 CDC 資料來源,如 TiDB, DB2, MS SqlServer等。
做好資料整合場景
- 更好地整合實時數倉、資料湖的下游生態,包括 Hudi、Iceberg、ClickHouse、Doris 等。
- 進一步降低 CDC 資料入湖入倉的門檻,解決整庫同步、表結構變更同步等痛點。
致謝
特別感謝來自 Cloudera 公司的 Marton Balassi, Tamas Kiss 貢獻的 Oracle CDC 聯結器,來自 XTransfer 公司的 Jiabao Sun 貢獻的 MongoDB CDC 聯結器。
貢獻者列表:
Gunnar Morling, Jark Wu, Jiabao Sun, Leonard Xu, MartijnVisser, Marton Balassi, Shengkai, Tamas Kiss, Tamas Zseder, Zongwen Li, dongdongking008, frey66, gongzhongqiang, ili zh, jpatel, lsy, luoyuxia, manmao, mincwang, taox, tuple, wangminchao, yangbin09
[1] https://cwiki.apache.org/conf...
[2] https://oracle-base.com/artic...
[3] https://docs.oracle.com/cd/E1...
[4] https://docs.mongodb.com/manu...
Flink Forward Asia 2021 重磅開啟,全球 40+ 多行業一線廠商,80+ 乾貨議題,帶來專屬於開發者的技術盛宴。
https://flink-forward.org.cn/
另有首屆 Flink Forward Asia Hackathon 正式啟動,10W 獎金等你來!
https://www.aliyun.com/page-s...
更多 Flink 相關技術問題,可掃碼加入社群釘釘交流群
第一時間獲取最新技術文章和社群動態,請關注公眾號~