概述
定義
ClickHouse官網地址 https://clickhouse.com/ 最新版本22.4.5.9
ClickHouse官網文件地址 https://clickhouse.com/docs/zh
ClickHouseGitHub原始碼地址 https://github.com/ClickHouse/ClickHouse
ClickHouse是俄羅斯的 Yandex 於 2016 年開源的用於線上分析處理查詢(OLAP :Online Analytical Processing)MPP架構的列式儲存資料庫(DBMS:Database Management System),能夠使用 SQL 查詢實時生成分析資料包告。ClickHouse的全稱是Click Stream,Data WareHouse。ClickHouse可以做使用者行為分析,流批一體,其線性擴充套件和可靠性保障能夠原生支援 分片和副本,shard + replication,ClickHouse沒有走hadoop生態自己實現分散式儲存。
- OLAP場景的關鍵特徵
- 絕大多數是讀請求
- 資料以相當大的批次(> 1000行)更新,而不是單行更新;或者根本沒有更新。
- 已新增到資料庫的資料不能修改。
- 對於讀取,從資料庫中提取相當多的行,但只提取列的一小部分。
- 寬表,即每個表包含著大量的列
- 查詢相對較少(通常每臺伺服器每秒查詢數百次或更少)
- 對於簡單查詢,允許延遲大約50毫秒
- 列中的資料相對較小:數字和短字串(例如,每個URL 60個位元組)
- 處理單個查詢時需要高吞吐量(每臺伺服器每秒可達數十億行)
- 事務不是必須的
- 對資料一致性要求低
- 每個查詢有一個大表。除了他以外,其他的都很小。
- 查詢結果明顯小於源資料。換句話說,資料經過過濾或聚合,因此結果適合於單個伺服器的RAM中
- 很容易可以看出,OLAP場景與其他通常業務場景(例如,OLTP或K/V)有很大的不同, 因此想要使用OLTP或Key-Value資料庫去高效的處理分析查詢場景,並不是非常完美的適用方案。例如,使用OLAP資料庫去處理分析請求通常要優於使用MongoDB或Redis去處理分析請求。
- 列式資料庫更適合OLAP場景的原因
- 針對分析類查詢,通常只需要讀取表的一小部分列。在列式資料庫中你可以只讀取你需要的資料。例如,如果只需要讀取100列中的5列,這將幫助你最少減少20倍的I/O消耗。
- 由於資料總是打包成批量讀取的,所以壓縮是非常容易的。同時資料按列分別儲存這也更容易壓縮。這進一步降低了I/O的體積。
- 由於I/O的降低,這將幫助更多的資料被系統快取。
- CPU
- 向量引擎:所有的操作都是為向量而不是為單個值編寫的。這意味著多個操作之間的不再需要頻繁的呼叫,並且呼叫的成本基本可以忽略不計。操作程式碼包含一個優化的內部迴圈。
- 程式碼生成:生成一段程式碼,包含查詢中的所有操作。
特性
- 真正的列式資料庫管理系統:ClickHouse不單單是一個資料庫, 它是一個資料庫管理系統。因為它允許在執行時建立表和資料庫、載入資料和執行查詢,而無需重新配置或重啟服務.
- 資料壓縮:支援通用壓縮編解碼器之外,ClickHouse還提供針對特定型別資料的專用編解碼器。
- 資料的磁碟儲存:ClickHouse被設計用於工作在傳統磁碟上的系統,它提供每GB更低的儲存成本,但如果可以使用SSD和記憶體,它也會合理的利用這些資源。
- 多核心並行處理
- 多伺服器分散式處理
- 支援SQL
- 向量引擎
- 實時的資料更新
- 索引
- 適合線上查詢
- 支援近似計算
- 自適應連線演算法
- 支援資料複製和資料完整性
- 角色的訪問控制
- 限制
- 沒有完整的事務支援。
- 缺少高頻率,低延遲的修改或刪除已存在資料的能力。僅能用於批量刪除或修改資料,但這符合 GDPR。
- 稀疏索引使得ClickHouse不適合通過其鍵檢索單行的點查詢。
效能
- 單個大查詢吞吐量:如果資料被放置在page cache中,則一個不太複雜的查詢在單個伺服器上大約能夠以2-10GB/s(未壓縮)的速度進行處理。
- 處理短查詢的延遲時間:如果一個查詢使用主鍵並且沒有太多行(幾十萬)進行處理,並且沒有查詢太多的列,那麼在資料被page cache快取的情況下,它的延遲應該小於50毫秒。
- 處理大量短查詢的吞吐量:在相同的情況下,ClickHouse可以在單個伺服器上每秒處理數百個查詢。
- 寫入速度大約為50到200MB/s。如果您寫入的資料每行為1Kb,那麼寫入的速度為50,000到200,000行每秒。
為什麼ClickHouse這麼快?
- 面向列的儲存:源資料通常包含數百甚至數千列,而報表可以只使用其中的少數列。系統需要避免讀取不必要的列,否則最昂貴的磁碟讀取操作將被浪費。
- 索引:ClickHouse將資料結構儲存在記憶體中,不僅允許讀取已使用的列,還允許讀取這些列的必要行範圍。
- 資料壓縮:將同一列的不同值儲存在一起通常會帶來更好的壓縮比(與面向行的系統相比),因為在實際資料中,列的相鄰行通常具有相同或不那麼多的不同值。除了通用壓縮,ClickHouse還支援專門的編解碼器,可以使資料更加緊湊。
- 向量化查詢執行:ClickHouse不僅在列中儲存資料,還在列中處理資料。它可以提高CPU快取利用率,並允許使用SIMD CPU指令。
- 可伸縮性:ClickHouse可以利用所有可用的CPU核和磁碟執行單個查詢。不僅在單個伺服器上,而且在叢集的所有CPU核和磁碟上也是如此。
安裝部署
系統要求
ClickHouse可以在任何具有x86_64,AArch64或PowerPC64LE CPU架構的Linux,FreeBSD或Mac OS X上執行。
官方預構建的二進位制檔案通常針對x86_64進行編譯,並利用SSE 4.2
指令集,因此,除非另有說明,支援它的CPU使用將成為額外的系統需求。下面是檢查當前CPU是否支援SSE 4.2的命令:
$ grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"
要在不支援SSE 4.2
或AArch64
,PowerPC64LE
架構的處理器上執行ClickHouse,您應該通過適當的配置調整從原始碼構建ClickHouse。
可用安裝包
- DEB安裝包
- RPM安裝包
- Tgz安裝包
- Docker安裝包
- 其他環境安裝包
- 使用原始碼安裝
安裝包列表:
clickhouse-common-static
— ClickHouse編譯的二進位制檔案。clickhouse-server
— 建立clickhouse-server
軟連線,並安裝預設配置服務clickhouse-client
— 建立clickhouse-client
客戶端工具軟連線,並安裝客戶端配置檔案。clickhouse-common-static-dbg
— 帶有除錯資訊的ClickHouse二進位制檔案。
單機RPM包安裝
單機部署比較簡單,執行完下面四條命令就可以通過clickhouse-client來操作了
yum install -y yum-utils
yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo
yum install -y clickhouse-server clickhouse-client
/etc/init.d/clickhouse-server start
叢集部署
ClickHouse叢集是一個同質叢集,操作步驟如下
- 分別在ckserver1(192.168.5.52)、ckserver2(192.168.5.53)、huawei27(192.168.12.27)這三臺上按照上面的單機部署前面3行命令安裝ClickHouse服務端。需提前準備Zookeeper,這樣使用的是提前建好的3臺Zookeeper叢集(Zookeeper部署可以檢視之前的文章)。
- 在配置檔案中設定叢集配置。主要配置zookeeper、remote_servers和macros節點資料,而macros資料在每個節點分別配置,ckserver1配置為01,ckserver2配置02,huawei27配置為03,在下面示例為配置一個3個分片和3個副本的叢集。
<zookeeper>
<node>
<host>huawei27</host>
<port>2181</port>
</node>
<node>
<host>huawei28</host>
<port>2181</port>
</node>
<node>
<host>huawei29</host>
<port>2181</port>
</node>
</zookeeper>
<remote_servers>
<perftest_3shards_3replicas>
<shard>
<replica>
<host>ckserver1</host>
<port>9000</port>
</replica>
<replica>
<host>ckserver2</host>
<port>9000</port>
</replica>
<replica>
<host>huawei27</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>ckserver1</host>
<port>9000</port>
</replica>
<replica>
<host>ckserver2</host>
<port>9000</port>
</replica>
<replica>
<host>huawei27</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>ckserver1</host>
<port>9000</port>
</replica>
<replica>
<host>ckserver2</host>
<port>9000</port>
</replica>
<replica>
<host>huawei27</host>
<port>9000</port>
</replica>
</shard>
</perftest_3shards_3replicas>
</remote_servers>
<macros>
<shard>01</shard>
<replica>01</replica>
</macros>
修改完配置後分別在三臺上執行/etc/init.d/clickhouse-server start,查詢叢集資訊如下
介面
- ClickHouse提供了一個原生命令列客戶端
clickhouse-client
客戶端支援命令列--host, -h
-– 服務端的host名稱, 預設是localhost
。您可以選擇使用host名稱或者IPv4或IPv6地址。--port
– 連線的埠,預設值:9000。注意HTTP介面以及TCP原生介面使用的是不同埠。--user, -u
– 使用者名稱。 預設值:default
。--password
– 密碼。 預設值:空字串。--query, -q
– 使用非互動模式查詢。--database, -d
– 預設當前操作的資料庫. 預設值:服務端預設的配置(預設是default
)。--multiline, -m
– 如果指定,允許多行語句查詢(Enter僅代表換行,不代表查詢語句完結)。--multiquery, -n
– 如果指定, 允許處理用;
號分隔的多個查詢,只在非互動模式下生效。--format, -f
– 使用指定的預設格式輸出結果。--vertical, -E
– 如果指定,預設情況下使用垂直格式輸出結果。這與–format=Vertical
相同。在這種格式中,每個值都在單獨的行上列印,這種方式對顯示寬表很有幫助。--time, -t
– 如果指定,非互動模式下會列印查詢執行的時間到stderr
中。--stacktrace
– 如果指定,如果出現異常,會列印堆疊跟蹤資訊。--config-file
– 配置檔案的名稱。--secure
– 如果指定,將通過安全連線連線到伺服器。--history_file
— 存放命令歷史的檔案的路徑。--param_<name>
— 查詢引數配置。
- HTTP客戶端:HTTP介面允許您在任何程式語言的任何平臺上使用ClickHouse,HTTP介面比原生介面受到更多的限制,但它具有更好的相容性。預設情況下,
clickhouse-server
會在8123
埠上監控HTTP請求(這可以在配置中修改)。如果你傳送了一個未攜帶任何引數的GET /
請求,它會返回一個字串 «Ok.» - MySQL介面:ClickHouse支援MySQL wire通訊協議。
- JDBC驅動
- 官網驅動
- 第三方驅動:
- ClickHouse-Native-JDBC
- clickhouse4j
- ODBC驅動
- C++客戶端庫
- 第三方工具
- 客戶端開發庫,支援多種語言如Python、Java、Go、Php、NodeJs、Swift、Ruby、R、Scala、C#、Kotlin等等
- 第三方整合庫
- 關聯式資料庫:MySQL、MSSQL、PostgreSQL
- 訊息佇列:Kafka
- 流處理:Flink
- 物件儲存:S3
- 容器編排:Kubernetes
- 監控:Grafana、Prometheus、Zabbix
- 第三方代理
- chproxy
- KittenHouse
- ClickHouse-Bulk
- 第三方開發的視覺化介面
- 開源
- Tabix
- HouseOps
- 燈塔
- DBeaver
- clickhouse-cli
- clickhouse-flamegraph
- DBM
- 商業
- Holistics
- DataGrip
- 開源
建立資料庫
預設情況下,ClickHouse使用Atomic資料庫引擎。它提供了可配置的table engines和SQL dialect。建立一個測試資料庫
CREATE DATABASE test ENGINE = Atomic;
use test;
建立資料表
# -m支援多行輸入
clickhouse-client -m
使用最常見的MergeTree表引擎建立一張使用者資訊表user_info
CREATE TABLE user_info
(
id INT,
name String,
age Int8,
sex Int8,
career INT,
birthday Date
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(birthday)
ORDER BY (career, birthday);
# user_info插入兩行資料
insert into user_info values(100,'張三',27,1,1000,'1998-05-21'),(101,'李婷',28,2,1001,'2000-07-25');
# 查詢user_info資料
select * from user_info;
至此,ClickHouse的環境已經完全準備就緒,下一篇我們先通過一個案例需求學習ClickHouse使用,然後再層層深入。