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