Clickhouse 的 mysql CDC,終於好使了
來源:安瑞哥是碼農
前幾篇文章都是圍繞用計算引擎(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(50) NOT NULL,
`domain` varchar(100) NOT NULL,
`time` varchar(20) NOT NULL,
`target_ip` varchar(50) NOT NULL,
`rcode` int NOT NULL,
`query_type` int NOT NULL,
`authority_record` text,
`add_msg` text,
`dns_ip` varchar(50) DEFAULT NULL,
PRIMARY KEY (`client_ip`,`domain`,`time`,`target_ip`,`rcode`,`query_type`)
然後往這張表裡灌了一百多萬的資料量:
接下來,我們就重點對這張表的存量資料以及增量資料進行匯入測試,看看針對高版本的mysql,CK自身所提供的外部表功能,能否勝任對它的CDC操作。
1 CK的mysql外部表
對於CK來說,官方文件提供了專門的mysql外部表功能:
根據文件步驟,既然mysql的目標表已經有了,那麼接下來,就是在CK這裡建立一張它的對映表,欄位型別儘量保持一致(其實沒有變):
CREATE TABLE mysql_table01
(
`client_ip` varchar(50) NOT NULL,
`domain` varchar(100) NOT NULL,
`time` varchar(20) NOT NULL,
`target_ip` varchar(50) NOT NULL,
`rcode` int NOT NULL,
`query_type` int NOT NULL,
`authority_record` text,
`add_msg` text,
`dns_ip` varchar(50) DEFAULT NULL
)
ENGINE = MySQL('192.168.221.173', 'test', 'test02', 'xxx', 'xxxx')
建好後,在CK上做個簡單的查詢:
可以看到,有資料出現,證明對映關係沒有問題。
接下來,開始建立一個CK的物化檢視,把這個對映表的資料(mysql資料),從mysql真正的給匯入到CK本地表中。
CREATE MATERIALIZED VIEW mysql2ck_view01
(
`client_ip` varchar(50) NOT NULL,
`domain` varchar(100) NOT NULL,
`time` varchar(20) NOT NULL,
`target_ip` varchar(50) NOT NULL,
`rcode` int NOT NULL,
`query_type` int NOT NULL,
`authority_record` text,
`add_msg` text,
`dns_ip` varchar(50) DEFAULT NULL
)
ENGINE = MergeTree
ORDER BY client_ip POPULATE AS
SELECT *
FROM mysql_table01
注意,我這裡建立時,用到了關鍵字 POPULATE 意思是我需要匯入mysql這張表的所有歷史資料。
在建立這個表的過程中,資料其實已經開始在向CK的本地表寫入了,看一眼歷史資料的匯入效果:
發現,這個匯入的資料量跟開始檢視的mysql表保持一致,代表所有全量歷史資料匯入成功。
那麼接下來,才是激動人心的時刻,當我往mysql資料來源表再次插入(新增)資料,看看這邊的物化檢視能否捕捉到呢?
上次用mysql5.5是沒有成功的,現在換成了mysql8,就看它給不給這個面子吧。
我往mysql的源表test02連續新增兩條資料後,遺憾的發現,還是跟之前老版本的mysql表現一樣,CK這邊並不會新增。
mysql新增2條資料
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庫下面所有的表,都同步了過來。
mysql的test庫下所有表
被同步到CK庫from_mysql8下的表
既然能把mysql指定庫下面的所有表都能同步過來,那麼接下來,我會好奇以下3個地方:
1,同步過來的表資料量是否對的上,如果mysql資料來源資料量增加了,這邊是否會跟著增加,修改又是否跟著修改;
2,同步過來的表,會採用什麼樣的引擎,以及對應欄位型別是什麼樣的;
3,同步過來的表資料,是實實在在儲存在CK本地了嗎?
好,接下來,我們一個個來驗證。
首先針對第一個問題,經驗證,針對歷史全量資料,兩邊保持一致,而對於增量資料,也可以實時同步,修改的也可以,好評。
針對第二個問題,瞅一眼同步過來的表結構:
發現,它用的去重引擎,而排序欄位,跟mysql原表的primary key欄位保持一致,並且多了2個額外用來記錄當前資料修改情況的欄位,
其中_version欄位用來記錄該條資料update次數,而_sign用來標註該條記錄是否被刪除。
而至於欄位型別,CK也有著自己的一套對應標準,官方文件有詳細的說明:
針對第3個問題,看一眼對應的資料目錄就知道了,但是從上面的建表語句其實也可以斷定(MergeTree家族表),這個表資料就是存在CK本地的。
有對應的目錄和資料檔案,所以確定是存CK本地無疑。
總結
當把 MySQL 升級到支援 binlog 的更高版本之後,雖然CK提供了mysql外部表 + 物化檢視方式,但依然不能實現對其資料的CDC匯入,讓人比較意外。
但是CK提供的 MaterializedMySQL 引擎庫功能,雖然目前還是實驗性質的,卻可以實現對mysql整個庫中表的CDC,如果它能執行穩定,那麼確實會給mysql資料的匯入帶來極大的方便。
那麼同樣的,在不依靠外力情況下(不借助其他外部軟體),CK尚且可以做到如此,那Doris的表現會怎麼樣呢?
我們下期接著嘮...
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027827/viewspace-2995805/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Flink的mysql CDC,好使不?MySql
- ClickHouse與Hive的區別,終於有人講明白了Hive
- 終於有人把MYSQL索引講清楚了MySql索引
- MySQL 函式索引功能終於可以實現了MySql函式索引
- 終於拿Rumbaugh 的新書了新書
- 太難了,我終於把JDBC的程式碼終於優化了!JDBC優化
- Clickhouse的MySQL外部表,坑貨!MySql
- CF終於打上1900了
- AI 終於受涼了??AI
- VSCode 的 Live Share 功能終於來了VSCode
- 微軟終於放棄了Electron了微軟
- clickhouse 同步mysql資料MySql
- VS Code Day,終於來了!
- 幽默:終於黑掉ChatGPT了ChatGPT
- GPT-4,終於來了!GPT
- 攜程,終於反彈了?
- 裝修終於結束了
- 終於,月薪過5萬了!
- GitHub 官方終於出 App 了!GithubAPP
- 行,Python終於玩大了!Python
- ClickHouse(01)什麼是ClickHouse,ClickHouse適用於什麼場景
- 它來了它終於來了- Beego 1.12.2Go
- 終於弄明白了 RocketMQ 的儲存模型MQ模型
- 這一次終於有人把MySQL主從複製講全面了!!!MySql
- 超前看!匯聚全球頂尖白帽黑客的TCFT 2020終終終終於來了!黑客
- clickhouse-mysql資料同步MySql
- ClickHouse-整合引擎(MySQL、HDFS)MySql
- 原生 CSS Custom Highlight 終於來了~CSS
- 終於等到了這篇文章了
- 終於下定決心離職了
- 終於找回這個部落格了
- 終於實現了一門屬於自己的程式語言
- flink-cdc實時同步(oracle to mysql)OracleMySql
- zendesk/maxwell:MySQL的CDC資料更新捕獲者MySql
- FlinkCDCSQL資料同步mysql->clickhouseMySql
- 肝了一週的 UDP 基礎知識終於出來了。UDP
- Win10螢幕亮度切換終於正常了 這個煩人Bug終於修復了Win10
- 幹了 2 年多 Java 外包,終於脫離了!Java