OLAP 的技術(shù)研發(fā)與思考--ClickHouse 2023 總結(jié)和 2024 展望
一、ClickHouse 簡(jiǎn)介
1、ClickHouse 是什么?
- 開(kāi)源
ClickHouse 是一款開(kāi)源產(chǎn)品,自 2016 年首次開(kāi)源至今已經(jīng) 7 年時(shí)間;在這期間,有幸得到了全球 1300 余名開(kāi)發(fā)者的貢獻(xiàn);自開(kāi)源以來(lái),ClickHouse 已發(fā)布 500 多個(gè)版本。
- 列式數(shù)據(jù)庫(kù)
ClickHouse 的核心是以 C++ 和 assembly 編寫(xiě)的列式數(shù)據(jù)庫(kù),并在此基礎(chǔ)上進(jìn)行性能優(yōu)化,在聚合、排序、索引、后臺(tái)合并等方面均有出色的表現(xiàn),因此獲得了“世界上最快的數(shù)據(jù)庫(kù)”的稱號(hào)。
- 分布式架構(gòu)
ClickHouse 是一個(gè)高可用性的分布式系統(tǒng),既可以部署在單個(gè)節(jié)點(diǎn)上,也可以將不同的節(jié)點(diǎn)部署到同一數(shù)據(jù)中心,甚至可以將節(jié)點(diǎn)分散部署到多個(gè)不同的數(shù)據(jù)中心。
在擴(kuò)展性方面,作為一種 Multi-master 分布式系統(tǒng),既支持垂直擴(kuò)展,也支持水平擴(kuò)展;即便個(gè)別服務(wù)器出現(xiàn)故障,系統(tǒng)依然可以繼續(xù)運(yùn)行,不影響整體的服務(wù)體驗(yàn)。
- OLAP 數(shù)倉(cāng)
ClickHouse 是一種 OLAP 數(shù)據(jù)庫(kù),主要為處理不可變數(shù)據(jù)以及超大規(guī)模查詢而創(chuàng)建,支持?jǐn)?shù)百 PB 數(shù)據(jù)量的即時(shí)查詢服務(wù),同時(shí)也支持 BI 工具。
2、ClickHouse 的優(yōu)勢(shì)
- 輕量級(jí)快速查詢
ClickHouse 在大規(guī)模數(shù)據(jù)分析和查詢方面表現(xiàn)良好,聚合和計(jì)算速度都非???,如上圖右側(cè)截圖所示,ClickHouse 的表現(xiàn)顯著超越 Pinot、Redshift、Elasticsearch、Druid 等其他競(jìng)爭(zhēng)對(duì)手。
- 資源利用最大化
ClickHouse 采用行業(yè)領(lǐng)先的數(shù)據(jù)壓縮技術(shù),存儲(chǔ)效率提高數(shù)十倍至百倍。
- 方便上手,容易使用
ClickHouse 支持多種不同 Table Function,支持各種數(shù)據(jù)來(lái)源(例如 S3、Delta Lake、Iceberg、Hudi 等)的自助式數(shù)據(jù)引入,同時(shí)支持標(biāo)準(zhǔn) SQL 語(yǔ)法查詢,因此易于上手。
3、ClickHouse 的發(fā)展歷程
ClickHouse 最初于 2009 年基于互聯(lián)網(wǎng)規(guī)模分析需求而創(chuàng)建;在 2016 年 6 月,ClickHouse 以 Apache 2.0 許可證發(fā)布第一個(gè)版本;從右圖可以看出,自 2016 年起,ClickHouse 經(jīng)歷了飛速的發(fā)展,其增長(zhǎng)速度遠(yuǎn)超其他同類型項(xiàng)目。到 2021 年,ClickHouse Inc 成立,公司致力于投資開(kāi)源產(chǎn)品,實(shí)現(xiàn)技術(shù)的不斷優(yōu)化。公司去年推出云服務(wù),支持開(kāi)源軟件(OSS)的開(kāi)發(fā),并構(gòu)建托管的云 SaaS 產(chǎn)品;這樣,ClickHouse 不僅是一個(gè)開(kāi)源產(chǎn)品,同時(shí)也提供了云服務(wù)選項(xiàng)。
4、兩種 ClickHouse 運(yùn)營(yíng)模式
ClickHouse 有兩種運(yùn)營(yíng)模式:ClickHouse 自建和 ClickHouse Cloud,用戶可根據(jù)不同的場(chǎng)景選擇適當(dāng)?shù)哪J健?/span>
(1)ClickHouse 自建
ClickHouse 自建是最初的設(shè)計(jì)理念:用戶直接下載開(kāi)源軟件并部署到環(huán)境中;數(shù)據(jù)可以直接存儲(chǔ)在節(jié)點(diǎn)上,這是一種簡(jiǎn)潔高效的模式,數(shù)據(jù)和資源(如內(nèi)存、CPU 和磁盤)都直接歸屬于子節(jié)點(diǎn)。
然而這種存儲(chǔ)方式也有其缺點(diǎn):
- 容易出現(xiàn)節(jié)點(diǎn)丟失的情況;
- 新增節(jié)點(diǎn),會(huì)因數(shù)據(jù)的復(fù)制而耗費(fèi)較長(zhǎng)時(shí)間;
- 節(jié)點(diǎn)擴(kuò)展或節(jié)點(diǎn)維護(hù)等操作會(huì)遇到限制。
(2)ClickHouse Cloud
ClickHouse Cloud 是另外一種架構(gòu),該架構(gòu)使用的是對(duì)象存儲(chǔ)而不是本地硬盤存儲(chǔ),從而實(shí)現(xiàn)存算分離。使用這樣的架構(gòu)模式,計(jì)算資源可以維持在穩(wěn)定狀態(tài),這樣可以輕松替換出現(xiàn)問(wèn)題的節(jié)點(diǎn),同時(shí)可以快速實(shí)現(xiàn)擴(kuò)容或縮容;目前 ClickHouse 支持自動(dòng)擴(kuò)容或縮容,對(duì)于無(wú)服務(wù)器產(chǎn)品來(lái)說(shuō),大大提高了維護(hù)的便捷性,降低了維護(hù)成本。
5、ClickHouse 企業(yè)版在阿里云重磅上線
作為全球云戰(zhàn)略的關(guān)鍵組成部分,我們今年 3 月份宣布與阿里云達(dá)成合作,將 ClickHouse 引入中國(guó)市場(chǎng)。在運(yùn)營(yíng)模式上,阿里云版本與原始 ClickHouse 有諸多相似之處,兩者均采用存算分離架構(gòu),并支持自動(dòng)擴(kuò)容和縮容。
這里就產(chǎn)生了一個(gè)疑問(wèn):開(kāi)源和云端服務(wù)是否存在矛盾?答案顯然是不會(huì)存在矛盾。開(kāi)源技術(shù)是云產(chǎn)品的核心,如果沒(méi)有強(qiáng)大且持續(xù)發(fā)展的開(kāi)源技術(shù)支持,云產(chǎn)品往往很難取得成功;據(jù)了解,超過(guò)半數(shù)的云客戶都有使用過(guò)開(kāi)源產(chǎn)品的經(jīng)驗(yàn);另一方面,當(dāng)產(chǎn)品取得了一定的成功,會(huì)將收益資源回饋給開(kāi)源社區(qū),用于支持和發(fā)展開(kāi)源產(chǎn)品。因此,開(kāi)源產(chǎn)品和云產(chǎn)品之間相互扶持、相互促進(jìn)、共同發(fā)展,最終實(shí)現(xiàn)雙贏,共同推動(dòng)創(chuàng)業(yè)生態(tài)的繁榮。
6、ClickHouse 的使用場(chǎng)景
Uber 使用 ClickHouse 服務(wù)作為日志觀測(cè)平臺(tái),日寫(xiě)入量高達(dá)數(shù)十 PB。
二、ClickHouse 開(kāi)源產(chǎn)品的產(chǎn)品新特性
1、ClickHouse 開(kāi)源產(chǎn)品特性簡(jiǎn)介
在介紹 ClickHouse 開(kāi)源產(chǎn)品的產(chǎn)品新特性之前,首先要特別感謝所有對(duì) ClickHouse 作出貢獻(xiàn)的開(kāi)發(fā)者;在最近的日常版本中,新增 20 多位貢獻(xiàn)者,這些開(kāi)發(fā)者在 23.9 版本中首次提交了代碼。各位讀者如果有興趣,歡迎參與開(kāi)源版本的開(kāi)發(fā)過(guò)程,或者加入社區(qū)了解最新進(jìn)展。
ClickHouse 致力于處理大數(shù)據(jù),因此更快速地導(dǎo)入數(shù)據(jù)是我們的首要任務(wù)。在這方面發(fā)生了許多事情,一個(gè)典型的例子就是異步插入。這是一種批量插入的方式,可以高效地提高 I/O 和吞吐量。此外,我們還引入了去重插入的功能。有時(shí)用戶發(fā)出插入請(qǐng)求,但結(jié)果沒(méi)有返回,原因有很多種,也許是服務(wù)器宕機(jī)了,也許是網(wǎng)絡(luò)問(wèn)題,用戶很難辨別原因,也很難知道插入操作是否成功。而去重功能,會(huì)在服務(wù)器端維護(hù)最近請(qǐng)求的緩存,這樣當(dāng)發(fā)出重復(fù)的插入請(qǐng)求時(shí),如果這段數(shù)據(jù)已經(jīng)插入過(guò),則什么都不會(huì)發(fā)生;如果尚未插入,則繼續(xù)進(jìn)行;這樣可以確保不會(huì)重復(fù)插入數(shù)據(jù)。這是一個(gè)非常酷的功能。
當(dāng)然,整合也是 ClickHouse 非常重要的一部分。我將在演示的后半部分花更多時(shí)間談?wù)撜希貏e是關(guān)注數(shù)據(jù)湖的整合。
今年我們加入了 Hudi、Delta Lake、Iceberg 等不同的數(shù)據(jù)湖格式,當(dāng)然我們正在將這些整合到 ClickHouse 中。同時(shí),我們也在優(yōu)化 Parquet 的讀取性能,稍后會(huì)詳細(xì)介紹。
我們還非常關(guān)注半結(jié)構(gòu)化數(shù)據(jù)。當(dāng)然,已經(jīng)支持 ClickHouse 從 JSON 數(shù)據(jù)讀取一段時(shí)間了。在最新的版本中,我們?yōu)?JSON 引入了模式推斷,這樣只需查看一些對(duì)象并了解模式,就可以輕松進(jìn)行編組和解組。未來(lái)我們將繼續(xù)投資于 JSON 對(duì)象的支持,我們的目標(biāo)是使 JSON 在 ClickHouse 內(nèi)部成為本機(jī)的第一類類型,這樣使用 JSON 對(duì)象將會(huì)更加輕松。
2、Parquet Reading 速度提升
針對(duì) Parquet 讀取性能的提升,在 23.4 版本,實(shí)現(xiàn)了從 S3/URL 讀取數(shù)據(jù),速度提升 100 倍;在 23.6 版本,分區(qū)查詢速度提高了 2 倍,對(duì)于單個(gè)文檔查詢提高了 4 倍。之所以得到這樣顯著的提升,是因?yàn)橄到y(tǒng)只讀取相關(guān)的列,并根據(jù)范圍(range)跳過(guò)不必要的 block,并且以并行的方式進(jìn)行執(zhí)行。
3、MySQL 兼容性支持
常見(jiàn)的第三方 BI 工具大多只支持少數(shù)熱門的數(shù)據(jù)庫(kù);為了更好地實(shí)現(xiàn) BI 工具集成,我們改進(jìn)了與 MySQL Wire Protocol 和 SQL 的兼容性,使第三方工具能夠與 ClickHouse 無(wú)縫交互。我們?cè)谶@方面會(huì)繼續(xù)與更多的廠商合作,推出更多 BI 工具。
4、SSH 密鑰驗(yàn)證
ClickHouse 近期推出 SSH 密鑰驗(yàn)證,采用公鑰/私鑰組合的方式,將私鑰放在客戶端,公鑰存入 ClickHouse 中;這樣的方案比輸入密碼更快、更簡(jiǎn)單、更安全,能夠有效防止暴力破解、撞庫(kù)攻擊等行為,同時(shí)提高開(kāi)發(fā)者體驗(yàn)。
5、數(shù)據(jù)管理能力方面的擴(kuò)展
- 輕量級(jí)操作
在輕量級(jí)操作中,ClickHouse 主要關(guān)注數(shù)據(jù)的快速讀取。雖然大部分的數(shù)據(jù)是不可變數(shù)據(jù),但是在有些使用場(chǎng)景還是有大量數(shù)據(jù)刪除和數(shù)據(jù)更新的需求;如果使用傳統(tǒng)的方式來(lái)刪除數(shù)據(jù),會(huì)造成所有 part 重構(gòu),從而耗費(fèi)大量的 I/O 和 CPU;假如使用輕量級(jí)的刪除操作,首先給待刪除的數(shù)據(jù)添加標(biāo)簽,這樣后臺(tái)在數(shù)據(jù)合并時(shí)即可實(shí)現(xiàn)數(shù)據(jù)的徹底刪除,而不影響數(shù)據(jù)的讀取性能。
- 數(shù)據(jù)庫(kù)事務(wù)
數(shù)據(jù)庫(kù)事務(wù)的支持是用戶期待已久且備受歡迎的功能,實(shí)現(xiàn)了 ACID 屬性的進(jìn)一步優(yōu)化,并支持 ClickHouse 用戶不同的應(yīng)用場(chǎng)景;目前該功能仍在研發(fā)階段,會(huì)盡快推出這個(gè)功能。
- 查詢緩存
在開(kāi)發(fā)過(guò)程中,每次查詢操作相對(duì)較為耗時(shí),因此將首次查詢結(jié)果放入緩存,后期重復(fù)查詢可直接讀取查詢結(jié)果,這樣可以大大減少查詢延時(shí),降低資源消耗。
6、更加靈活豐富的數(shù)據(jù)分析能力
- 分析器
將分析器加入到 ClickHouse 配套服務(wù)中,并將其設(shè)置為默認(rèn)配置,從而增強(qiáng)多關(guān)聯(lián)子句的復(fù)雜查詢性能。
- 加強(qiáng) JOIN 性能
加強(qiáng) JOIN 操作的優(yōu)化,并支持自動(dòng)選擇 JOIN 方法(如 Merge Join、Grace Hash Join 等)。
- Inverted Indices / Vector Search
團(tuán)隊(duì)將繼續(xù)開(kāi)發(fā) inverted indices 和 vector search 演算法等新功能,并有望在 2024 年的穩(wěn)定版中推出。
7、向量搜索(Vector Search)
向量搜索目前尚處于實(shí)驗(yàn)階段,待測(cè)試穩(wěn)定后有望于 2024 年發(fā)布,感興趣的讀者可以訪問(wèn)我們的官方網(wǎng)站了解更多詳細(xì)信息。
三、問(wèn)答環(huán)節(jié)
Q1:ClickHouse 如何支持文本數(shù)據(jù)(如 JSON 數(shù)據(jù)以及日志數(shù)據(jù)等)這類半結(jié)構(gòu)化數(shù)據(jù)的查詢和過(guò)濾?
A1:ClickHouse 已經(jīng)支持 JSON 一段時(shí)間了,不過(guò)是以 experimental 的功能推出的。前兩個(gè)月 ClickHouse 在 github 上發(fā)布了 RFC,在一定程度上提升了 JSON 的讀取性能;然而目前仍然不是非常滿意,因此后期計(jì)劃重寫(xiě)這部分功能,以實(shí)現(xiàn)對(duì) JSON 更高效的支持。
對(duì)于半結(jié)構(gòu)化數(shù)據(jù)(log text data),目前 ClickHouse 支持通過(guò) stream 方式,使用 LIKE 方法對(duì) log data 實(shí)現(xiàn)查詢和過(guò)濾,不過(guò)查詢相對(duì)較慢;后期計(jì)劃完善這部分功能,提升搜索效率,不過(guò)現(xiàn)在仍處于實(shí)驗(yàn)階段。
Q2:ClickHouse 在原生 MPP 數(shù)據(jù)庫(kù)和 Elastic MPP 數(shù)據(jù)庫(kù)方面做了哪些改進(jìn)?
A2:由于傳統(tǒng)擴(kuò)容效率不高,因此 ClickHouse 創(chuàng)建了 Cloud 模式,以 Serverless 擴(kuò)展,云端推出 Table Engine 使用存算分離結(jié)構(gòu)。對(duì)于原生 MPP 數(shù)據(jù)庫(kù)和 Elastic MPP 數(shù)據(jù)庫(kù)方面尚未作出修改。
Q3:ClickHouse 對(duì)于類似 MySQL 的虛擬列或表達(dá)式列的支持情況如何?
A3:ClickHouse 已經(jīng)支持虛擬列,并且可以使用 MATERIALIZED 子句創(chuàng)建列。它類似于 MySQL 的虛擬列,總是基于另一列進(jìn)行計(jì)算,并且不占用存儲(chǔ)。詳見(jiàn):
https://clickhouse.com/docs/en/sql-reference/statements/create/table#materialized
Q4:關(guān)聯(lián)查詢方面,如何 JOIN 外部的 ElasticSearch 數(shù)據(jù)?
A4:ClickHouse 不支持 ElasticSearch 表引擎。但是,我們支持的表引擎有 MySQL、PostgreSQL、MongoDB、S3、Hive、Hudi、DeltaLake 等。并且可以使用它們進(jìn)行 JOIN。
Q5:ClickHouse 能完全取代 Spark 嗎?
A5:是的,ClickHouse 與 ANSI SQL 兼容,就像 Spark 一樣。
Q6:ClickHouse 能實(shí)現(xiàn)倒排索引嗎?
A6:根據(jù)實(shí)踐經(jīng)驗(yàn),如果不超過(guò)百級(jí)的 QPS,在億級(jí)至百億級(jí)的查詢量,token 數(shù)在千到萬(wàn)的級(jí)別,ClickHouse 一般都能做到亞秒級(jí)響應(yīng)。因此先前很多 ES 的場(chǎng)景現(xiàn)在都轉(zhuǎn)移到了 ClickHouse 中。
Q7:ClickHouse 集群規(guī)模如何?
A7:完整節(jié)點(diǎn)有幾千臺(tái),對(duì)于百億級(jí)別的數(shù)據(jù),使用單集群存儲(chǔ),一般情況使用 1 臺(tái) SSD 存儲(chǔ)就夠用了。
Q8:對(duì)于 BI 場(chǎng)景下的多表關(guān)聯(lián)需求,JOIN 性能的目標(biāo)和預(yù)期大概是什么水平?
A8:具體的目標(biāo)和預(yù)期目前很難量化,我們?cè)?2024 的 plan list 中已經(jīng)將這部分工作設(shè)定為高優(yōu)先級(jí)。