Doris 的 一鍵 mysql 同步,靠譜不?

大資料技術前線發表於2023-11-22

來源:安瑞哥是碼農

上篇文章寫了 Clickhouse 可以在不透過外部工具幫助的情況下,用建立mysql的外部庫方式,來同步開啟了binlog功能的整個mysql庫下的表,實現真正意義上的CDC(歷史資料+變化資料)同步。


那麼今天這篇文章,就來接著說說,對於Doris這款資料來說,將如何做到對mysql CDC的,官網宣傳的一鍵同步整庫,到底靠不靠譜?



0. Doris 對 mysql 資料匯入的支援


在開始聊Doris對mysql CDC的支援之前,我們先來看看Doris官方文件對mysql的支援有哪些。


開啟官網,透過搜尋關鍵字「mysql」可以得到如下一眾結果:


Doris 的 一鍵 mysql 同步,靠譜不?


從搜尋的結果來看,其中支援mysql CDC的有:


1. MySQL binlog Load:這個除了需要mysql支援binlog功能外,還需要額外借助 cancel 這個工具;


2. MySQL to Doris(生態擴充套件):利用額外開發的指令碼,同步mysql資料到Doris。


對於第1個來說,因為要用到 cancel,所以這算是一個同步mysql資料的“通用”解決方案,根據我的經驗,這個肯定是可行的,但個人認為實現步驟有些麻煩,所以暫時不想做嘗試。


對於第2種,是針對Doris定製的一種mysql資料匯入策略,根據Doris的VP介紹說,這個方案是一個客戶貢獻的,一會我們使用起來看看好使不。


但是,比較有意思的是,Doris官方目前主推同步 mysql 資料的方案,並沒有出現在剛才那個索引推薦裡而是透過Flink Doris Connector來實現對mysql資料的匯入。


那麼今天這篇文章,就來聊聊這兩種可以實現mysql CDC的方案,到底怎麼樣?



1. MySQL to Doris方案


從官方文件的篇幅安排來看,給了這個方案很大一塊描述的內容,看起來好像挺厲害的樣子。


Doris 的 一鍵 mysql 同步,靠譜不?

但是,當我把對應的指令碼下載下來之後,根據文件描述的步驟來操作時,很快就失望了。


文件描述說,可以根據需要,配置你要匯入的mysql源表,以及最終的Doris表。


於是我在 mysql 中分別建立了一個表結構簡單的小表,跟一張表結構稍微複雜一點的大表,然後根據它的要求,一步步執行配置、匯入。


最後,一頓操作猛如虎(各種嘗試之後),發現,就匯入了那張簡單表的表結構,其他啥玩意都沒有。


(整個操作過程略...)


總之,該方案很坑爹,強烈建議把文件結構調整一下,既然不靠譜,就不要佔用這麼大的篇幅,容易誤導像我這種嚴重依賴官方文件的人。



2. Flink CDC 方案趟坑


既然是官方最推薦的,那我們高低得試一試,但是這樣一來呢,就凸顯出一個問題。


那便是,Doris 想要順利、高效地同步 mysql 資料來源,現階段必須得藉助外力,而對比之下,Clickhouse 是完全可以利用它自身的功能,就能實現對mysql表同步的(Clickhouse 的 mysql CDC,終於好使了)。


也就是說,Doris官方推薦的這個資料匯入方案,必須要你提前具備Flink環境(開發和執行都要)


其實透過Flink CDC讀取mysql寫Doris的案例,我之前寫過一篇文章(Flink的mysql CDC,好使不?),描述瞭如何透過將一張具體的mysql目標表,寫入到Doris的過程。


只不過,這個案例當時只能一次同步一張,而且還需要提前在Doris裡建立目標表結構,如果匯入過程再簡單點就最好了。


這不,Doris官方宣稱較新版本(1.4及往後版本)的 flink-doris-connector,可以滿足所謂「一鍵整庫同步」,這樣一來,就只需要指定 mysql 資料來源端的連線方式和庫名,而到Doris端的目標表結構,則會根據這兩個資料庫之間,對應的對映關係主動建立(連庫名都不用自己建)


Doris 的 一鍵 mysql 同步,靠譜不?

摘自Doris官方公眾號


既然都這麼說了,那我們必須得來試一波。


從官方文件的描述來看,用這種匯入方案是相當簡單的:


Doris 的 一鍵 mysql 同步,靠譜不?

可以看到,描述中說,只要你使用這個對應的 connector 包,然後輸入對應的資料庫配置,就能實現對整庫表的匯入了。


但真的有這麼簡單嗎?我表示嚴重懷疑


來,根據我當下的Flink版本(1.15),我從maven中央倉庫下載了 flink-doris-connector-1.15-1.4.0.jar 這個包。


然後根據文件要求,啟動下面的命令:


flink run -t yarn-session -Dyarn.application.id=application_1696747391642_15889\
    -Dexecution.checkpointing.interval=10s \
    -Dparallelism.default=3 \
    -c org.apache.doris.flink.tools.cdc.CdcTools \
    ./flink-doris-connector-1.15-1.4.0.jar \
    mysql-sync-database \
    --database from_mysql8 \
    --mysql-conf hostname=192.168.221.173 \
    --mysql-conf port=3306 \
    --mysql-conf username=xxx \
    --mysql-conf password=xxxxx \
    --mysql-conf database-name=test \
    --sink-conf fenodes=192.168.221.174:8030 \
    --sink-conf username=root \
    --sink-conf password= \
    --sink-conf jdbc-url=jdbc:mysql://192.168.221.174:9030 \
    --sink-conf sink.label-prefix=mysql2doris01 \
    --table-conf replication_num=2 

用的yarn-session執行模式


就是這麼一個簡單的提交命令,卻是引發一「噩夢」的開始(就說沒那麼簡單),接下來遇到的坑,讓我輕微的有點懷疑人生。


2.1 坑一


剛一提交上面這個命令,還沒等我反映過來,就丟擲下面這個異常:


Doris 的 一鍵 mysql 同步,靠譜不?

很明顯,缺包。


一查呢,缺的是 flink-connector-debezium-2.4.0.jar 這個包(至於版本我是怎麼知道,因為之前開發的flink軟體工程中可以查到),於是就給加上吧,加到哪呢?


因為Flink的提交命令不像spark,可以新增依賴包的路徑,這裡就只能暫時放到Flink HOME目錄的lib子目錄中。


再次提交任務,該問題消失。


2.2 坑二


但是很快,另一個問題又來了,又丟擲了下面這個錯:


Doris 的 一鍵 mysql 同步,靠譜不?

再一查呢,又是缺包,缺誰呢?缺 flink-connector-mysql-cdc-2.4.0.jar。


用同樣的辦法,下載之後給加到Flink的lib目錄下,這個問題也消失了。


2.3 坑三


接著,還是缺包:


Doris 的 一鍵 mysql 同步,靠譜不?


缺 mysql-connector-java-8.0.28.jar,補上。


2.4 坑四


還沒完,還是缺:


Doris 的 一鍵 mysql 同步,靠譜不?

這回缺的是 debezium-api-1.9.7.Final.jar,繼續補。


2.5 坑五


這回缺的是 connect-json-3.2.0.jar。


Doris 的 一鍵 mysql 同步,靠譜不?

補!


2.6 坑六


又缺,缺的是 connect-api-3.2.0.jar。


Doris 的 一鍵 mysql 同步,靠譜不?

還補


2.7 坑七


等第7個坑出現的時候,我實在忍不了了,因為這次丟擲的異常,跟第五個坑丟擲來的異常是一毛一樣的。


Doris 的 一鍵 mysql 同步,靠譜不?


也就是說,現在已經不再是缺包導致的問題了,而是引入的jar包太多導致衝突了


這特喵的可咋整?感覺把自己一步步逼到懸崖邊。



3. 正確的玩法


片刻冷靜之後,我轉念一想,咦... 我上次用Flink CDC同步mysql到Doris,不是用的軟體工程開發的嗎?而且期間還解決過jar包衝突問題,最關鍵是,這次同步需要的核心jar包,上次好像已經引入過了耶。


只不過區別在於,之前我用的1.2的版本,現在因為需要同步整庫,要用到1.4版本。


Doris 的 一鍵 mysql 同步,靠譜不?

於是果斷將軟體工程的,該connector的版本升級到1.4.0.


然後將該工程編譯打包,得到一個已經解決過jar包衝突問題,且含各種必要依賴的fat jar。


Doris 的 一鍵 mysql 同步,靠譜不?


這樣一來呢,之前些下載的所有依賴包就都不再需要了,因為這個包已經全部包括在內。


接下來,就將這個fat jar上傳到flink伺服器(客戶端),然後啟動下面的命令:


flink run -t yarn-session -Dyarn.application.id=application_1696747391642_15889\
    -Dexecution.checkpointing.interval=10s \
    -Dparallelism.default=3 \
    -c org.apache.doris.flink.tools.cdc.CdcTools \
    ./flink-coding-1.0-SNAPSHOT-with-dependencies.jar \
    mysql-sync-database \
    --database from_mysql8 \
    --mysql-conf hostname=192.168.221.173 \
    --mysql-conf port=3306 \
    --mysql-conf username=xxx \
    --mysql-conf password=xxxxx \
    --mysql-conf database-name=test \
    --sink-conf fenodes=192.168.221.174:8030 \
    --sink-conf username=root \
    --sink-conf password= \
    --sink-conf jdbc-url=jdbc:mysql://192.168.221.174:9030 \
    --sink-conf sink.label-prefix=mysql2doris01 \
    --table-conf replication_num=2 


關於這個命令中的一些引數,詳情去參考官方文件,說的很清楚,這裡就不贅述了。


這一次的執行,就變得非常絲滑,沒有任何異常丟擲來。


Doris 的 一鍵 mysql 同步,靠譜不?

最後可以看到,mysql test庫中的6張表全部同步過來了,其中的資料量也是一條不差:


Doris 的 一鍵 mysql 同步,靠譜不?

從mysql的test庫同步過來的所有表


後續透過分別操作mysql源表的新增,修改,刪除之後,Doris表都可以實時捕捉到變化。


(同樣,篇幅原因,這裡不展示,具體的下次直播給大家看)


這一次,終於靠譜了。



總結


從以上的實踐論證來看,透過利用開發環境的IDE,整合Flink CDC必要的依賴(flink-doris-connector-1.4.0),然後將其build成一個fat jar.


之後,再根據官方文件給出的flink提交命令,指定相應的mysql,以及Doris配置,才能完成所謂的mysql「整庫一鍵同步」。


而如果你只是簡單的直接根據官網給出的示例來操作,肯定是搞不定的


要不怎麼說,凡事要自己動手實踐呢,你如果完全輕信文件的說明,而不加以思考,會很容易被帶溝裡。


另外,如果要跟 Clickhouse 做個對比的話(上篇文章內容),在能夠滿足相同功能的同時,CK的實現顯然要更簡單一些。


至於Doris跟CK各自提供的 mysql CDC功能的穩定性如何,我們還需要透過時間來驗證。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027827/viewspace-2996452/,如需轉載,請註明出處,否則將追究法律責任。

相關文章