Flink CDC 2.4 正式發(fā)布,新增 Vitess 數(shù)據(jù)源,更多連接器支持增量快...
01
Flink CDC 簡介
Flink CDC ? [1] ?是基于數(shù)據(jù)庫的日志 CDC 技術(shù),實現(xiàn)了全增量一體化讀取的數(shù)據(jù)集成框架。配合 Flink 優(yōu)秀的管道能力和豐富的上下游生態(tài),F(xiàn)link CDC 可以高效實現(xiàn)海量數(shù)據(jù)的實時集成。

作為新一代的實時數(shù)據(jù)集成框架,F(xiàn)link CDC 具有全增量一體化、無鎖讀取、并行讀取、表結(jié)構(gòu)變更自動同步、分布式架構(gòu)等技術(shù)優(yōu)勢,同時社區(qū)提供了完善的中英文文檔支持 ? [2] 。在 Flink CDC 開源的三年時間里,社區(qū)發(fā)展迅速,目前 Flink CDC 社區(qū)已有 91 位貢獻者,7 位 Maintainer 成員,社區(qū)釘釘群(群號: 33121212) 超過 8900 人。
02
Flink CDC 2.4 概覽
在社區(qū)用戶和開發(fā)者們的共同努力下, Flink CDC 2.4 在端午假期后正式發(fā)布了:
https://github.com/ververica/flink-cdc-connectors/releases/tag/release-2.4.0

2.4 版本共有 32 位社區(qū)貢獻者參與貢獻,計解決 141 個 issue,合并了 86 個PR,貢獻了 96 個 commits。從代碼分布上看,MySQL CDC, MongoDB CDC, PostgreSQL CDC,增量快照框架(flink-cdc-base)模塊以及文檔模塊均為用戶帶來了很多特性和改進。
本文通過下圖帶你 10 分鐘快速了解 Flink CDC 2.4 版本的重大改進和核心特性。

-
新增 Vitess CDC 連接器,支持 Vitess 增量數(shù)據(jù)同步。
-
PostgreSQL CDC,SQL Server CDC 兩大連接器均接入了增量快照框架,從而提供了無鎖讀取,并發(fā)讀取和斷點續(xù)傳的能力。
-
2.4 版本升級 Debezium 的依賴版本到 1.9.7.Final,引入了 Debezium 新版本的功能,優(yōu)化和修復(fù),比如:修復(fù)部分 DDL 無法解析的問題,修復(fù)解析 MySQL JSON 函數(shù)問題,Oracle 事件增加 scn 信息等。
-
增量快照框架在 2.4 版本增加了自動關(guān)閉全量階段結(jié)束后的空閑 Reader 功能,該功能非常實用,可以在生產(chǎn)環(huán)境節(jié)省資源。
-
MySQL CDC 連接器在 2.4 版本支持讀取無主鍵表,同時支持新增表時原有實時同步鏈路不斷流。
-
社區(qū) 2.4 版本兼容 Flink 1.13 ~ 1.17 五個 Flink 版本。CDC 的 SQL Connector 可以跑在不同的 Flink 集群上而無需任何修改,實現(xiàn)跨版本兼容。如果是 Datastream 作業(yè),則需要根據(jù)不同的 Flink 版本引入不同版本的 flink-shaded-guava 依賴,DataStream 用戶可以參考 SQL Connector 的打包方式管理正確的依賴。
-
MongoDB CDC 支持指定時間戳消費數(shù)據(jù),支持 mongodb + srv 連接協(xié)議,并修復(fù)了若干問題,如:無法解析帶連字符的庫名,'poll.await.time.ms' 配置未生效,解析 DDL出現(xiàn)空指針等。
-
OceanBase CDC 連接器支持 JDBC 參數(shù)設(shè)置,支持指定 Oracle 驅(qū)動,完善對 Oracle 數(shù)據(jù)類型的支持。
03
詳解核心特性和重要改進
3.1 深入解讀
Flink CDC 2.4 版本帶來了很多重要的改進和特性,本文挑選最重要的五個進行進一步解讀。

-
新增 Vitess CDC 連接器
Vitess ? [3] ?是一個用于部署,擴展和管理大型 MySQL 實例集群的數(shù)據(jù)庫解決方案。Vitess 的 VStream 是一個變更事件訂閱服務(wù),它能夠提供與來自 Vitess 集群底層 MySQL 分片的二進制日志相同的信息。下游可以訂閱一個 keyspace 的多個分片,很方便的實現(xiàn) Vitess 的下游 CDC 處理工具。Vitess CDC 連接器利用 VStream 獲取數(shù)據(jù)變更消息并發(fā)送,目前只支持讀取增量階段的變更同步,相當(dāng)于僅支持 latest 的啟動模式。
Vitess CDC 連接器的支持背后還有個小故事,該 Connector 是來自 Vinted 的 Simonas Gelazevicius 開發(fā),秉持 upstream first 的開源貢獻精神,這位貢獻者從 2.0 版本就請求社區(qū)合并。但是這個數(shù)據(jù)源國內(nèi)用戶非常少,各個Maintainer 都不熟悉其技術(shù)細節(jié),所以一直沒能合并到社區(qū)主干分支。Simonas Gelazevicius 在 Flink CDC 社區(qū)每發(fā)布一個版本后都會主動 rebase PR, 這股堅持打動了社區(qū)全體 Maintainer 成員,社區(qū) Maintainer 任慶盛和方盛凱主動學(xué)習(xí) Vitess 相關(guān)技術(shù),幫助 review 并改進 PR。最終該連接器由貢獻者Simonas Gelazevicius, Gintarasm ,方盛凱和任慶盛共同完成。
-
PostgreSQL CDC 和 SQL Server CDC連接器接入增量快照框架
2.4 版本中,PostgreSQL CDC 連接器和 SQL Server CDC 連接器都對接到了 Flink CDC 增量快照框架上,實現(xiàn)了增量快照算法,從而提供無鎖讀取,并行讀取和斷點續(xù)傳的功能。

-
PostgreSQL CDC 連接器支持增量快照原理
PostgreSQL CDC 連接器需要結(jié)合 logical decoding?[4]?功能讀取 PostgreSQL 事務(wù)日志中的變更數(shù)據(jù),這需要啟動一個在整個集群中唯一的 Replication Slot,并在 output plugin?[5]?的幫助下處理這些變更,通過記錄讀取到的 WAL 位點來實現(xiàn)增量階段的切換和故障恢復(fù)。
增量快照框架除了在增量階段需要讀取變更數(shù)據(jù),在全量階段對每個 SnapshotSplit 也需要啟動 Backfill Task 同步做快照時發(fā)生的變更。為了避免 Replication Slot 出現(xiàn)沖突,PostgreSQL CDC 連接器采用以下方法建立 Slot。首先 ‘slot.name’ 配置項為必填,需要用戶指定,這里指定的 slot name 會用在增量階段啟動的 Slot,并且這個 Slot 在作業(yè)啟動時就會創(chuàng)建,在作業(yè)停止后也不會刪除,以此來保證增量階段讀到啟動后完整的變更數(shù)據(jù),并可以從 Checkpoint 重啟。對于全量階段每個 Backfill Task 的 Slot,會使用“slotname_subTaskId”的命名風(fēng)格,為了避免沖突和浪費 Slot 資源,這些 Slot 將會在全量讀取停止后刪除。
-
SQL Server CDC連接器支持增量快照原理
SQL Server CDC 連接器通過變更數(shù)據(jù)捕獲功能 ? [6] ?讀取指定數(shù)據(jù)庫和表的變更數(shù)據(jù),并存到專門建立的 change table 中。這需要對指定的數(shù)據(jù)庫和表開啟 CDC 功能,來獲取行級別的變更。通過記錄數(shù)據(jù)庫日志的 LSN (Log Sequence Number),來實現(xiàn)增量階段的切換和故障恢復(fù)。
至此,F(xiàn)link CDC 支持增量快照算法的數(shù)據(jù)源不斷擴大,在接下來的版本中,社區(qū)也在規(guī)劃讓更多的連接器對接到增量快照框架上。
-
增量快照框架支持自動釋放資源
Flink CDC 的增量快照框架有兩個主要階段:全量階段和增量階段。這兩個階段的并行度并不相同,全量階段支持多并行度,加快大量數(shù)據(jù)的同步過程,增量階段讀取變更日志,需要使用單并發(fā)保證事件的順序和正確性。在全量階段讀取結(jié)束后,由于增量階段只需要一個并發(fā),會出現(xiàn)大量的空閑 Reader,比較浪費資源。2.4 版本使用增量快照連接器時,支持配置打開自動關(guān)閉空閑 Reader 的功能來關(guān)閉這些空閑 Reader。由于這個功能依賴于 Flink 1.14 之后支持的 Checkpoint on finished Task 特性,所以只支持在 Flink 1.14 或更新的 Flink 版本上使用。
-
MySQL CDC 連接器功能更新
作為社區(qū)最受用戶關(guān)注的 MySQL CDC 連接器,2.4 版本中社區(qū)引入了一些高級特性,具體包括:
????1.?支持無主鍵表
??? MySQL CDC 連接器 2.4 版本支持使用無主鍵表,相比于有有主鍵的 MySQL 表,無主鍵表存在一些使用上需要額外注意的事項。無主鍵表使用時需要通過 ‘scan.incremental.snapshot.chunk.key-column’ 配置指定一列作為分片列,用于將表分為多個分片進行同步,建議選擇有索引的列作為分片列,使用無索引的列將會導(dǎo)致全量階段多并發(fā)同步時使用表鎖。其次,選擇的分片列需要保證不存在數(shù)據(jù)的更新操作(比如從 1 更新到 2),如果存在更新操作,則只能保證 At-Least-Once 語義。
????2. 支持新增表實時不斷流
??? MySQL CDC 之前在處理新增表時,原有的實時同步鏈路會發(fā)生斷流現(xiàn)象,需要等待新增加表的全量讀取結(jié)束后,才會繼續(xù)進行同步,會對延遲敏感的用戶造成較大影響。例如,新增加的表歷史數(shù)據(jù)比較多,完成新增表的全量同步需要花費 30 分鐘,那么對于已經(jīng)處于增量階段的表,將需要等待 30 分鐘后才可以繼續(xù)同步屬于該表的增量數(shù)據(jù)。2.4 版本對新增表的處理邏輯進行進一步優(yōu)化,確保新增加的表的全量階段不會影響已有的實時同步鏈路,極大地提升了用戶體驗。
????3. 問題修復(fù)
??? 2.4 版本中,MySQL CDC 連接器對社區(qū)用戶反饋的使用問題進行了修復(fù),如指定 Binlog 位點消費無法從 savepoint 啟動,數(shù)據(jù)庫存在特殊字符無法處理,大小寫敏感導(dǎo)致的分片錯誤問題等。
3.2 其他改進
-
Debezium 版本依賴升級到 1.9.7.Final 版本,引入對應(yīng) Debezium 版本的新功能和修復(fù)。
-
Flink CDC 2.4 版本兼容了 Flink 1.13 ~ 1.17 五個大版本,極大地降低用戶 Connector 的升級和運維成本。
-
OceanBase CDC 連接器支持 JDBC 參數(shù)設(shè)置,支持指定驅(qū)動,完善對 Oracle 數(shù)據(jù)類型的支持,同時修復(fù)了異常重連總是失敗等問題。
-
MongoDB CDC 支持指定時間戳消費數(shù)據(jù),支持 mongodb + srv 連接協(xié)議,并修復(fù)如無法解析帶連字符的庫名,'poll.await.time.ms' 配置未生效,解析 DDL 出現(xiàn)空指針等問題。
-
Oracle CDC 修復(fù)了全量階段存在的數(shù)據(jù)正確性問題。
-
所有 CDC 連接器支持打印配置信息,便于排查問題。
04
未來規(guī)劃
Flink CDC 開源社區(qū)的發(fā)展,得益于全體貢獻者的無私貢獻和 Maintainer 成員出色的社區(qū)工作,更離不開廣大 Flink CDC 用戶群體的積極使用和反饋報錯。Flink CDC 社區(qū)將會堅持做好開源社區(qū)的建設(shè), 當(dāng)前社區(qū)正在規(guī)劃 2.5 版本 [7], 歡迎貢獻者和用戶積極反饋,在接下來的版本,社區(qū)主要方向會圍繞下述四個方面展開:
-
豐富數(shù)據(jù)源
支持更多的數(shù)據(jù)源,并推動增量快照框架在各個 CDC 連接器的使用,讓更多的數(shù)據(jù)源支持無鎖讀取、并發(fā)讀取、斷點續(xù)傳等特性。
-
優(yōu)化增量快照框架
對增量快照框架接入中遇到的問題進行優(yōu)化,各個 CDC 連接器在增量快照框架可重用的代碼進行提取整理。
-
完善限流與監(jiān)控
提供限流功能,以降低全量階段對數(shù)據(jù)庫產(chǎn)生的查詢壓力。提供更豐富的監(jiān)控指標,可以獲取到任務(wù)進度相關(guān)指標監(jiān)控任務(wù)狀態(tài)。
-
更豐富的使用方式
支持 At least once 語義,支持 Snapshot only 的啟動模式等,可以為使用者提供更多的場景應(yīng)用。
-
收斂支持的 Flink 版本
隨著 Flink 版本逐漸增多,CDC 為兼容多個Flink版本的維護壓力也逐漸增加。參考目前 Flink 連接器的規(guī)則 [8],在后續(xù)版本中,CDC 連接器將會考慮僅支持 Flink 最新的 3-4 個版本。
致謝
感謝社區(qū)的 Maintainer 成員阮航, 徐榜江,孫家寶,龔中強,任慶盛為該版本所做的社區(qū)和發(fā)版工作。感謝所有為該版本做出突出貢獻的 Tigran Manasyan,川粉,Xiao Meng,Yaroslav Tkachenko, Simonas Gelazevicius, gintarasm 等 32 位社區(qū)貢獻者。
貢獻者列表 (按字母排序)
Hang Ruan,He Wang,JasonLee,Jiabao Sun,Jingsong Lee,Xiao Meng,Leonard Xu,Qingsheng Ren,Robert Metzger,Sergey Nuyanzin,Simonas Gelazevicius,Yaroslav Tkachenko,Tigran Manasyan,Tyrantlucifer,ZhongLinLeo,bb chen,ehui,emhui,gintarasm,gongzhongqiang,liangyaohui97,lin.zl,molsionmo,skylines,tison,wallkop,wangxiaojing,wuzhenhua,xixingya,zhaomin,zhuyuan03,含風(fēng)
附錄
[1] https://github.com/ververica/flink-cdc-connectors
[2] https://ververica.github.io/flink-cdc-connectors
[3] https://vitess.io/
[4] https://www.postgresql.org/docs/current/logicaldecoding-explanation.html
[5] https://www.postgresql.org/docs/current/logicaldecoding-output-plugin.html
[6] https://learn.microsoft.com/en-us/sql/relational-databases/track-changes/about-change-data-capture-sql-server?view=sql-server-2017
[7] https://github.com/ververica/flink-cdc-connectors/issues/2239
[8]? https://cwiki.apache.org/confluence/display/FLINK/Externalized+Connector+development#ExternalizedConnectordevelopment-Flinkcompatibility
數(shù)據(jù)倉庫系列文章(持續(xù)更新)
- 數(shù)倉架構(gòu)發(fā)展史
- 數(shù)倉建模方法論
- 數(shù)倉建模分層理論
- 數(shù)倉建模—寬表的設(shè)計
- 數(shù)倉建?!笜梭w系
- 數(shù)據(jù)倉庫之拉鏈表
- 數(shù)倉—數(shù)據(jù)集成
- 數(shù)倉—數(shù)據(jù)集市
- 數(shù)倉—商業(yè)智能系統(tǒng)
- 數(shù)倉—埋點設(shè)計與管理
- 數(shù)倉—ID Mapping
- 數(shù)倉—OneID
關(guān)注我,不迷路
