Clickhouse 的 mysql CDC,終於好使了

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

來源:安瑞哥是碼農

前幾篇文章都是圍繞用計算引擎(Spark跟Flink),或者額外的資料匯入工具(DataX和Maxwell)來如何讀取mysql的測試和驗證。


心想,此外還有沒有一些常用,或者好用的導mysql資料的辦法呢,於是就想到了Doris以及Clickhouse(以下稱CK)這兩款大家比較常用資料庫的外部表方式。


不知道細心的你有沒有發現,用CK的 mysql 外部表對其資料匯入的嘗試,其實在之前的文章中我已經寫過了,只不過當時我用的是一個低版本的mysql(5.5)。


可能是因為不能順利開啟它的binlog功能,導致當時嘗試用mysql外部表 + 物化檢視的方式,是沒有辦法匯入其中的增量資料的(全量資料可以)。


那麼這次,透過升級mysql的版本到8.0之後,我們再來看看之前在CK身上的那套玩法是否能奏效,至於Doris如何匯入MySQL的增量資料(不依賴外部工具情況下),由於文章篇幅原因,我們下篇再詳細展開說。



0. 準備工作


首先準備一個支援binlog功能的mysql資料庫,這裡下載了較新版本的mysql(8.0.25),預設開啟binlog功能。


建立對應的資料來源表:


CREATE TABLE `test02` (
  `client_ip` varchar(50NOT NULL,
  `domain` varchar(100NOT NULL,
  `time` varchar(20NOT NULL,
  `target_ip` varchar(50NOT NULL,
  `rcode` int NOT NULL,
  `query_type` int NOT NULL,
  `authority_record` text,
  `add_msg` text,
  `dns_ip` varchar(50DEFAULT NULL,
  PRIMARY KEY (`client_ip`,`domain`,`time`,`target_ip`,`rcode`,`query_type`)

 然後往這張表裡灌了一百多萬的資料量:


Clickhouse 的 mysql CDC,終於好使了

接下來,我們就重點對這張表的存量資料以及增量資料進行匯入測試,看看針對高版本的mysql,CK自身所提供的外部表功能,能否勝任對它的CDC操作。



1 CK的mysql外部表


對於CK來說,官方文件提供了專門的mysql外部表功能:


Clickhouse 的 mysql CDC,終於好使了

根據文件步驟,既然mysql的目標表已經有了,那麼接下來,就是在CK這裡建立一張它的對映表,欄位型別儘量保持一致(其實沒有變)


CREATE TABLE mysql_table01
(
    `client_ip` varchar(50NOT NULL,
    `domain` varchar(100NOT NULL,
    `time` varchar(20NOT NULL,
    `target_ip` varchar(50NOT NULL,
    `rcode` int NOT NULL,
    `query_type` int NOT NULL,
    `authority_record` text,
    `add_msg` text,
    `dns_ip` varchar(50DEFAULT NULL
)
ENGINE = MySQL('192.168.221.173''test''test02''xxx''xxxx')

建好後,在CK上做個簡單的查詢:


Clickhouse 的 mysql CDC,終於好使了

可以看到,有資料出現,證明對映關係沒有問題。


接下來,開始建立一個CK的物化檢視,把這個對映表的資料(mysql資料),從mysql真正的給匯入到CK本地表中。


CREATE MATERIALIZED VIEW mysql2ck_view01
(
    `client_ip` varchar(50NOT NULL,
    `domain` varchar(100NOT NULL,
    `time` varchar(20NOT NULL,
    `target_ip` varchar(50NOT NULL,
    `rcode` int NOT NULL,
    `query_type` int NOT NULL,
    `authority_record` text,
    `add_msg` text,
    `dns_ip` varchar(50DEFAULT NULL
)
ENGINE = MergeTree
ORDER BY client_ip POPULATE AS
SELECT *
FROM mysql_table01

注意,我這裡建立時,用到了關鍵字 POPULATE 意思是我需要匯入mysql這張表的所有歷史資料。


在建立這個表的過程中,資料其實已經開始在向CK的本地表寫入了,看一眼歷史資料的匯入效果:


Clickhouse 的 mysql CDC,終於好使了

發現,這個匯入的資料量跟開始檢視的mysql表保持一致,代表所有全量歷史資料匯入成功。


那麼接下來,才是激動人心的時刻,當我往mysql資料來源表再次插入(新增)資料,看看這邊的物化檢視能否捕捉到呢?


上次用mysql5.5是沒有成功的現在換成了mysql8,就看它給不給這個面子吧。


我往mysql的源表test02連續新增兩條資料後,遺憾的發現,還是跟之前老版本的mysql表現一樣,CK這邊並不會新增。


Clickhouse 的 mysql CDC,終於好使了

mysql新增2條資料


Clickhouse 的 mysql CDC,終於好使了

CK資料的量巋然不動

所以,試圖透過CK的mysql外部表+物化檢視的方式,來實現跟Flink CDC 一樣的資料匯入功能宣告失敗


那麼如果我只想要捕獲mysql的增量資料,不要全量資料,是不是可以實現呢?


一番折騰後發現,也不行,反正就是不管怎麼著,想透過mysql外部表+物化檢視的方式,期待匯入mysql的增量資料,就是沒門,無關mysql版本問題。


按理說,之前的mysql不行,是因為不支援binlog,但現在換成了mysql8,已經支援binlog了,並且已經透過Flink CDC跟Maxwell兩款工具驗證過了,居然還是不行(配置之類的確定沒有問題),這種油鹽不進的貨,就很讓人生氣。



2  CK的 MaterializedMySQL 庫引擎


這個是CK推出的同步mysql整庫的玩法,同樣,在之前的文章中我用mysql5.5 來做測試,沒有成功。


看這次換成了mysql8,到底能不能行?


根據官網的要求,需要先在mysql資料庫配置中新增開啟binlog的配置項,由於mysql8預設開啟,所以這裡我就直接略過。


接著,就是在CK中建立要同步的mysql的庫名:


CREATE DATABASE from_mysql8
ENGINE = MaterializedMySQL('192.168.221.173:3306''test''xxx''xxx')

當然,前提是你必須要在mysql端建立對應的使用者,以及對其賦予相關的許可權,這裡就不贅述。


終於在這一次,行了,可以看到mysql原本的test庫下面所有的表,都同步了過來。


Clickhouse 的 mysql CDC,終於好使了

mysql的test庫下所有表

Clickhouse 的 mysql CDC,終於好使了

被同步到CK庫from_mysql8下的表

既然能把mysql指定庫下面的所有表都能同步過來,那麼接下來,我會好奇以下3個地方:


1,同步過來的表資料量是否對的上,如果mysql資料來源資料量增加了,這邊是否會跟著增加,修改又是否跟著修改;


2,同步過來的表,會採用什麼樣的引擎,以及對應欄位型別是什麼樣的;


3,同步過來的表資料,是實實在在儲存在CK本地了嗎?


好,接下來,我們一個個來驗證。


首先針對第一個問題,經驗證,針對歷史全量資料,兩邊保持一致,而對於增量資料,也可以實時同步,修改的也可以,好評。


針對第二個問題,瞅一眼同步過來的表結構:


Clickhouse 的 mysql CDC,終於好使了

發現,它用的去重引擎,而排序欄位,跟mysql原表的primary key欄位保持一致,並且多了2個額外用來記錄當前資料修改情況的欄位,

其中_version欄位用來記錄該條資料update次數,而_sign用來標註該條記錄是否被刪除。


而至於欄位型別,CK也有著自己的一套對應標準,官方文件有詳細的說明:


Clickhouse 的 mysql CDC,終於好使了


針對第3個問題,看一眼對應的資料目錄就知道了,但是從上面的建表語句其實也可以斷定(MergeTree家族表),這個表資料就是存在CK本地的。


Clickhouse 的 mysql CDC,終於好使了

有對應的目錄和資料檔案,所以確定是存CK本地無疑。



總結


當把 MySQL 升級到支援 binlog 的更高版本之後,雖然CK提供了mysql外部表 + 物化檢視方式,但依然不能實現對其資料的CDC匯入,讓人比較意外。


但是CK提供的 MaterializedMySQL 引擎庫功能,雖然目前還是實驗性質的,卻可以實現對mysql整個庫中表的CDC,如果它能執行穩定,那麼確實會給mysql資料的匯入帶來極大的方便。


那麼同樣的,在不依靠外力情況下(不借助其他外部軟體),CK尚且可以做到如此,那Doris的表現會怎麼樣呢?


我們下期接著嘮...

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

相關文章