摘要:本文整理自阿里云實時計算團(tuán)隊 Apache Flink Committer 和 PMC Member 任慶盛老師在 Apache Asia CommunityOverCode 2024中的分享轧粟。內(nèi)容主要分為以下四個部分:
- 什么是 Flink CDC
- Flink CDC 版本歷程
- Flink CDC 內(nèi)部實現(xiàn)
- 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