Flink CDC:新一代實時數(shù)據(jù)集成框架

摘要:本文整理自阿里云實時計算團(tuán)隊 Apache Flink Committer 和 PMC Member 任慶盛老師在 Apache Asia CommunityOverCode 2024中的分享轧粟。內(nèi)容主要分為以下四個部分:

  1. 什么是 Flink CDC
  2. Flink CDC 版本歷程
  3. Flink CDC 內(nèi)部實現(xiàn)
  4. Flink CDC 社區(qū)與未來規(guī)劃

一莺奸、什么是 Flink CDC

Flink CDC 是一個數(shù)據(jù)集成框架,它基于數(shù)據(jù)庫日志的 CDC(變更數(shù)據(jù)捕獲)技術(shù)實現(xiàn)了統(tǒng)一的增量和全量數(shù)據(jù)讀取。結(jié)合 Flink 出色的管道能力和豐富的上下游生態(tài)系統(tǒng),F(xiàn)link CDC 可以高效地實現(xiàn)海量數(shù)據(jù)的實時集成。

(1)Flink CDC 使用場景

Flink CDC 可以應(yīng)用在多種場景中。比如數(shù)據(jù)同步,可以將上游數(shù)據(jù)庫中的數(shù)據(jù)同步至下游數(shù)據(jù)倉庫延旧、數(shù)據(jù)湖等。用戶還可以借助 Flink CDC source 實現(xiàn)實時物化視圖槽地,結(jié)合下游 Flink 作業(yè)處理邏輯實現(xiàn)更豐富的業(yè)務(wù)場景迁沫。此外用戶還可以使用 Flink CDC 捕獲的變更數(shù)據(jù)基于業(yè)務(wù)邏輯進(jìn)行數(shù)據(jù)分發(fā)。

作為一款數(shù)據(jù)集成框架捌蚊,F(xiàn)link CDC 對接了非常豐富的上下游數(shù)據(jù)庫集畅、數(shù)據(jù)湖倉和消息隊列等外部系統(tǒng),如 MySQL缅糟、PostgreSQL挺智、Kafka、Paimon 等窗宦。

(2)與傳統(tǒng)數(shù)據(jù)集成流水線比較

一個傳統(tǒng)的數(shù)據(jù)集成流水線通常由兩套系統(tǒng)構(gòu)成:全量同步和增量同步赦颇。其中全量同步會使用 DataX、Sqoop 等系統(tǒng)赴涵,增量同步需要使用另外一套系統(tǒng)媒怯,如 Debezium、Canal 等等髓窜。在全量同步完成后扇苞,可能還需要額外的一步合并操作將增量表和全量表進(jìn)行合并,最終得到與上游一致的快照。這種架構(gòu)的組件構(gòu)成較為復(fù)雜杨拐,為系統(tǒng)維護(hù)帶來了很多困難祈餐。

相比于傳統(tǒng)數(shù)據(jù)集成流水線擂啥,F(xiàn)link CDC 提供了全量和增量一體化同步的解決方案哄陶,對于一個同步任務(wù),只需使用一個 Flink 作業(yè)即可將上游的全量數(shù)據(jù)和增量數(shù)據(jù)一致地同步到下游系統(tǒng)哺壶。此外 Flink CDC 使用了增量快照算法屋吨,無需任何額外配置即可實現(xiàn)全量和增量數(shù)據(jù)的無縫切換。

二山宾、Flink CDC 版本歷程

Flink CDC 誕生于 2020 年 7 月至扰,中間經(jīng)過不斷迭代優(yōu)化,發(fā)布了多個大版本资锰。2021 年 8 月敢课,F(xiàn)link CDC 發(fā)布了 2.0 版本,首次為 MySQL CDC source 引入增量快照算法绷杜,實現(xiàn)了全增量同步無縫切換直秆。2022 年 11 月,F(xiàn)link CDC 發(fā)布 2.3 版本鞭盟,將大多數(shù) connector 對接至增量快照框架圾结。2023 年 12 月,F(xiàn)link CDC 推出 3.0 版本齿诉,正式將 Flink CDC 項目升級為實時數(shù)據(jù)集成框架筝野,提供 YAML API,為數(shù)據(jù)同步提供端到端解決方案粤剧。

三歇竟、Flink CDC 內(nèi)部實現(xiàn)

(1)Flink CDC YAML

在 Flink CDC 2.x 的時代,F(xiàn)link CDC 只提供一些 Flink source抵恋,用戶仍然需要自己開發(fā) Flink DataStream 或 SQL 作業(yè)實現(xiàn)數(shù)據(jù)同步邏輯焕议。如果用戶對 Flink 不夠熟悉,經(jīng)常會遇到棘手的數(shù)據(jù)正確性和亂序問題馋记。此外 Flink CDC 2.x 不支持 schema 變更号坡,而 schema 變更是用戶的業(yè)務(wù)系統(tǒng)中很常見而且很重要的場景。通過對用戶使用場景的調(diào)研梯醒,我們發(fā)現(xiàn)絕大多數(shù)使用 Flink CDC 的作業(yè)都是較為簡單的數(shù)據(jù) ETL宽堆。結(jié)合上述問題,我們決定為用戶提供一個全新的框架茸习,設(shè)計一套全新的 API畜隶,專注于數(shù)據(jù)同步場景。

(2)Flink CDC 整體設(shè)計

Flink CDC 基于 Flink runtime 實現(xiàn),因此可以充分復(fù)用 Flink 的資源管理和在不同環(huán)境上部署的能力籽慢。針對各種數(shù)據(jù)集成場景浸遗,F(xiàn)link CDC 深度定制了多種自定義算子,如 schema operator箱亿、router跛锌、transformer 等。為了將不同的算子進(jìn)行協(xié)調(diào)和組合届惋,F(xiàn)link CDC 引入了 composer 組件髓帽,可根據(jù)用戶定義的數(shù)據(jù)同步邏輯構(gòu)建 Flink 作業(yè)。依托于 Flink 豐富的生態(tài)系統(tǒng)脑豹,開發(fā)者只需簡單地封裝即可快速將現(xiàn)有的 Flink connector 對接至 Flink CDC郑藏。此外 Flink 還提供了 CLI,只需一個腳本即可將用戶的 YAML 定義使用 composer 構(gòu)建成 Flink 作業(yè)瘩欺,并提交至指定 Flink 集群必盖。基于以上架構(gòu)俱饿,F(xiàn)link CDC 為數(shù)據(jù)集成用戶提供 schema 變更同步歌粥、整庫同步、分庫分表同步等增強(qiáng)能力稍途。

(3)Flink CDC API

Flink CDC API 使用 YAML 語法定義數(shù)據(jù)同步任務(wù)阁吝,即易于開發(fā)者進(jìn)行手動開發(fā),又可以高效地使用機(jī)器進(jìn)行處理械拍。YAML API 針對數(shù)據(jù)集成場景設(shè)計突勇,用戶只需定義同步數(shù)據(jù)源和數(shù)據(jù)目標(biāo)端即可快速搭建起一個實時同步流水線。此外用戶還可以在 YAML 中定義 routing 和 transformation 實現(xiàn)自定義數(shù)據(jù)分發(fā)和變換坷虑。用戶不再需要熟練掌握 Flink 作業(yè)開發(fā)與內(nèi)部實現(xiàn)甲馋,即可使用 Flink CDC 搭建實時數(shù)據(jù)集成流水線。

Flink CDC 提供的 CLI(flink-cdc.sh)進(jìn)一步簡化了用戶提交 Flink CDC 任務(wù)的流程迄损。用戶只需執(zhí)行一行命令定躏,CDC composer 會將 source、sink芹敌、自定義 CDC runtime 構(gòu)建成 Flink 任務(wù)痊远,創(chuàng)建 Flink JobGraph 后提交至 Flink 集群。

(4)Flink CDC Pipeline 連接器

Flink CDC 定義了自己的數(shù)據(jù)源和目標(biāo)端連接器的接口氏捞,以適配 Flink CDC 內(nèi)部的數(shù)據(jù)結(jié)構(gòu)碧聪。Flink CDC pipeline connector 基于 Flink connector,只需進(jìn)行簡單的數(shù)據(jù)轉(zhuǎn)換封裝液茎,即可快速復(fù)用現(xiàn)有的 Flink connector逞姿,將其對接到 Flink CDC 生態(tài)系統(tǒng)中辞嗡。為了實現(xiàn) schema 變更處理能力,F(xiàn)link CDC 定義了 MetadataAccessor 和 MetadataApplier滞造,分別對源端和目標(biāo)端的 schema 等元信息進(jìn)行獲取和處理续室,實現(xiàn) schema 變更的實時同步。

(5)Flink CDC Source 增量快照算法

為了實現(xiàn)全量和增量的一體化同步谒养,F(xiàn)link CDC source 使用增量快照算法挺狰,既實現(xiàn)了全增量同步的無縫切換,而且采用了無鎖設(shè)計蝴光,避免全量同步時的鎖表動作對上游業(yè)務(wù)的影響她渴。在增量快照算法中达址,數(shù)據(jù)庫的全量數(shù)據(jù)被切分為獨立的數(shù)據(jù)塊(chunk)蔑祟,分發(fā)給 source 的各個并發(fā)進(jìn)行讀取〕吝耄考慮到在全量讀取過程中數(shù)據(jù)還有可能發(fā)生變化疆虚,在開始讀取前,source 將 binlog 的當(dāng)前位點記為低水位線(low watermark)满葛,在全量讀取結(jié)束后再次將 binlog 最新位點記錄為高水位線(high watermark)径簿,隨后讀取高、低水位線之間的變更數(shù)據(jù)嘀韧,將其合并到已讀取的全量數(shù)據(jù)塊中篇亭,從而構(gòu)建一個與上游完全一致的數(shù)據(jù)塊。在完成全部數(shù)據(jù)塊的讀取之后锄贷,source 會根據(jù)記錄的高水位線確定切換位點译蒂,實現(xiàn)全量和增量的無縫切換。

(6)Flink CDC 對 Schema 變更的支持

Flink CDC 通過定制化的 schema operator 以及 schema registry 的協(xié)調(diào)谊却,實現(xiàn)對上游 schema 變更的實時同步柔昼。當(dāng) schema operator 感知到上游發(fā)生 schema 變更后,會將變更信息同步給 schema registry炎辨,并暫停數(shù)據(jù)流的處理捕透。schema registry 首先插入 Flush 事件將下游數(shù)據(jù)全部從 sink 推出,在收到全部 sink 的確認(rèn)后碴萧,通過 MetadataApplier 將 schema 變更應(yīng)用在下游系統(tǒng)中乙嘀,在完成 schema 變更后,schema registry 通知 schema operator破喻,并恢復(fù)數(shù)據(jù)流處理虎谢,完成整個 schema 變更的流程。

(7)Flink CDC 對數(shù)據(jù)分發(fā)處理的支持

Flink CDC 定制了 router 算子低缩,實現(xiàn)對變更數(shù)據(jù)的分發(fā)和合并嘉冒。用戶可以在 YAML 中使用 route 字段修改變更數(shù)據(jù)的目標(biāo)數(shù)據(jù)庫和表名曹货,將數(shù)據(jù)同步至指定目標(biāo)端,同樣也可以通過指定多對一的路由規(guī)則讳推,將多個表合并為目標(biāo)端中的一張表顶籽。

(8)Flink CDC 對數(shù)據(jù)變換的支持

通過在 YAML 中使用 transform 字段,用戶可以在數(shù)據(jù)流上定義投影银觅、過濾礼饱、增加元信息列等數(shù)據(jù)變換操作,調(diào)整數(shù)據(jù)內(nèi)容后同步至下游究驴。transform 使用類 SQL 語法镊绪,既可以讓用戶簡單上手開發(fā),又保留了對更多類型變換支持的可擴(kuò)展性洒忧。

(9)Flink CDC 數(shù)據(jù)結(jié)構(gòu)

Flink CDC 在數(shù)據(jù)流中定義了數(shù)據(jù)和 schema 信息的協(xié)議:

  • 數(shù)據(jù)流以 CreateTableEvent 開始來描述起始 schema

  • 后續(xù)所有的 DataChangeEvent 需要遵循其前方的 schema

  • 當(dāng) schema 發(fā)生變更時蝴韭,需要在數(shù)據(jù)流中發(fā)送一個新的 SchemaChangeEvent 以描述 schema 變化

這種設(shè)計的優(yōu)勢在于實現(xiàn)了數(shù)據(jù)和 schema 的分離,大大降低了數(shù)據(jù)的序列化成本熙侍。此外 Flink CDC 為數(shù)據(jù)變更事件使用了壓縮的二進(jìn)制格式榄鉴,進(jìn)一步提升了性能。

四蛉抓、Flink CDC 社區(qū)與未來規(guī)劃

目前 Flink CDC 已經(jīng)有超過 160 位貢獻(xiàn)者庆尘,項目獲得 5k+ star,1000+ commit巷送。未來 Flink CDC 將著力于擴(kuò)展生態(tài)驶忌,對接至更多的外部系統(tǒng),如 PostgreSQL笑跛、Iceberg 等付魔,并且將支持更多的 schema 變更類型和數(shù)據(jù)類型。另外 Flink CDC 也會持續(xù)提升生產(chǎn)穩(wěn)定性堡牡,包括對異常處理方式進(jìn)行自定義配置抒抬、提升測試覆蓋等等。作為 Apache Flink 的子項目晤柄,F(xiàn)link CDC 使用與 Flink 一致的貢獻(xiàn)流程擦剑。歡迎各位用戶和貢獻(xiàn)者在 Flink 郵件列表中咨詢和討論,使用 Apache JIRA 創(chuàng)建 issue芥颈,在 GitHub 上提交 PR惠勒!

歡迎大家多多關(guān)注 Flink CDC泻骤,從釘釘用戶交流群[1]币励、微信公眾號[2]、Slack 頻道[3]惨险、郵件列表[4]加入 CDC 用戶社區(qū)盾计,以及在 Flink CDC GitHub 倉庫[5]上參與代碼貢獻(xiàn)售担!


[1] “ Flink CDC 社區(qū) ② 群”群的釘釘群號:80655011780

[2] ” Flink CDC 公眾號“的微信號:ApacheFlinkCDC

[3] https://flink.apache.org/what-is-flink/community/#slack

[4] https://flink.apache.org/what-is-flink/community/#mailing-lists

[5] https://github.com/apache/flink-cdc

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赁遗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子族铆,更是在濱河造成了極大的恐慌岩四,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哥攘,死亡現(xiàn)場離奇詭異剖煌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)逝淹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門耕姊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人栅葡,你說我怎么就攤上這事茉兰。” “怎么了妥畏?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵邦邦,是天一觀的道長。 經(jīng)常有香客問我醉蚁,道長,這世上最難降的妖魔是什么鬼店? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任网棍,我火速辦了婚禮,結(jié)果婚禮上妇智,老公的妹妹穿的比我還像新娘滥玷。我一直安慰自己,他們只是感情好巍棱,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布惑畴。 她就那樣靜靜地躺著,像睡著了一般航徙。 火紅的嫁衣襯著肌膚如雪如贷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天到踏,我揣著相機(jī)與錄音杠袱,去河邊找鬼。 笑死窝稿,一個胖子當(dāng)著我的面吹牛楣富,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伴榔,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼纹蝴,長吁一口氣:“原來是場噩夢啊……” “哼庄萎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起塘安,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤惨恭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后耙旦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脱羡,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年免都,在試婚紗的時候發(fā)現(xiàn)自己被綠了锉罐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡绕娘,死狀恐怖脓规,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情险领,我是刑警寧澤侨舆,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站绢陌,受9級特大地震影響挨下,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脐湾,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一臭笆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秤掌,春花似錦愁铺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至孟岛,卻和暖如春瓶竭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚀苛。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工在验, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堵未。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓腋舌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親渗蟹。 傳聞我的和親對象是個殘疾皇子块饺,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容