【網(wǎng)站搭建】列式數(shù)據(jù)庫(kù)ClickHouse
Start:關(guān)注本公眾號(hào)后,可直接聯(lián)系后臺(tái)獲取排版美化的詳細(xì)文檔!
Hints:本篇文章所編纂的資料均來(lái)自網(wǎng)絡(luò),特此感謝參與奉獻(xiàn)的有關(guān)人員。
Clickhouse的優(yōu)點(diǎn):
? 1.真正的面向列的DBMS
? 2.數(shù)據(jù)高效壓縮
? 3.磁盤存儲(chǔ)的數(shù)據(jù)
? 4.多核并行處理
? 5.在多個(gè)服務(wù)器上分布式處理
? 6.SQL語(yǔ)法支持
? 7.向量化引擎
? 8.實(shí)時(shí)數(shù)據(jù)更新
? 9.索引
? 10.適合在線查詢
? 11.支持近似預(yù)估計(jì)算
? 12.支持嵌套的數(shù)據(jù)結(jié)構(gòu)
? 支持?jǐn)?shù)組作為數(shù)據(jù)類型
? 13.支持限制查詢復(fù)雜性以及配額
? 14.復(fù)制數(shù)據(jù)復(fù)制和對(duì)數(shù)據(jù)完整性的支持
Clickhouse的缺點(diǎn):
? 1.不支持事物。
? 2.不支持Update/Delete操作。
? 3.支持有限操作系統(tǒng)。
現(xiàn)在支持ubuntu,centos 需要自己編譯,不過(guò)有熱心人已經(jīng)編譯好了,拿來(lái)用就行。
Clickhouse的應(yīng)用:
1.電信行業(yè)用于存儲(chǔ)數(shù)據(jù)和統(tǒng)計(jì)數(shù)據(jù)使用。
2.新浪微博用于用戶行為數(shù)據(jù)記錄和分析工作。
3.用于廣告網(wǎng)絡(luò)和RTB,電子商務(wù)的用戶行為分析。
4.信息安全里面的日志分析。
5.檢測(cè)和遙感信息的挖掘。
6.商業(yè)智能。
7.網(wǎng)絡(luò)游戲以及物聯(lián)網(wǎng)的數(shù)據(jù)處理和價(jià)值數(shù)據(jù)分析。
8.最大的應(yīng)用來(lái)自于Yandex的統(tǒng)計(jì)分析服務(wù)Yandex.Metrica,類似于谷歌Analytics(GA),或友盟統(tǒng)計(jì),小米統(tǒng)計(jì),幫助網(wǎng)站或移動(dòng)應(yīng)用進(jìn)行數(shù)據(jù)分析和精細(xì)化運(yùn)營(yíng)工具,據(jù)稱Yandex.Metrica為世界上第二大的網(wǎng)站分析平臺(tái)。
Clickhouse的案例:
-今日頭條內(nèi)部用ClickHouse來(lái)做用戶行為分析,內(nèi)部一共幾千個(gè)ClickHouse節(jié)點(diǎn),單集群最大1200節(jié)點(diǎn),總數(shù)據(jù)量幾十PB,日增原始數(shù)據(jù)300TB左右。
-騰訊內(nèi)部用ClickHouse做游戲數(shù)據(jù)分析,并且為之建立了一整套監(jiān)控運(yùn)維體系。
-攜程內(nèi)部從18年7月份開始接入試用,目前80%的業(yè)務(wù)都跑在ClickHouse上。每天數(shù)據(jù)增量十多億,近百萬(wàn)次查詢請(qǐng)求。
-快手內(nèi)部也在使用ClickHouse,存儲(chǔ)總量大約10PB, 每天新增200TB, 90%查詢小于3S。
-在國(guó)外,Yandex內(nèi)部有數(shù)百節(jié)點(diǎn)用于做用戶點(diǎn)擊行為分析,CloudFlare、Spotify等頭部公司也在使用。
-國(guó)內(nèi)云計(jì)算的領(lǐng)導(dǎo)廠商阿里云 率先推出了自己的ClickHouse托管產(chǎn)品,產(chǎn)品首頁(yè)地址為 云數(shù)據(jù)庫(kù)ClickHouse,可以點(diǎn)擊鏈接申請(qǐng)參加免費(fèi)公測(cè),一睹為快!
Clickhouse的分析:
OLAP場(chǎng)景的特點(diǎn)
-讀多于寫
不同于事務(wù)處理(OLTP)的場(chǎng)景,比如電商場(chǎng)景中加購(gòu)物車、下單、支付等需要在原地進(jìn)行大量insert、update、delete操作,數(shù)據(jù)分析(OLAP)場(chǎng)景通常是將數(shù)據(jù)批量導(dǎo)入后,進(jìn)行任意維度的靈活探索、BI工具洞察、報(bào)表制作等。數(shù)據(jù)一次性寫入后,分析師需要嘗試從各個(gè)角度對(duì)數(shù)據(jù)做挖掘、分析,直到發(fā)現(xiàn)其中的商業(yè)價(jià)值、業(yè)務(wù)變化趨勢(shì)等信息。這是一個(gè)需要反復(fù)試錯(cuò)、不斷調(diào)整、持續(xù)優(yōu)化的過(guò)程,其中數(shù)據(jù)的讀取次數(shù)遠(yuǎn)多于寫入次數(shù)。這就要求底層數(shù)據(jù)庫(kù)為這個(gè)特點(diǎn)做專門設(shè)計(jì),而不是盲目采用傳統(tǒng)數(shù)據(jù)庫(kù)的技術(shù)架構(gòu)。
-大寬表,讀大量行但是少量列,結(jié)果集較小
OLTP類業(yè)務(wù)對(duì)于延時(shí)(Latency)要求更高,要避免讓客戶等待造成業(yè)務(wù)損失;而OLAP類業(yè)務(wù),由于數(shù)據(jù)量非常大,通常更加關(guān)注寫入吞吐(Throughput),要求海量數(shù)據(jù)能夠盡快導(dǎo)入完成。一旦導(dǎo)入完成,歷史數(shù)據(jù)往往作為存檔,不會(huì)再做更新、刪除操作。
-無(wú)需事務(wù),數(shù)據(jù)一致性要求低
OLAP類業(yè)務(wù)對(duì)于事務(wù)需求較少,通常是導(dǎo)入歷史日志數(shù)據(jù),或搭配一款事務(wù)型數(shù)據(jù)庫(kù)并實(shí)時(shí)從事務(wù)型數(shù)據(jù)庫(kù)中進(jìn)行數(shù)據(jù)同步。多數(shù)OLAP系統(tǒng)都支持最終一致性。
-靈活多變,不適合預(yù)先建模
分析場(chǎng)景下,隨著業(yè)務(wù)變化要及時(shí)調(diào)整分析維度、挖掘方法,以盡快發(fā)現(xiàn)數(shù)據(jù)價(jià)值、更新業(yè)務(wù)指標(biāo)。而數(shù)據(jù)倉(cāng)庫(kù)中通常存儲(chǔ)著海量的歷史數(shù)據(jù),調(diào)整代價(jià)十分高昂。預(yù)先建模技術(shù)雖然可以在特定場(chǎng)景中加速計(jì)算,但是無(wú)法滿足業(yè)務(wù)靈活多變的發(fā)展需求,維護(hù)成本過(guò)高。
Clickhouse的架構(gòu)

數(shù)據(jù)接入層
提供了數(shù)據(jù)導(dǎo)入相關(guān)的服務(wù)及功能,按照數(shù)據(jù)的量級(jí)和特性我們抽象出三種Clickhouse導(dǎo)入數(shù)據(jù)的方式。
方式一:數(shù)倉(cāng)應(yīng)用層小表導(dǎo)入
這類數(shù)據(jù)量級(jí)相對(duì)較小,且分布在不同的數(shù)據(jù)源如hdfs、es、hbase等,這時(shí)我們提供基于DataX自研的TaskPlus數(shù)據(jù)流轉(zhuǎn)+調(diào)度平臺(tái)導(dǎo)入數(shù)據(jù),單分區(qū)數(shù)據(jù)無(wú)并發(fā)寫入,多分區(qū)數(shù)據(jù)小并發(fā)寫入,且能和線上任務(wù)形成依賴關(guān)系,確保導(dǎo)入程序的可靠性。方式二:離線多維明細(xì)寬表導(dǎo)入
這類數(shù)據(jù)一般是匯總層的明細(xì)數(shù)據(jù)或者是用戶基于Hadoop生產(chǎn)的大量級(jí)數(shù)據(jù),我們基于Spark開發(fā)了一個(gè)導(dǎo)入工具包,用戶可以根據(jù)配置直接拉取hdfs或者h(yuǎn)ive上的數(shù)據(jù)到clickhouse,同時(shí)還能基于配置sql對(duì)數(shù)據(jù)進(jìn)行ETL處理,工具包會(huì)根據(jù)配置集群的節(jié)點(diǎn)數(shù)以及Clickhouse集群負(fù)載情況(merges、processes)對(duì)local表進(jìn)行高并發(fā)的寫入,達(dá)到快速導(dǎo)數(shù)的目的。方式三:實(shí)時(shí)多維明細(xì)寬表導(dǎo)入
實(shí)時(shí)數(shù)據(jù)接入場(chǎng)景比較固定,我們封裝了通用的ClickhouseSink,將app、pc、m三端每日百億級(jí)的數(shù)據(jù)通過(guò)Flink接入clickhouse,ClickhouseSink也提供了batchSize(單次導(dǎo)入數(shù)據(jù)量)及batchTime(單次導(dǎo)入時(shí)間間隔)供用戶選擇。數(shù)據(jù)存儲(chǔ)層
數(shù)據(jù)存儲(chǔ)層這里我們采用雙副本機(jī)制來(lái)保證數(shù)據(jù)的高可靠,同時(shí)用nginx代理clickhouse集群,通過(guò)域名的方式進(jìn)行讀寫操作,實(shí)現(xiàn)了數(shù)據(jù)均衡及高可靠寫入,且對(duì)于域名的響應(yīng)時(shí)間及流量有對(duì)應(yīng)的實(shí)時(shí)監(jiān)控,一旦響應(yīng)速度出現(xiàn)波動(dòng)或異常我們能在第一時(shí)間收到報(bào)警通知。
nginx_one_replication:代理集群一半節(jié)點(diǎn)即一個(gè)完整副本,常用于寫操作,在每次提交數(shù)據(jù)時(shí)由nginx均衡路由到對(duì)應(yīng)的shard表,當(dāng)某一個(gè)節(jié)點(diǎn)出現(xiàn)異常導(dǎo)致寫入失敗時(shí),nginx會(huì)暫時(shí)剔除異常節(jié)點(diǎn)并報(bào)警,然后另選一臺(tái)節(jié)點(diǎn)重新寫入。
nginx_two_replication:代理集群所有節(jié)點(diǎn),一般用作查詢和無(wú)副本表數(shù)據(jù)寫入,同時(shí)也會(huì)有對(duì)于異常節(jié)點(diǎn)的剔除和報(bào)警機(jī)制。
數(shù)據(jù)服務(wù)層
對(duì)外:將集群查詢統(tǒng)一封裝為scf服務(wù)(RPC),供外部調(diào)用。
對(duì)內(nèi):提供了客戶端工具直接供分析師及開發(fā)人員使用。
數(shù)據(jù)應(yīng)用層
埋點(diǎn)系統(tǒng):對(duì)接實(shí)時(shí)clickhouse集群,提供秒級(jí)別的OLAP查詢功能。
用戶分析平臺(tái):通過(guò)標(biāo)簽篩選的方式,從用戶訪問(wèn)總集合中根據(jù)特定的用戶行為捕獲所需用戶集。
BI:提供數(shù)據(jù)應(yīng)用層的可視化展示,對(duì)接單分片多副本Clickhouse集群,可橫向擴(kuò)展。
Clickhouse的存儲(chǔ):
ClickHouse從OLAP場(chǎng)景需求出發(fā),定制開發(fā)了一套全新的高效列式存儲(chǔ)引擎,并且實(shí)現(xiàn)了數(shù)據(jù)有序存儲(chǔ)、主鍵索引、稀疏索引、數(shù)據(jù)Sharding、數(shù)據(jù)Partitioning、TTL、主備復(fù)制等豐富功能。以上功能共同為ClickHouse極速的分析性能奠定了基礎(chǔ)。
列式存儲(chǔ)
與行存將每一行的數(shù)據(jù)連續(xù)存儲(chǔ)不同,列存將每一列的數(shù)據(jù)連續(xù)存儲(chǔ)。
相比于行式存儲(chǔ),列式存儲(chǔ)在分析場(chǎng)景下有著許多優(yōu)良的特性。
1)如前所述,分析場(chǎng)景中往往需要讀大量行但是少數(shù)幾個(gè)列。在行存模式下,數(shù)據(jù)按行連續(xù)存儲(chǔ),所有列的數(shù)據(jù)都存儲(chǔ)在一個(gè)block中,不參與計(jì)算的列在IO時(shí)也要全部讀出,讀取操作被嚴(yán)重放大。而列存模式下,只需要讀取參與計(jì)算的列即可,極大的減低了IO cost,加速了查詢。
2)同一列中的數(shù)據(jù)屬于同一類型,壓縮效果顯著。列存往往有著高達(dá)十倍甚至更高的壓縮比,節(jié)省了大量的存儲(chǔ)空間,降低了存儲(chǔ)成本。
3)更高的壓縮比意味著更小的datasize,從磁盤中讀取相應(yīng)數(shù)據(jù)耗時(shí)更短。
4)自由的壓縮算法選擇。不同列的數(shù)據(jù)具有不同的數(shù)據(jù)類型,適用的壓縮算法也就不盡相同??梢葬槍?duì)不同列類型,選擇最合適的壓縮算法。
5)高壓縮比,意味著同等大小的內(nèi)存能夠存放更多數(shù)據(jù),系統(tǒng)cache效果更好。
有序存儲(chǔ)
ClickHouse支持在建表時(shí),指定將數(shù)據(jù)按照某些列進(jìn)行sortby。
排序后,保證了相同sort key的數(shù)據(jù)在磁盤上連續(xù)存儲(chǔ),且有序擺放。在進(jìn)行等值、范圍查詢時(shí),where條件命中的數(shù)據(jù)都緊密存儲(chǔ)在一個(gè)或若干個(gè)連續(xù)的Block中,而不是分散的存儲(chǔ)在任意多個(gè)Block,大幅減少需要IO的block數(shù)量。另外,連續(xù)IO也能夠充分利用操作系統(tǒng)page cache的預(yù)取能力,減少page fault。
主鍵索引
ClickHouse支持主鍵索引,它將每列數(shù)據(jù)按照indexgranularity(默認(rèn)8192行)進(jìn)行劃分,每個(gè)index granularity的開頭第一行被稱為一個(gè)mark行。主鍵索引存儲(chǔ)該mark行對(duì)應(yīng)的primary key的值。
稀疏索引
ClickHouse支持對(duì)任意列創(chuàng)建任意數(shù)量的稀疏索引。其中被索引的value可以是任意的合法SQL Expression,并不僅僅局限于對(duì)column value本身進(jìn)行索引。之所以叫稀疏索引,是因?yàn)樗举|(zhì)上是對(duì)一個(gè)完整index granularity(默認(rèn)8192行)的統(tǒng)計(jì)信息,并不會(huì)具體記錄每一行在文件中的位置。
數(shù)據(jù)Sharding
ClickHouse支持單機(jī)模式,也支持分布式集群模式。在分布式模式下,ClickHouse會(huì)將數(shù)據(jù)分為多個(gè)分片,并且分布到不同節(jié)點(diǎn)上。不同的分片策略在應(yīng)對(duì)不同的SQLPattern時(shí),各有優(yōu)勢(shì)。ClickHouse提供了豐富的sharding策略,讓業(yè)務(wù)可以根據(jù)實(shí)際需求選用。
1)random隨機(jī)分片:寫入數(shù)據(jù)會(huì)被隨機(jī)分發(fā)到分布式集群中的某個(gè)節(jié)點(diǎn)上。
2)constant固定分片:寫入數(shù)據(jù)會(huì)被分發(fā)到固定一個(gè)節(jié)點(diǎn)上。
3)column value分片:按照某一列的值進(jìn)行hash分片。
4)自定義表達(dá)式分片:指定任意合法表達(dá)式,根據(jù)表達(dá)式被計(jì)算后的值進(jìn)行hash分片。
數(shù)據(jù)Partitioning
ClickHouse支持PARTITION BY子句,在建表時(shí)可以指定按照任意合法表達(dá)式進(jìn)行數(shù)據(jù)分區(qū)操作,比如通過(guò)toYYYYMM()將數(shù)據(jù)按月進(jìn)行分區(qū)、toMonday()將數(shù)據(jù)按照周幾進(jìn)行分區(qū)、對(duì)Enum類型的列直接每種取值作為一個(gè)分區(qū)等。
數(shù)據(jù)TTL
在分析場(chǎng)景中,數(shù)據(jù)的價(jià)值隨著時(shí)間流逝而不斷降低,多數(shù)業(yè)務(wù)出于成本考慮只會(huì)保留最近幾個(gè)月的數(shù)據(jù),ClickHouse通過(guò)TTL提供了數(shù)據(jù)生命周期管理的能力。
ClickHouse支持幾種不同粒度的TTL:
1) 列級(jí)別TTL:當(dāng)一列中的部分?jǐn)?shù)據(jù)過(guò)期后,會(huì)被替換成默認(rèn)值;當(dāng)全列數(shù)據(jù)都過(guò)期后,會(huì)刪除該列。
2)行級(jí)別TTL:當(dāng)某一行過(guò)期后,會(huì)直接刪除該行。
3)分區(qū)級(jí)別TTL:當(dāng)分區(qū)過(guò)期后,會(huì)直接刪除該分區(qū)。
高吞吐寫入能力
ClickHouse采用類LSM Tree的結(jié)構(gòu),數(shù)據(jù)寫入后定期在后臺(tái)Compaction。通過(guò)類LSM tree的結(jié)構(gòu),ClickHouse在數(shù)據(jù)導(dǎo)入時(shí)全部是順序append寫,寫入后數(shù)據(jù)段不可更改,在后臺(tái)compaction時(shí)也是多個(gè)段merge sort后順序?qū)懟卮疟P。順序?qū)懙奶匦裕浞掷昧舜疟P的吞吐能力,即便在HDD上也有著優(yōu)異的寫入性能。
主備同步
ClickHouse通過(guò)主備復(fù)制提供了高可用能力,主備架構(gòu)下支持無(wú)縫升級(jí)等運(yùn)維操作。而且相比于其他系統(tǒng)它的實(shí)現(xiàn)有著自己的特色:
1)默認(rèn)配置下,任何副本都處于active模式,可以對(duì)外提供查詢服務(wù);
2)可以任意配置副本個(gè)數(shù),副本數(shù)量可以從0個(gè)到任意多個(gè);
3)不同shard可以配置不提供副本個(gè)數(shù),用于解決單個(gè)shard的查詢熱點(diǎn)問(wèn)題;
ClickHouse的計(jì)算
ClickHouse在計(jì)算層做了非常細(xì)致的工作,竭盡所能榨干硬件能力,提升查詢速度。它實(shí)現(xiàn)了單機(jī)多核并行、分布式計(jì)算、向量化執(zhí)行與SIMD指令、代碼生成等多種重要技術(shù)。
多核并行
ClickHouse將數(shù)據(jù)劃分為多個(gè)partition,每個(gè)partition再進(jìn)一步劃分為多個(gè)indexgranularity,然后通過(guò)多個(gè)CPU核心分別處理其中的一部分來(lái)實(shí)現(xiàn)并行數(shù)據(jù)處理。
分布式計(jì)算
除了優(yōu)秀的單機(jī)并行處理能力,ClickHouse還提供了可線性拓展的分布式計(jì)算能力。ClickHouse會(huì)自動(dòng)將查詢拆解為多個(gè)task下發(fā)到集群中,然后進(jìn)行多機(jī)并行處理,最后把結(jié)果匯聚到一起。
向量化執(zhí)行與SIMD
ClickHouse不僅將數(shù)據(jù)按列存儲(chǔ),而且按列進(jìn)行計(jì)算。傳統(tǒng)OLTP數(shù)據(jù)庫(kù)通常采用按行計(jì)算,原因是事務(wù)處理中以點(diǎn)查為主,SQL計(jì)算量小,實(shí)現(xiàn)這些技術(shù)的收益不夠明顯。但是在分析場(chǎng)景下,單個(gè)SQL所涉及計(jì)算量可能極大,將每行作為一個(gè)基本單元進(jìn)行處理會(huì)帶來(lái)嚴(yán)重的性能損耗
動(dòng)態(tài)代碼生成Runtime Codegen
在經(jīng)典的數(shù)據(jù)庫(kù)實(shí)現(xiàn)中,通常對(duì)表達(dá)式計(jì)算采用火山模型,也即將查詢轉(zhuǎn)換成一個(gè)個(gè)operator,比如HashJoin、Scan、IndexScan、Aggregation等。為了連接不同算子,operator之間采用統(tǒng)一的接口,比如open/next/close。在每個(gè)算子內(nèi)部都實(shí)現(xiàn)了父類的這些虛函數(shù),在分析場(chǎng)景中單條SQL要處理數(shù)據(jù)通常高達(dá)數(shù)億行,虛函數(shù)的調(diào)用開銷不再可以忽略不計(jì)。另外,在每個(gè)算子內(nèi)部都要考慮多種變量,比如列類型、列的size、列的個(gè)數(shù)等,存在著大量的if-else分支判斷導(dǎo)致CPU分支預(yù)測(cè)失效。
近似計(jì)算
近似計(jì)算以損失一定結(jié)果精度為代價(jià),極大地提升查詢性能。在海量數(shù)據(jù)處理中,近似計(jì)算價(jià)值更加明顯。
ClickHouse 和一些技術(shù)的比較
1.商業(yè)OLAP數(shù)據(jù)庫(kù)
例如:HP Vertica, Actian the Vector,
區(qū)別:ClickHouse是開源而且免費(fèi)的
2.云解決方案
例如:亞馬遜RedShift和谷歌的BigQuery
區(qū)別:ClickHouse可以使用自己機(jī)器部署,無(wú)需為云付費(fèi)
3.Hadoop生態(tài)軟件
例如:Cloudera Impala, Spark SQL, Facebook Presto , Apache Drill
區(qū)別:
ClickHouse支持實(shí)時(shí)的高并發(fā)系統(tǒng)
ClickHouse不依賴于Hadoop生態(tài)軟件和基礎(chǔ)
ClickHouse支持分布式機(jī)房的部署
4.開源OLAP數(shù)據(jù)庫(kù)
例如:InfiniDB, MonetDB, LucidDB
區(qū)別:這些項(xiàng)目的應(yīng)用的規(guī)模較小,并沒有應(yīng)用在大型的互聯(lián)網(wǎng)服務(wù)當(dāng)中,相比之下,ClickHouse的成熟度和穩(wěn)定性遠(yuǎn)遠(yuǎn)超過(guò)這些軟件。
5.開源分析,非關(guān)系型數(shù)據(jù)庫(kù)
例如:Druid , Apache Kylin
區(qū)別:ClickHouse可以支持從原始數(shù)據(jù)的直接查詢,ClickHouse支持類SQL語(yǔ)言,提供了傳統(tǒng)關(guān)系型數(shù)據(jù)的便利。
ClickHouse 快速的原因
有如下幾點(diǎn):
只需要讀取要計(jì)算的列數(shù)據(jù),而非行式的整行數(shù)據(jù)讀取,降低 IO cost。
同列同類型,有十倍壓縮提升,進(jìn)一步降低 IO。
Clickhouse 根據(jù)不同存儲(chǔ)場(chǎng)景,做個(gè)性化搜索算法。
參考資料:
ClickHouse概述
https://www.jianshu.com/p/350b59e8ea68
Clickhouse深度揭秘
https://zhuanlan.zhihu.com/p/98135840
Clickhouse教程
https://clickhouse.tech/docs/zh/getting-started/tutorial/
https://www.jianshu.com/p/350b59e8ea68
https://blog.csdn.net/likun557/article/details/109733541
Clickhouse架構(gòu)概述
https://clickhouse.tech/docs/zh/development/architecture/
Clickhouse實(shí)踐之路
https://www.jianshu.com/p/fca68daf4cbf
公眾號(hào)二維碼
End:如果有興趣了解金融量化交易和其他數(shù)據(jù)分析的實(shí)用技術(shù),歡迎關(guān)注本公眾號(hào)
