一、引言
ClickHouse是一個用于聯(lián)機分析(OLAP)的列式數(shù)據(jù)庫管理系統(tǒng)(DBMS)。它于2016年以Apache 2.0協(xié)議開源,以優(yōu)秀的查詢性能,深受廣大大數(shù)據(jù)工程師歡迎。
為了服務客戶業(yè)務,騰訊云于2020年4月正式上線ClickHouse服務。服務上線以來,迅速獲得內(nèi)外客戶廣泛支持,服務業(yè)務數(shù)量成規(guī)模增長。與此同時,運維與管控壓力也隨之而來,用戶對彈性伸縮能力的呼聲越來越大。
事實上,ClickHouse是典型的Share-Nothing架構(gòu),天然支持彈性伸縮能力。無論是增加節(jié)點數(shù)量,還是增加數(shù)據(jù)分片副本數(shù)量都非常容易。
圖1 ClickHouse Share-Nothing架構(gòu)
但是,ClickHouse集群在增加節(jié)點后,集群上的數(shù)據(jù)集無法自動均衡分布。需要人工干預,確保數(shù)據(jù)均衡。同理,下線集群節(jié)點前,也需要人工干預,將被下線節(jié)點的機器遷移到其他節(jié)點。
在生產(chǎn)環(huán)境中,運維工作強度隨著集群中表的數(shù)量,數(shù)據(jù)規(guī)模增加而急劇增強。為了緩解云上ClickHouse用戶運維壓力,將ClickHouse數(shù)據(jù)均衡運維工作自動化是非常有價值的。
本文將帶大家了解騰訊云ClickHouse是如何實現(xiàn)無人值守的數(shù)據(jù)均衡服務,希望與大家一同交流。
二、ClickHouse集群數(shù)據(jù)均衡功能缺失
在生產(chǎn)環(huán)境中,通常ClickHouse通常以集群模式部署。在ClickHouse集群中,用戶根據(jù)業(yè)務需求將集群節(jié)點劃分為若干子集合。每個集合存儲若干數(shù)據(jù)集,在使用層面,用戶通過分布式表(Distributed Engine)來查詢整個數(shù)據(jù)集。
在ClickHouse的語義中,有一個Cluster概念,它是一個節(jié)點的集合,并且定義了存儲在該Cluster上的數(shù)據(jù)集的分片數(shù)量,以及分片的副本數(shù)量,以及其存儲節(jié)點。
如上圖1所示,一個名為cluster-dataset的Cluster,定義了4個分片(SHARD),每個分片有2個副本。當存儲在這個Cluster上的數(shù)據(jù)集,通常會分散存儲在4個分片中,并且每個分片數(shù)據(jù)會存儲2個副本。
為Cluster增加分片是非常容易,分配機器,修改配置即可。如下圖所示,給cluster-dataset增加一個分片。但是已存的數(shù)據(jù)數(shù)據(jù)集仍然在分片SHARED1-4上。很明顯,新增的節(jié)點存在資源浪費的問題,包括計算資源和存儲資源。
圖2:擴容節(jié)點示意圖
為了解決這樣問題,有若干方案解決:
·將數(shù)據(jù)全部刪除掉,從后備數(shù)據(jù)源重新導入數(shù)據(jù)到ClickKhouse;
·增加新節(jié)點的權(quán)重,過一定時間后待數(shù)據(jù)均衡后,重新調(diào)整新增節(jié)點權(quán)重;
·其他,如人工搬運數(shù)據(jù)到新增節(jié)點
但是無論使用上述哪一種種方法,都存在缺陷。比如對于第一個方案而言,如果ClickHouse中數(shù)據(jù)并無后備數(shù)據(jù)源,那么該方案不可行。即使有后備數(shù)據(jù)源,重新導入數(shù)據(jù)耗時,且停服時間與數(shù)據(jù)量成正比,代價大。
對于第二種方案,需要對新節(jié)點進行多次權(quán)限調(diào)整。在調(diào)整期間,數(shù)據(jù)存儲壓力向新增節(jié)點傾斜,無法充分利用集群優(yōu)勢。且容易導致新近數(shù)據(jù)集中在新增節(jié)點上,導致集群資源浪費,降低查詢效率。
對于第三種方案而言,操作繁雜,在表多,數(shù)據(jù)量大的情況下,易出錯。
三、云上ClickHouse解決方案
為了解決ClickHouse集群數(shù)據(jù)均衡功能缺失,帶來的運維壓力,騰訊云ClickHouse提供了數(shù)據(jù)自動均衡功能。
簡而言之,在獲得用戶授權(quán)后,用戶在控制臺上簡單配置,填寫數(shù)據(jù)遷移網(wǎng)絡(luò)帶寬上限,即可啟動數(shù)據(jù)均衡任務。
后臺管控系統(tǒng)根據(jù)機器當期磁盤可用容量,合理安排數(shù)據(jù)遷移計劃。然后,根據(jù)網(wǎng)絡(luò)帶寬上限,執(zhí)行遷移計劃。最終,使得數(shù)據(jù)在節(jié)點上分布趨于均衡。
舉一個例子來進行說明,在云上申請一個ClickHouse實例,2個節(jié)點。在其中一個節(jié)點上創(chuàng)建一個名為lineorder的表,并導入測試數(shù)據(jù)。查看該表在該節(jié)點上的存儲容量,結(jié)果如下所示:
另外一個節(jié)點上沒有該表的數(shù)據(jù),也沒有表的schema。我們通過數(shù)據(jù)遷移功能完成數(shù)據(jù)均衡。接下來通過控制臺,我們完成數(shù)據(jù)遷移。具體步驟如下:
1.選擇Cluster
選擇Cluster,選擇ClickHouse實例,點擊集群服務,選擇ClickHouse組件,在"操作"下拉列表中,選擇數(shù)據(jù)遷移菜單項。選擇數(shù)據(jù)均衡模式。
2.選擇遷移節(jié)點
在確定Cluster后,可以選擇數(shù)據(jù)遷出與遷入節(jié)點。
3.選擇遷移數(shù)據(jù)表
在確定了遷移節(jié)點后,我們可以選擇待遷移的表。
4.確認信息
最后,提交任務。ClickHouse就開始數(shù)據(jù)遷移工作。在任務中心可以看到數(shù)據(jù)遷移進度。
任務結(jié)束時候,也可以查看遷移任務詳情信息。
待數(shù)據(jù)遷移完成后,我們可以查看數(shù)據(jù)在兩個節(jié)點上數(shù)據(jù)分布情況。在集群節(jié)點上數(shù)據(jù)量情況如下:
可以看到,數(shù)據(jù)遷移完成后,數(shù)據(jù)條數(shù)和數(shù)據(jù)量是完全吻合的。
四、結(jié)語
云上數(shù)據(jù)遷移功能旨在解決ClickHouse彈性伸縮時數(shù)據(jù)遷移問題。使用場景包括:
·新擴容節(jié)點后,使用數(shù)據(jù)遷移功能,遷移部分數(shù)據(jù)至新節(jié)點,讓數(shù)據(jù)在集群節(jié)點上趨于均衡;
·縮容節(jié)點前,將待下線節(jié)點上的數(shù)據(jù)遷移到其他節(jié)點,避免數(shù)據(jù)丟失。
數(shù)據(jù)遷移功能極大的緩解了集群版ClickHouse運維壓力。需要注意的是,數(shù)據(jù)均衡任務運行過程中,被遷移的表無法被業(yè)務訪問。