Maxwell 的 CDC,好用不?

張哥說技術發表於2023-11-16

來源:安瑞哥是碼農

這段時間一直在探尋,有哪可以方便、快捷、優雅地匯出mysql,或者相關的常用SQL資料庫資料的手段和方法。


從最近調研和測試的幾篇文章中可以看出來,我已經測試過以下這些資料匯入手段:


1. 資料庫的外部表+物化檢視:當時測試物件是從mysql導資料到Clickhouse,經驗證,不靠譜;


2. DataX:能滿足讀取需要,但是預設只能讀取mysql全量的歷史資料,想要讀取增量資料,必須要根據欄位進行條件篩選,以批處理方式多次啟動來滿足,使用會相對比較麻煩;


3. Flink CDC:目前為止,最省事的mysql資料匯入方案(前提是已經具備Flink開發環境),能很好的滿足歷史資料+增量(變化)資料的捕獲,缺點就是支援的資料庫種類還不夠多,且對版本都有要求;


4. Spark JDBC 和 Flink JDBC:跟DataX的資料讀取原理一樣,更適合一次性讀取歷史全量資料,且都只能以「批處理」方式來進行,對於增量(變化)資料的獲取,有很大的侷限性(也是隻能透過欄位條件篩選)。


而今天呢,我在 flink 的官網裡,偶然看到了 Maxwell ,說可以作為一種CDC 的資料格式被 Flink 識別和處理。


於是就想著,咦... 這個工具我好像還沒用過,之前只是聽說,要不今天就給大家測試一下看看,對比上面使用過的同步方案,Maxwell 這個貨到底用起來怎麼樣?


(PS:用完一圈後發現,Maxwell這個小東西想玩好,沒有想象的那麼容易。)



0. 看官網


可能確實因為功能相對比較簡單,所以Maxwell的官方文件跟Flink,Spark這樣的大元件相比,就顯得簡潔很多。


從官網的描述來看,Maxwell是一款專門針對mysql變化資料捕獲的CDC工具,因為能識別和捕獲的資料來源單一,所以就註定了它只是一款相對小眾、精緻的資料傳輸工具。


雖然Maxwell只能讀取mysql資料來源,但是卻可以將其讀取後的資料寫入到多個不同的目標儲存中。


Maxwell 的 CDC,好用不?

其中常見的有kafka、資料檔案、Redis以及rabbitmq。


但如果想在專案中,支援相對純粹的流式計算,kafka才是我們用最多的資料輸出(producer)方案。



1.  安裝部署


官方提供了兩種主流的部署方式,一個為 tar.gz 的壓縮包,另一個為docker。


但為了更加方便搞清楚Maxwell的技術實現原理,觀察其中的目錄結構和配置檔案,我決定透過用壓縮包的方式來安裝。


Maxwell 的 CDC,好用不?

但這裡比較坑爹的地方在於,這個安裝包是放在GitHub上面的,所以如果沒有梯子的話,下載起來會有點費勁。


費老半天勁下載下來後(我下載的最新版),解壓檢視目錄結構長這樣:


Maxwell 的 CDC,好用不?

結構非常簡單,每個配置檔案我都開啟瞅了一眼,如果你有一定的英文閱讀基礎,你會發現,就光看這幾個配置,以及它給的註釋,跟官網資料上的很多描述都是一樣的。


為了進一步揭開Maxwell的神秘面紗,我們再來看看lib目錄裡都有啥,要知道,像這樣的軟體,它支援什麼樣的功能,以及能跟哪些版本的外部軟進行通訊,其實秘密全都隱藏在這個lib目錄裡


既然官網說Maxwell只支援讀mysql,但是支援哪個版本,它卻並沒有告訴我們,而這個秘密,我們只能透過lib目錄下的jar包來揭曉。


透過搜尋關鍵詞「mysql」,可以搜尋出如下的jar包:


Maxwell 的 CDC,好用不?


也就是說,當前版本的Maxwell,應該可以確定支援到mysql8.0.28。


用同樣的辦法來檢視我最關心的kafka版本(因為後續資料寫kafka的場景一定是最多的):


Maxwell 的 CDC,好用不?

可以看到,kafka支援的版本就多了,從低版本的0.8開始,一直到最新的3.4,幾乎全線覆蓋。



2. 開始使用


根據官網的案例,或者解壓後安裝包裡面的README檔案,裡面有比較詳細的步驟來告訴你如何操作。


2.1 建立maxwell專有庫


這裡需要先建立一個專門的庫名,然後maxwell匯入程式在啟動時,會在這個庫下建立一些表,來儲存maxwell在導資料時候,需要儲存的一些必要資訊,比如已經匯入了哪些表,匯入binlog的offset等等,目的是用來記錄maxwell的資料匯入狀態。


注意:官網對這塊的描述(或者說解釋)是缺失的,很容易讓第一次部署的人懵逼,還以為這個庫就是mysql已經存在的,需要被導資料的目標庫,容易讓人誤解。


所以嚴格來說,步驟應該如下:


create database maxwell;
CREATE USER 'maxwell'@'%' IDENTIFIED BY 'XXXXXX';
GRANT ALL ON maxwell.* TO 'maxwell'@'%';
GRANT SELECTREPLICATION CLIENTREPLICATION SLAVE ON *.* TO 'maxwell'@'%';

之後,該庫會自動生成這些表(在第一次執行bin/maxwell命令之後):


Maxwell 的 CDC,好用不?



PS:至於mysql的配置修改部分,因為我用的mysql8,binlog是預設開啟的,其他預設配置也都符合要求,所以理論上不用做任何修改。



2.2 修改 maxwell 配置


從解壓後的 Maxwell 安裝包來看,它的目錄結構非常簡陋,甚至都沒有專門的配置資料夾(比如conf目錄):


Maxwell 的 CDC,好用不?

如果不指定的話,maxwell程式會預設會讀取圖中框出來的這個檔名,但因為它本不存在,所以需要將那個帶example字尾的配置檔案,給複製一份出來。


而關於這個配置檔案的內容,其實很多地方因為可以在maxwell匯入程式的命令列中指定(比如host、使用者名稱、密碼之類),因此這裡面絕大部分的配置可以不用動。


Maxwell 的 CDC,好用不?

當然,如果你用來儲存Maxwell後設資料資訊的庫名也是這個的話(預設就是maxwell),其實連這裡都不用改。


至此,maxwell 的準備工作就都做好了,接下來可以啟動一個匯入任務看看到底能不能順利讀到mysql的資料。


2.3 有個坑


根據官網的案例,開始啟動一個最簡單的maxwell任務,並將讀取到的mysql資料輸出到控制檯:


Maxwell 的 CDC,好用不?


一起動,就報出上面的錯,原因很簡單,因為我當前伺服器用的Java8環境,而這個maxwell相關的包都是在Java11環境下編譯的。


解決辦法有兩個:


第一:降低 maxwell 的版本,讓其符合 Java8 環境;


第二:升級當前伺服器環境的JDK到11以上。


為了方便,我選擇了第二種,將伺服器的JDK升級到JDK17,至此,這個問題消失。


2.4 正確的玩法


解決完上面這個問題後,繼續執行那個命令,這回不報錯了:


Maxwell 的 CDC,好用不?

但是,你會發現這個輸出啥玩意也沒有呢,不像Flink CDC,會主動把當前表中的存量歷史資料給同步出來。


關鍵具體怎麼玩,官方文件我沒有找到直接的提示資訊,那就只能靠摸索,摸著摸著,我就發現了在bin目錄下,有這麼個命令:


Maxwell 的 CDC,好用不?

憑藉我的經驗,這個命令應該比較重要。


果然,在官網找到了我要的資訊:


Maxwell 的 CDC,好用不?

也就是說,想要用剛才那個命令讀取某張表的資料,必須要透過這個命令來具體指定。


比如,我現在mysql的test庫裡,有張表test01,有如下資料:


Maxwell 的 CDC,好用不?

然後,我想要同步這種表,但是光啟動剛在那個同步命令是不夠的,還需要用這個bootstrap命令,來告訴Maxwell來具體同步誰。


於是,需要執行如下這個命令(該命令預設會同步整張錶的歷史資料,如果想透過條件篩選,可以加where子句):


Maxwell 的 CDC,好用不?


接著,你就能看到剛那個阻塞住的控制檯,輸出如下內容:


Maxwell 的 CDC,好用不?

已經把test01這張錶的歷史資料全部讀取了出來。


與此同時,對應的Maxwell後設資料表bootstrap,也記錄了當前的狀態資訊:


Maxwell 的 CDC,好用不?

然後我繼續分別用insert、update、delete操作幾條資料:


Maxwell 的 CDC,好用不?

得到如下輸出:


Maxwell 的 CDC,好用不?

可以看到,跟Flink CDC不一樣的是,Maxwell沒有對delete的資料做對應的輸出,只記錄了insert和update


此外,如果你現在停掉當前 Maxwell 的程式,然後再次啟動,程式是不會讀取歷史資料的,只會捕獲新增和變化的資料,不像Flink CDC 必須透過savepoint恢復才能做到。


隨後,我也嘗試了將 producer 從stdout改為kafka,也能順利寫入(沒有坑,好評),畢竟它支援的 kafka 版本還挺多的。



最後


經過這麼一番對 Maxwell 的調研和使用,基本上把它的核心功能摸了個八九不離十。


要說優點呢:軟體本身比較小巧,不需要啟動額外服務,使用起來也比較簡單,透過啟動一個阻塞式的命令就可以同步資料


缺點呢:對JDK版本要求較高,且只能讀取mysql資料來源,輸出端(producer)也支援的不夠豐富,官方文件過於簡潔,缺少一些必要的解釋資訊,有的地方會讓初次閱讀的人不明所以,容易懵逼


至於它的使用場景:如果說你當前環境沒有Flink,但有kafka,且同時又想能以流的方式獲取mysql資料來源的增量資料(mysql要支援binlog),那麼Maxwell是適合的


總之對它的評價是:小巧、小眾、使用體驗勉強湊合的一款資料同步工具。


對於Maxwell,你怎麼看?

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

相關文章