ClickHouse無(wú)疑是目前最火的OLAP解決方案,筆者所在的運(yùn)維團(tuán)隊(duì),ClickHouse的數(shù)量近兩年增長(zhǎng)迅猛。
最近老板安排了一個(gè)任務(wù),要求我調(diào)研現(xiàn)在MySQL到ClickHouse的同步工具,方便后面將線上的在線OLTP數(shù)據(jù)實(shí)時(shí)同步給線下的OLAP ClickHouse,這樣業(yè)務(wù)人員和運(yùn)營(yíng)人員基于它進(jìn)行統(tǒng)計(jì)查詢更直觀快速。
目前,市面上的相關(guān)工具和產(chǎn)品,主要分為三類:
ClickHouse原生提供的MySQL同步工具
命令行式的MySQL to ClickHouse同步工具
界面引導(dǎo)式的MySQL to ClickHouse同步工具
ClickHouse 官方提供了MaterializedMySQL的同步復(fù)制工具,它會(huì)獲取MySQL的binlog,并重放DDL和DML。但是這個(gè)特性沒(méi)有release,官方文檔用醒目的字體顯示“This is an experimental feature that should not be used in production.”不能用在生產(chǎn)環(huán)境中,并且看代碼也有一段時(shí)間沒(méi)有更新了。
測(cè)試結(jié)果如下:
在MySQL上創(chuàng)建一個(gè)表。
mysql> create database db1; mysql> create table test1 (a INT PRIMARY KEY, b INT);
在ClickHouse上新建MaterializeMySQL的表。
## 這里要專門設(shè)置以便clickhouse能使用這個(gè)特性 ck> set allow_experimental_database_materialize_mysql=1; ## 這里創(chuàng)建連接到user@192.168.1.17:3306/db1的database連接,命名為db1_ck ck> CREATE DATABASE db1_ck ENGINE = MaterializeMySQL('192.168.1.17:3306', 'db1', 'user', '***'); ## 進(jìn)入db1_ck這個(gè)數(shù)據(jù)庫(kù) ck> use db1_ck; ## 查看db1_ck庫(kù)下的表,可以看到test1這個(gè)表 ck> show tables;
查看test1這個(gè)表在ck上的表結(jié)構(gòu)。
ck> show create table test1; CREATE TABLE db1_ck.test1 ( `a` Int32, `b` Nullable(Int32), `_sign` Int8 MATERIALIZED 1, `_version` UInt64 MATERIALIZED 1, INDEX _version _version TYPE minmax GRANULARITY 1 ) ENGINE = ReplacingMergeTree(_version) PARTITION BY intDiv(a, 4294967) ORDER BY tuple(a) SETTINGS index_granularity = 8192
test1表使用的是ReplacingMergeTree引擎,表結(jié)構(gòu)新增了兩個(gè)字段_sign和_version作為隱藏字段,用于標(biāo)識(shí)該行是否刪除和版本號(hào)。這樣將MySQL的update和delete統(tǒng)一轉(zhuǎn)換成insert,充分利用ClickHouse快速導(dǎo)入數(shù)據(jù)、update和delete慢且容易出問(wèn)題的特性。內(nèi)部實(shí)現(xiàn)原理的細(xì)節(jié)和好處,我們將在另外一篇文章里面介紹。
在MySQL上操作,看數(shù)據(jù)會(huì)不會(huì)同步到ClickHouse上。
mysql> insert into test1 values (1,11),(2,22),(3,33); mysql> update test1 set b=77 where a=1; mysql> delete from test1 where a=2; ck> select * from db1_ck.test1; ┌─a─┬──b─┐ │ 1 │ 77 │ │ 3 │ 33 │ └───┴────┘
可以看到,數(shù)據(jù)基本都正確地同步到ClickHouse上去了。
這一類是利用命令行來(lái)實(shí)現(xiàn)MySQL同步到ClickHouse的工具,例如Altinity的clickhouse-mysql-data-reader工具,這個(gè)工具也可以實(shí)現(xiàn)DML的數(shù)據(jù)同步。但是安裝和命令行使用太麻煩,而且這個(gè)工具2020年就不再更新了,所以此次沒(méi)有進(jìn)一步深入研究。
有獨(dú)立的web界面來(lái)實(shí)現(xiàn)MySQL同步到ClickHouse,用戶體驗(yàn)更方便。類似的國(guó)內(nèi)產(chǎn)品有很多,從簡(jiǎn)單性和穩(wěn)定性來(lái)說(shuō),個(gè)人偏向于DBMotion。下面就以DBMotion的線上版本為例,介紹一下界面引導(dǎo)式MySQL to ClickHouse的遷移。
遷移任務(wù)配置和查看
首先,進(jìn)入DBMotion的頁(yè)面,點(diǎn)擊免費(fèi)使用。
https://squids.cn/product/dbmotion
登錄DBMotion的任務(wù)列表頁(yè)面。
https://console.squids.cn/console/transfer
單擊“添加任務(wù)”按鈕,進(jìn)入“源端目標(biāo)庫(kù)配置”。
為方便展示,這里選擇的是在公網(wǎng)ECS上創(chuàng)建的MySQL和ClickHouse。
注意:這里的源庫(kù)與目標(biāo)庫(kù)的用戶、權(quán)限,建議按照授權(quán)語(yǔ)句的要求,在源庫(kù)和目標(biāo)庫(kù)新建用戶,否則后面的預(yù)檢查和遷移有可能會(huì)失敗。遷移完成后,就可以將源端和目標(biāo)端的用戶刪除。
點(diǎn)擊“測(cè)試連接以進(jìn)行下一步”,進(jìn)入“遷移選項(xiàng)配置”頁(yè)。
這里可以展開(kāi)選擇你要同步的表,選擇并發(fā)數(shù)和遷移哪些MySQL的表到目標(biāo)端。
最后,用戶確認(rèn)配置并進(jìn)行預(yù)檢查。
這一步可以看到用戶選擇的是哪些內(nèi)容,而且預(yù)檢查會(huì)提前發(fā)現(xiàn)一些可能導(dǎo)致遷移失敗的問(wèn)題 。
這個(gè)確認(rèn)頁(yè)面內(nèi)容豐富,涵蓋了源庫(kù)、目標(biāo)庫(kù)和要遷移的對(duì)象的信息。還會(huì)主動(dòng)預(yù)檢查所有可能導(dǎo)致遷移失敗的點(diǎn),出現(xiàn)問(wèn)題時(shí)會(huì)發(fā)出提醒,并給出修復(fù)建議,是一個(gè)比較方便的功能。
能看到新建任務(wù)成功,點(diǎn)擊任務(wù)就可以進(jìn)入任務(wù)詳情頁(yè)面 。
在任務(wù)配置頁(yè)面,可以看到這次遷移同步任務(wù)的源庫(kù)、目標(biāo)庫(kù)和遷移對(duì)象信息,之前的預(yù)檢查信息也可以在這里回顧。
遷移詳情主要包括“對(duì)象遷移”、“全量遷移”、“增量遷移”和“數(shù)據(jù)校驗(yàn)”。
對(duì)象遷移。
以這兩個(gè)測(cè)試表為例,將對(duì)象同步過(guò)去的速度是比較快的。對(duì)象遷移,DBMotion具體同步的內(nèi)容,我們看目標(biāo)庫(kù)上的表和數(shù)據(jù)的時(shí)候可以看到。
全量遷移。
兩個(gè)表的數(shù)據(jù)不多,同步的速度較快。
這里每個(gè)步驟都有遷移進(jìn)度、遷移速度、已遷移時(shí)間、預(yù)計(jì)剩余時(shí)間,對(duì)于遷移的進(jìn)展和大概需要多少時(shí)間,一目了然。
增量遷移。
記錄了同步的binlog位點(diǎn)信息。
數(shù)據(jù)校驗(yàn)。
這個(gè)功能是其他相關(guān)產(chǎn)品沒(méi)有的功能,會(huì)校驗(yàn)MySQL和ClickHouse的表和數(shù)據(jù)。對(duì)于需要精確匹配的遷移來(lái)說(shuō),是一個(gè)很實(shí)用的功能。
結(jié)束遷移。
結(jié)束遷移是為了關(guān)閉增量,保證遷移完成以后,就可以結(jié)束遷移了。
任務(wù)日志。
在遷移報(bào)錯(cuò)的時(shí)候,用來(lái)檢查到底是哪個(gè)環(huán)節(jié)出現(xiàn)了問(wèn)題。
總體來(lái)看,這個(gè)操作是比較簡(jiǎn)單的。只需要配置好源端、目標(biāo)端和遷移對(duì)象,它就會(huì)幫你創(chuàng)建好遷移任務(wù)。任務(wù)展示頁(yè)面也比較清晰明了,同步了哪些內(nèi)容,數(shù)據(jù)是否一致都有比較好的展現(xiàn)。
接下來(lái),我們來(lái)看它的實(shí)際遷移結(jié)果。
全量遷移
源庫(kù)表結(jié)構(gòu)。
源庫(kù)上test_grant1.test1表的表結(jié)構(gòu)如下:
目標(biāo)庫(kù)結(jié)構(gòu)。
遷移完成后,在目標(biāo)庫(kù)里看,DBMotion新建了兩個(gè)schema,test_grant1和test_grant1_ck,并分別在這兩個(gè)schema下新建了test1_ck表和test1表,對(duì)應(yīng)的表結(jié)構(gòu)如下:
這一步,DBMotion應(yīng)該是參考ClickHouse原生解決方案MaterializedMySQL來(lái)實(shí)現(xiàn)的。解釋一下:
test_grant1_ck.test1_ck是ReplacingMergeTree的表,除了a、b兩列以外,還有__version@@和__event_type@@,對(duì)應(yīng)version和sign兩個(gè)字段。
為了方便用戶使用,在目標(biāo)庫(kù)上專門新建了test_grant1.test1的視圖,讓用戶查詢的時(shí)候,看到的數(shù)據(jù)和源庫(kù)一致。
增量遷移。
我們測(cè)試了一下在源庫(kù)上做增刪改的操作,在目標(biāo)庫(kù)上查看同步效果,發(fā)現(xiàn)同步延遲基本在秒級(jí)別,同步的數(shù)據(jù)也完全一致。
源庫(kù)增刪改查。
目標(biāo)庫(kù)查看數(shù)據(jù)。
這里可以明顯看到,test_grant1_ck.test1_ck中記錄的是源庫(kù)做的所有DML操作,通過(guò)視圖合并后,test_grant1.test1查詢出來(lái)的數(shù)據(jù)跟源庫(kù)一模一樣。
PS:B站上有一個(gè)DBMotion的介紹視頻,不喜歡看文字的,可以看這個(gè)視頻了解一下它的安裝和使用方式。
總結(jié)
MySQL to Clickhouse,目前有ClickHouse原生提供的同步工具、命令行同步工具和界面指引型同步工具。原生的工具暫時(shí)不能用在生產(chǎn)環(huán)境,命令行工具使用起來(lái)比較繁瑣,界面型相對(duì)簡(jiǎn)單易用。
界面型同步工具中,DBMotion相對(duì)比較直觀簡(jiǎn)單。
這些工具對(duì)DDL、無(wú)主鍵表都有一些限制,這些問(wèn)題我將在另外一篇文章里面詳細(xì)描述。
服務(wù)電話: 400-678-1800 (周??周五 09:00-18:00)
商務(wù)合作: 0571-87770835
市場(chǎng)反饋: marketing@woqutech.com
地址: 杭州市濱江區(qū)濱安路1190號(hào)智匯中?A座1101室