Maxwell 的 CDC,好用不?
來源:安瑞哥是碼農
這段時間一直在探尋,有哪可以方便、快捷、優雅地匯出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資料來源,但是卻可以將其讀取後的資料寫入到多個不同的目標儲存中。
其中常見的有kafka、資料檔案、Redis以及rabbitmq。
但如果想在專案中,支援相對純粹的流式計算,kafka才是我們用得最多的資料輸出(producer)方案。
1. 安裝部署
官方提供了兩種主流的部署方式,一個為 tar.gz 的壓縮包,另一個為docker。
但為了更加方便搞清楚Maxwell的技術實現原理,觀察其中的目錄結構和配置檔案,我決定透過用壓縮包的方式來安裝。
但這裡比較坑爹的地方在於,這個安裝包是放在GitHub上面的,所以如果沒有梯子的話,下載起來會有點費勁。
費老半天勁下載下來後(我下載的最新版),解壓檢視目錄結構長這樣:
結構非常簡單,每個配置檔案我都開啟瞅了一眼,如果你有一定的英文閱讀基礎,你會發現,就光看這幾個配置,以及它給的註釋,跟官網資料上的很多描述都是一樣的。
為了進一步揭開Maxwell的神秘面紗,我們再來看看lib目錄裡都有啥,要知道,像這樣的軟體,它支援什麼樣的功能,以及能跟哪些版本的外部軟進行通訊,其實秘密全都隱藏在這個lib目錄裡。
既然官網說Maxwell只支援讀mysql,但是支援哪個版本,它卻並沒有告訴我們,而這個秘密,我們只能透過lib目錄下的jar包來揭曉。
透過搜尋關鍵詞「mysql」,可以搜尋出如下的jar包:
也就是說,當前版本的Maxwell,應該可以確定支援到mysql8.0.28。
用同樣的辦法來檢視我最關心的kafka版本(因為後續資料寫kafka的場景一定是最多的):
可以看到,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 SELECT, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'maxwell'@'%';
之後,該庫會自動生成這些表(在第一次執行bin/maxwell命令之後):
PS:至於mysql的配置修改部分,因為我用的mysql8,binlog是預設開啟的,其他預設配置也都符合要求,所以理論上不用做任何修改。
2.2 修改 maxwell 配置
從解壓後的 Maxwell 安裝包來看,它的目錄結構非常簡陋,甚至都沒有專門的配置資料夾(比如conf目錄):
如果不指定的話,maxwell程式會預設會讀取圖中框出來的這個檔名,但因為它本不存在,所以需要將那個帶example字尾的配置檔案,給複製一份出來。
而關於這個配置檔案的內容,其實很多地方因為可以在maxwell匯入程式的命令列中指定(比如host、使用者名稱、密碼之類),因此這裡面絕大部分的配置可以不用動。
當然,如果你用來儲存Maxwell後設資料資訊的庫名也是這個的話(預設就是maxwell),其實連這裡都不用改。
至此,maxwell 的準備工作就都做好了,接下來就可以啟動一個匯入任務看看,到底能不能順利讀到mysql的資料。
2.3 有個坑
根據官網的案例,開始啟動一個最簡單的maxwell任務,並將讀取到的mysql資料輸出到控制檯:
一起動,就報出上面的錯,原因很簡單,因為我當前伺服器用的Java8環境,而這個maxwell相關的包都是在Java11環境下編譯的。
解決辦法有兩個:
第一:降低 maxwell 的版本,讓其符合 Java8 環境;
第二:升級當前伺服器環境的JDK到11以上。
為了方便,我選擇了第二種,將伺服器的JDK升級到JDK17,至此,這個問題消失。
2.4 正確的玩法
解決完上面這個問題後,繼續執行那個命令,這回不報錯了:
但是,你會發現這個輸出啥玩意也沒有呢,不像Flink CDC,會主動把當前表中的存量歷史資料給同步出來。
關鍵具體怎麼玩,官方文件我沒有找到直接的提示資訊,那就只能靠摸索,摸著摸著,我就發現了在bin目錄下,有這麼個命令:
憑藉我的經驗,這個命令應該比較重要。
果然,在官網找到了我要的資訊:
也就是說,想要用剛才那個命令讀取某張表的資料,必須要透過這個命令來具體指定。
比如,我現在mysql的test庫裡,有張表test01,有如下資料:
然後,我想要同步這種表,但是光啟動剛在那個同步命令是不夠的,還需要用這個bootstrap命令,來告訴Maxwell來具體同步誰。
於是,需要執行如下這個命令(該命令預設會同步整張錶的歷史資料,如果想透過條件篩選,可以加where子句):
接著,你就能看到剛那個阻塞住的控制檯,輸出如下內容:
已經把test01這張錶的歷史資料全部讀取了出來。
與此同時,對應的Maxwell後設資料表bootstrap,也記錄了當前的狀態資訊:
然後我繼續分別用insert、update、delete操作幾條資料:
得到如下輸出:
可以看到,跟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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- zendesk/maxwell:MySQL的CDC資料更新捕獲者MySql
- 【Maxwell】使用maxwell+kafka+python做binlog增量解析消費KafkaPython
- MaxWell 資料同步
- 大資料技術 - Maxwell大資料
- YDOOK: ANSYS Maxwell 19 教程6:Maxwell 2D 材料管理 材料庫 新增 新增材料
- MySQL Binlog 解析工具 Maxwell 詳解MySql
- Flink CDC 系列 - Flink MongoDB CDC 在 XTransfer 的生產實踐MongoDB
- 中介軟體---Binlog傳輸同步---Maxwell
- Flink MongoDB CDC 在 XTransfer 的生產實踐|Flink CDC 專題MongoDB
- Flink的mysql CDC,好使不?MySql
- FLINK CDC同步
- Flink CDC3.0的介紹
- [Flink/CDC/資料整合] 資料增量整合方案:Flink CDC
- FLINK CDC部署同步
- Flink CDC實戰
- Clickhouse 的 mysql CDC,終於好使了MySql
- Apache Hudi:CDC的黃金搭檔Apache
- Maxwell 磁場模擬場計算後處理
- SQLServer CDC清理規則SQLServer
- SQLServer開啟CDC功能SQLServer
- CDC YAML 在阿里雲的最佳實踐YAML阿里
- Flink CDC 在京東的探索與實踐
- git 不同目錄用不同的配置Git
- Python 引用不確定的函式Python函式
- SQLServer開啟CDC功能(3)SQLServer
- SQLServer開啟CDC功能(2)SQLServer
- CDC linux安裝報錯Linux
- Flink CDC 在易車的應用實踐
- 基於 Flink CDC 的實時同步系統
- Flink CDC 在大健雲倉的實踐
- CDC:麻省疫情74%為突破疫苗屏障的感染
- 我真的用不慣mac!!!!!Mac
- pycharm用不了pipPyCharm
- 物聯網路卡用不了的原因
- GodBlessYou: 讓你的應用不再崩潰Go
- SAP Spartacus 和 CDC 整合的 HTTP 請求明細HTTP
- 實時採集MySQL資料之輕量工具Maxwell實操MySql
- flink-cdc3.0官方網站網站