權露
Clickhouse是現(xiàn)在流行的OLAP數據庫之一,雖然名聲如雷貫耳,但在人們心目中總有一個疑問,到底為什么需要Clickhouse,是哪些優(yōu)點讓字節(jié)、騰訊這些大公司都選擇它作為最推薦的OLAP數據庫。
Clickhouse是一個開源使用列式存儲的OLAP數據庫,最初由Yandex公司開發(fā),現(xiàn)在從Yandex拆分出來并成立了獨立的Clickhouse Inc.,其功能類似于Google Analytics。它的目標是處理數萬億行和數PB的數據,并快速執(zhí)行分析和查詢。
Clickhouse等OLAP數據庫通常用于回答諸如“昨天有多少人訪問掘金?昨天有多少人訪問CSDN”之類的業(yè)務問題。如果使用傳統(tǒng)的OLTP數據庫來處理,可能需要幾分鐘甚至幾個小時。而如果使用OLAP數據庫,幾毫秒就可以得到結果。OLTP和OLAP之間的巨大速度差異是因為使用的底層存儲結構不同,OLTP數據庫通常使用行式存儲,OLAP則通常使用列式存儲。
列式存儲中的每一行數據都是分開存儲的。如果需要統(tǒng)計訪問次數,數據庫首先需要從訪問域名列中找到對應的ID,然后再對ID的訪問次數列求和。這樣數據庫就不需要再跨很多磁盤頁來檢索數據,因為它只需要先獲取滿足條件的列數據。這就是為什么使用列式存儲的數據庫進行分析查詢,比使用行式存儲的數據庫快很多。
Clickhouse是一個支持多種數據存儲引擎的數據庫,幾乎支持將任何數據源導入到Clickhouse數據庫中,并支持快速靈活的下鉆分析。比如,現(xiàn)在微信就使用Clickhouse來存儲日志數據,因為日志里面通常有非常多的重復值,使用Clickhouse可以得到非常高的壓縮率,減少日志占用的存儲空間。Cloudflare,Mux,Plausible,GraphCDN,Panelbear等公司則使用Clickhouse存儲流量數據,并在其儀表板中向用戶呈現(xiàn)相關報告。而Percona正在使用Clickhouse來存儲和分析數據庫性能指標。
Clickhouse并不能取代關系型數據,也不是為了處理事務性數據而開發(fā)的,Clickhouse更多是作為OLTP補充,方便用來進行數據分析。如果需要對數據進行更新和刪除,或者需要進行多表關聯(lián),那么不推薦使用Clickhouse。
另外也要避免把Clickhouse用作OLTP數據庫的副本。當然從技術上講,我們可以把OLTP數據庫的數據通過事件的方式同步到Clickhouse,但好的做法是使用Clickhouse作為數據的真實來源,而不是作為OLTP數據庫的鏡像。
開源社區(qū)很活躍
在評估開源軟件的時候,我們必須考慮它的社區(qū)是否活躍,如果使用了一個開源軟件,但是這個開源軟件突然就不維護了,就會讓人很尷尬。比如之前阿里的Dubbo。當然這種情況在開源的世界里面并不少見,需要盡可能地使用有大公司或組織背書的開源軟件。如果選擇使用Clickhouse就不需要擔心這些。不管是國內的字節(jié)、騰訊、阿里,還是國外的Cloudflare,eBay,Spotify,這些業(yè)界知名的公司都在使用Clickhouse。
飛快的查詢速度
根據Marko Medojevic的報告,如果對11 MB數據集進行分析查詢,Clickhouse的查詢速度會比MySQL快約260倍。然而,也許這種比較并不公平,因為MySQL畢竟是OLTP數據庫,但這也從側面反應了OLAP數據庫的優(yōu)勢所在。
Clickhouse實現(xiàn)的性能來自其獨特的數據庫引擎Merge Tree,而且Clickhouse也比較趨向于使用通用的硬件來做查詢性能優(yōu)化。
小索引(稀疏索引)
大家都知道在數據庫中快速查找數據的關鍵是索引。索引保存在內存中以便快速訪問,在OLTP數據庫中,索引通常使用B+樹來進行存儲。
這適用于OLTP數據庫,因為主鍵本質上是必不可少的。在OLTP數據庫中,通常是通過主鍵ID查詢數據庫,但是,一旦數據增長到數十億行并且索引在內存中放不下的時候,這種類型的索引局限性就非常明顯。
Clickhouse使用的索引和Kafka類似,其僅存儲索引數據的子集。這樣的好處是索引相對較小,就算是很大的數據量,其索引在內存里面也放得下。
想象一下如果要使用SELECT SUM(visit)FROM visit WHERE date BETWEEN 2022-10-01 AND 2022-10-31進行查詢,數據庫使用稀疏索引的方式就很合適,因為查詢條件是日期范圍,而不是主鍵ID。這就是為什么稀疏索引在OLAP數據庫中經常使用的原因。
數據壓縮
由于Clickhouse的數據是按列而不是按行存儲的,所以它能夠比行式數據庫更好地壓縮數據。有數據表明,同樣的數據放在Clickhouse相比放在PostgreSQL,所需的磁盤空間減少了70 %。另外在Clickhouse中,可以方便地指定列的數據壓縮算法和壓縮級別。
數據TTL
通常不建議無限制的存儲數據,這樣會浪費非常多的磁盤空間。一般情況下,設置一個合適的數據保留時間是比較好的選擇。在Clickhouse中,可以通過在創(chuàng)建表時設置數據的TTL輕松做到這一點。
適配多種語言
Clickhouse的社區(qū)非?;钴S,現(xiàn)在就已經支持Java,Go, Python等流行語言的SDK,如果使用Perl小眾語言,Clickhouse也支持通過HTTP接口操作訪問數據。
水平可擴展和高可用
Clickhouse在構建時就考慮了水平可擴展性和高可用性。我們可以將數據分片到多個節(jié)點并將數據復制到另一組服務器中。當然水平可擴展性和高可用性功能會帶來額外的復雜度,如果我們使用Kubernetes部署Clickhouse,可以使用Clickhouse Kubernetes Operator進行配置。
實話說,現(xiàn)在如果有數據分析的場景,個人想到的方案就是使用Clickhouse,如果再結合一下Superset等開源BI工具,我們就可以非??焖俚卮罱ㄆ饋磔p量的數據分析系統(tǒng),這對于大多數中小公司來說就已經完全夠用了。最后,如果想快速試用一下,推薦使用docker進行安裝。