掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
摘要:本文整理自大健云倉(cāng)基礎(chǔ)架構(gòu)負(fù)責(zé)人、Flink CDC Maintainer 龔中強(qiáng)在 5 月 21 日 Flink CDC Meetup 的演講。主要內(nèi)容包括:

創(chuàng)新互聯(lián)是專業(yè)的吉木乃網(wǎng)站建設(shè)公司,吉木乃接單;提供網(wǎng)站制作、網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行吉木乃網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
公司引入 CDC 技術(shù),主要基于以下四個(gè)角色的需求:
CDC 是數(shù)據(jù)捕獲變更的技術(shù)。廣義上來(lái)說(shuō),但凡能夠捕獲數(shù)據(jù)變更的技術(shù),都能被稱為 CDC。但通常我們說(shuō)的 CDC 技術(shù)主要面向數(shù)據(jù)庫(kù)的變更。
CDC 的實(shí)現(xiàn)方式主要有兩種,分別是基于查詢和基于日志:
正如 Flink 的宣言 “實(shí)時(shí)即未來(lái)”,在如今的大背景下,實(shí)時(shí)性是亟待解決的重要問(wèn)題。因此,我們將主流 CDC 基于日志的技術(shù)做了對(duì)比,如上圖所示:
LDSS 庫(kù)存管理的業(yè)務(wù)場(chǎng)景主要有以下四種:
上圖為 LDSS 庫(kù)存管理分單場(chǎng)景架構(gòu)圖。
首先,通過(guò)多數(shù)據(jù)源同步的應(yīng)用向下拉取倉(cāng)儲(chǔ)系統(tǒng)、平臺(tái)系統(tǒng)以及內(nèi)部 ERP 系統(tǒng)數(shù)據(jù),將所需數(shù)據(jù)抽取到 LDSS 系統(tǒng)的數(shù)據(jù)庫(kù)中,以支撐 LDSS 系統(tǒng)訂單、庫(kù)存、物流三大模塊的業(yè)務(wù)功能。
其次,需要產(chǎn)品信息、訂單信息以及倉(cāng)庫(kù)信息才能進(jìn)行有效的分單決策。多數(shù)據(jù)源定時(shí)同步任務(wù)基于 JDBC 查詢,通過(guò)時(shí)間做篩選,同步變更的數(shù)據(jù)到 LDSS 系統(tǒng)中。LDSS 系統(tǒng)基于這些數(shù)據(jù)做分單決策,以獲得最優(yōu)解。
定時(shí)任務(wù)同步的代碼,首先需要定義定時(shí)任務(wù)、定義定時(shí)任務(wù)的類、執(zhí)行方法以及執(zhí)行間隔。
上圖左側(cè)為定時(shí)任務(wù)的定義,右側(cè)是定時(shí)任務(wù)的邏輯開發(fā)。首先,打開 Oracle 數(shù)據(jù)庫(kù)進(jìn)行查詢,然后 upsert 到 MySQL 數(shù)據(jù)庫(kù),即完成了定時(shí)任務(wù)的開發(fā)。此處以接近原生 JDBC 的查詢方式,將數(shù)據(jù)依次塞到對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中,開發(fā)邏輯十分繁瑣,也容易出現(xiàn) bug。
因此,我們基于 Flink CDC 對(duì)其進(jìn)行了改造。
上圖為基于 Flink CDC 實(shí)現(xiàn)的實(shí)時(shí)同步場(chǎng)景,唯一的變化是將此前的多數(shù)據(jù)源同步應(yīng)用程序換成了 Flink CDC 。
首先,通過(guò) SqlServer CDC、MySQL CDC、Oracle CDC 分別連接抽取對(duì)應(yīng)倉(cāng)儲(chǔ)平臺(tái)、 ERP 系統(tǒng)數(shù)據(jù)庫(kù)的表數(shù)據(jù),然后通過(guò) Flink 提供的 JDBC connector 寫入到 LDSS 系統(tǒng)的 MySQL 數(shù)據(jù)庫(kù)中。能夠通過(guò) SqlServer CDC、MySQL CDC、Oracle CDC 將異構(gòu)數(shù)據(jù)源轉(zhuǎn)化為統(tǒng)一的 Flink 內(nèi)部類型,再往下游寫。
此架構(gòu)相比于之前的架構(gòu),對(duì)業(yè)務(wù)系統(tǒng)沒(méi)有侵入性,而且實(shí)現(xiàn)較為簡(jiǎn)單。
我們引入了 MySQL CDC 和 SqlServer CDC 分別連接 B2B 平臺(tái)的 MySQL 數(shù)據(jù)庫(kù)以及倉(cāng)儲(chǔ)系統(tǒng)的 SqlServer 數(shù)據(jù)庫(kù),然后將抽取到的數(shù)據(jù)通過(guò) JDBC Connector 寫入到 LDSS 系統(tǒng)的 MySQL 數(shù)據(jù)庫(kù)。
通過(guò)以上改造,得益于 Flink CDC 賦予其實(shí)時(shí)的能力,不需要管理繁雜的定時(shí)任務(wù)。
基于 Flink CDC 同步代碼的實(shí)現(xiàn)分為以下三步:
上述開發(fā)模式非常簡(jiǎn)單,邏輯清晰。此外,依托 Flink CDC 的同步任務(wù)和 Flink 架構(gòu),還獲得了失敗重試、分布式、高可用、全量增量一致性切換等特性。
上圖為平臺(tái)架構(gòu)圖。
左側(cè) source 是由 Flink CDC + Flink 提供的源端,能夠通過(guò)豐富的源端抽取數(shù)據(jù),通過(guò)數(shù)據(jù)平臺(tái)上的開發(fā)寫入到目標(biāo)端。目標(biāo)端又依托于 Flink 的強(qiáng)大生態(tài),能夠很好地支撐數(shù)據(jù)湖、關(guān)系型數(shù)據(jù)庫(kù)、MQ 等。
Flink 目前有兩種運(yùn)行方式,一種是國(guó)內(nèi)比較流行的 Flink on Yarn,另一種是 Flink on Kubernets。中間部分的數(shù)據(jù)平臺(tái)向下管理 Flink 集群,以向上支撐 SQL 在線開發(fā)、任務(wù)開發(fā)、血緣管理、任務(wù)提交、在線 Notebook 開發(fā)、權(quán)限和配置以及對(duì)任務(wù)性能的監(jiān)控和告警,同時(shí)也能夠?qū)?shù)據(jù)源做到很好的管理。
數(shù)據(jù)同步的需求在公司內(nèi)部特別旺盛,需要通過(guò)平臺(tái)來(lái)提高開發(fā)效率,加快交付速度。而且平臺(tái)化之后,可以統(tǒng)一公司內(nèi)部的數(shù)據(jù)同步技術(shù),收攏同步技術(shù)棧,減少維護(hù)成本。
平臺(tái)化的目標(biāo)如下:
平臺(tái)化能帶來(lái)以下三個(gè)方面的收益:
有了平臺(tái)之后,即可快速落地應(yīng)用更多的業(yè)務(wù)場(chǎng)景。
有了平臺(tái)的助力,相信 Flink CDC 能夠在公司內(nèi)部更好地釋放它的能力。
上圖展示了 SqlServer CDC 的原理。
社區(qū)同學(xué)使用了當(dāng)前版本的 SqlServer CDC 后,主要反饋的問(wèn)題有以下三個(gè):
我們針對(duì)上述問(wèn)題做了實(shí)踐和改進(jìn),參考社區(qū) 2.0 版本 MySQL CDC 并發(fā)無(wú)鎖算法的思想,對(duì) SqlServer CDC 進(jìn)行了優(yōu)化,最終實(shí)現(xiàn)了快照過(guò)程中無(wú)鎖,實(shí)現(xiàn)一致性快照;快照過(guò)程中支持 checkpoint ;快照過(guò)程中支持并發(fā),加速快照過(guò)程。在大表同步的情況下,并發(fā)優(yōu)勢(shì)尤為明顯。
但是由于 2.2 版本社區(qū)將 MySQL 的并發(fā)無(wú)鎖思想抽象成了統(tǒng)一公共的框架,SqlServer CDC 需要重新適配這套通用框架后才能貢獻(xiàn)給社區(qū)。
Q1需要開啟 SqlServer 自己的 CDC 嗎?
是的,SqlServer CDC 的功能就是基于 SqlServer 數(shù)據(jù)庫(kù)自己的 CDC 特性實(shí)現(xiàn)的。
Q2物化視圖通過(guò)什么方式去刷新定時(shí)任務(wù)觸發(fā)器?
通過(guò) Flink CDC 將需要生成物化視圖的 SQL 放在 Flink 里運(yùn)行,通過(guò)原表的變動(dòng)觸發(fā)計(jì)算,然后同步到物化視圖表里。
Q3平臺(tái)化是怎么做的?
平臺(tái)化參考了社區(qū)眾多的開源項(xiàng)目以及優(yōu)秀的開源平臺(tái),比如 StreamX、DLink 等優(yōu)秀的開源項(xiàng)目。
Q4SqlServer CDC 在消費(fèi) transaction log 時(shí)有瓶頸嗎?
SqlServer 并沒(méi)有直接消費(fèi) log,其原理是 SqlServer capture process 去匹配 log 內(nèi)哪些表開啟了 CDC ,然后將這些表從日志里撈到開啟 CDC 表的變更數(shù)據(jù),再轉(zhuǎn)插到 change table 里,最后通過(guò)開啟 CDC 之后數(shù)據(jù)庫(kù)生成的 CDC query function 獲取到數(shù)據(jù)的變更。
Q5Flink CDC 高可用如何保障同步任務(wù)過(guò)多或密集處理方案?
Flink 的高可用依賴于 Flink 特性比如 checkpoint 等來(lái)保證。同步任務(wù)過(guò)多或處理方案密集的情況,建議使用多套 Flink 下游集群,然后根據(jù)同步的實(shí)時(shí)性區(qū)分對(duì)待,將任務(wù)發(fā)布到相應(yīng)的集群中。
Q6中間需要 Kafka 嗎?
取決于同步任務(wù)或數(shù)倉(cāng)架構(gòu)是否需要將中間數(shù)據(jù)做 Kafka 落地。
Q7一個(gè)數(shù)據(jù)庫(kù)中有多張表,可以放到一個(gè)任務(wù)里運(yùn)行嗎?
取決于開發(fā)方式。如果是 SQL 的開發(fā)方式,要實(shí)現(xiàn)一次性寫多表只能通過(guò)多個(gè)任務(wù)。但 Flink CDC 提供了另外一種比較高階的開發(fā)方式 DataStream ,可以將多表放到一個(gè)任務(wù)里運(yùn)行。
Q8Flink CDC 支持讀取 Oracle 從庫(kù)的日志嗎?
目前還無(wú)法實(shí)現(xiàn)。
Q9通過(guò) CDC 同步后兩個(gè)端的數(shù)據(jù)質(zhì)量如何監(jiān)控,如何比對(duì)?
目前只能通過(guò)定時(shí)抽樣來(lái)做數(shù)據(jù)質(zhì)量的檢查,數(shù)據(jù)質(zhì)量問(wèn)題一直是業(yè)內(nèi)比較棘手的問(wèn)題。
Q10大健云倉(cāng)用的什么調(diào)度系統(tǒng)?系統(tǒng)如何與 Flink CDC 集合?
使用 XXL Job 作為分布式的任務(wù)調(diào)度,CDC 沒(méi)有用到定時(shí)任務(wù)。
Q11如果采集增刪表,SqlServer CDC 需要重啟嗎?
SqlServer CDC 目前不支持動(dòng)態(tài)加表的功能。
Q12同步任務(wù)會(huì)影響系統(tǒng)性能嗎?
基于 CDC 做同步任務(wù)肯定會(huì)影響系統(tǒng)性能,尤其是快照過(guò)程對(duì)數(shù)據(jù)庫(kù)會(huì)有影響,進(jìn)而影響應(yīng)用系統(tǒng)。社區(qū)將來(lái)會(huì)做限流、對(duì)所有 connector 做并發(fā)無(wú)鎖的實(shí)現(xiàn),都是為了擴(kuò)大 CDC 的應(yīng)用場(chǎng)景以及易用性。
Q13全量和增量的 savepoint 怎么處理?
(未通過(guò)并發(fā)無(wú)鎖框架實(shí)現(xiàn)的連接器)全量過(guò)程中不可以觸發(fā) savepoint,增量過(guò)程中如果需要停機(jī)發(fā)布,可通過(guò) savepoint 恢復(fù)任務(wù)。
Q14CDC 同步數(shù)據(jù)到 Kafka ,而 Kafka 里面存的是 Binlog ,如何保存歷史數(shù)據(jù)和實(shí)時(shí)數(shù)據(jù)?
將 CDC 同步的數(shù)據(jù)全部 Sync 到 Kafka,保留的數(shù)據(jù)取決于 Kafka log 的清理策略,可以全部保留。
Q15CDC 會(huì)對(duì) Binlog 的日志操作類型進(jìn)行過(guò)濾嗎?會(huì)影響效率嗎?
即使有過(guò)濾操作,對(duì)性能影響也不大。
Q16CDC 讀 MySQL 初始化快照階段,多個(gè)程序讀不同的表會(huì)有程序報(bào)錯(cuò)無(wú)法獲取鎖表的權(quán)限,這是什么原因?
建議先查看 MySQL CDC 是不是使用老的方式實(shí)現(xiàn),可以嘗試新版本的并發(fā)無(wú)鎖實(shí)現(xiàn)。
Q17MySQL 上億大表全量和增量如何銜接?
建議閱讀雪盡老師在 2.0 的相關(guān)博客,非常簡(jiǎn)單清晰地介紹了并發(fā)無(wú)鎖如何實(shí)現(xiàn)一致性快照,完成全量和增量的切換。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流