ClickHouse簡介
ClickHouse是一個用於聯機分析(OLAP)的列式數據庫管理系統(DBMS)。ClickHouse最初是一款名為Yandex.Metrica的產品,主要用於WEB流量分析。ClickHouse的全稱是Click Stream,Data WareHouse,簡稱ClickHouse。
ClickHouse非常適用於商業智能領域,除此之外,它也能夠被廣泛應用於廣告流量、Web、App流量、電信、金融、電子商務、信息安全、網絡游戲、物聯網等眾多其他領域。ClickHouse具有以下特點:
-
支持完備的SQL操作
-
列式存儲與數據壓縮
-
向量化執行引擎
-
關系型模型(與傳統數據庫類似)
-
豐富的表引擎
-
並行處理
-
在線查詢
-
數據分片
ClickHouse作為一款高性能OLAP數據庫,存在以下不足。
-
不支持事務。
-
不擅長根據主鍵按行粒度進行查詢(雖然支持),故不應該把ClickHouse當作Key-Value數據庫使用。
-
不擅長按行刪除數據(雖然支持)
單機安裝
下載RPM包
本文安裝方式選擇的是離線安裝,可以在下面的鏈接中下載對應的rpm包,也可以直接百度雲下載
-- rpm包地址
https://packagecloud.io/Altinity/clickhouse
-- 百度雲地址
鏈接:https://pan.baidu.com/s/1pFR66SzLvPYMfcpuPJww5A
提取碼:gh5a
在我們安裝的軟件中包含這些包:
clickhouse-client
包,包含 clickhouse-client 應用程序,它是交互式ClickHouse控制台客戶端。clickhouse-common
包,包含一個ClickHouse可執行文件。clickhouse-server
包,包含要作為服務端運行的ClickHouse配置文件。
總共包含四個RPM包,
clickhouse-client-19.17.4.11-1.el7.x86_64.rpm
clickhouse-common-static-19.17.4.11-1.el7.x86_64.rpm
clickhouse-server-19.17.4.11-1.el7.x86_64.rpm
clickhouse-server-common-19.17.4.11-1.el7.x86_64.rpm
尖叫提示:如果安裝過程中,報錯:依賴檢測失敗,表示缺少依賴包
可以先手動安裝libicu-50.2-4.el7_7.x86_64.rpm依賴包
關閉防火牆
## 查看防火牆狀態。
systemctl status firewalld
## 臨時關閉防火牆命令。重啟電腦后,防火牆自動起來。
systemctl stop firewalld
## 永久關閉防火牆命令。重啟后,防火牆不會自動啟動。
systemctl disable firewalld
系統要求
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 supported
要在不支持SSE 4.2或具有AArch64或PowerPC64LE體系結構的處理器上運行ClickHouse,應該通過源構建ClickHouse進行適當的配置調整。
安裝RPM包
## 將rpm包上傳至/opt/software目錄下
## 執行如下命令進行安裝
[root@cdh06 software]# rpm -ivh *.rpm
錯誤:依賴檢測失敗:
libicudata.so.50()(64bit) 被 clickhouse-common-static-19.17.4.11-1.el7.x86_64 需要
libicui18n.so.50()(64bit) 被 clickhouse-common-static-19.17.4.11-1.el7.x86_64 需要
libicuuc.so.50()(64bit) 被 clickhouse-common-static-19.17.4.11-1.el7.x86_64 需要
libicudata.so.50()(64bit) 被 clickhouse-server-19.17.4.11-1.el7.x86_64 需要
libicui18n.so.50()(64bit) 被 clickhouse-server-19.17.4.11-1.el7.x86_64 需要
libicuuc.so.50()(64bit) 被 clickhouse-server-19.17.4.11-1.el7.x86_64 需要
## 上面安裝報錯,缺少相應的依賴包,
## 需要下載相對應的依賴包
## 下載libicu-50.2-4.el7_7.x86_64.rpm進行安裝即可
查看安裝信息
目錄結構
-
/etc/clickhouse-server:服務端的配置文件目錄,包括全局配置config.xml和用戶配置users.xml等。
-
/etc/clickhouse-client:客戶端配置,包括conf.d文件夾和config.xml文件。
-
/var/lib/clickhouse:默認的數據存儲目錄(通常會修改默認路徑配置,將數據保存到大容量磁盤掛載的路徑)。
-
/var/log/clickhouse-server:默認保存日志的目錄(通常會修改路徑配置,將日志保存到大容量磁盤掛載的路徑)。
配置文件
- /etc/security/limits.d/clickhouse.conf:文件句柄數量的配置
[root@cdh06 clickhouse-server]# cat /etc/security/limits.d/clickhouse.conf
clickhouse soft nofile 262144
clickhouse hard nofile 262144
該配置也可以通過config.xml的max_open_files修改
<!-- Set limit on number of open files (default: maximum). This setting makes sense on Mac OS X because getrlimit() fails to retrieve correct maximum value. -->
<!-- <max_open_files>262144</max_open_files> -->
- /etc/cron.d/clickhouse-server:cron:定時任務配置,用於恢復因異常原因中斷的ClickHouse服務進程,其默認的配置如下。
[root@cdh06 cron.d]# cat /etc/cron.d/clickhouse-server
#*/10 * * * * root (which service > /dev/null 2>&1 && (service clickhouse-server condstart ||:)) || /etc/init.d/clickhouse-server condstart > /dev/null 2>&1
可執行文件
最后是一組在/usr/bin路徑下的可執行文件:
-
clickhouse:主程序的可執行文件。
-
clickhouse-client:一個指向ClickHouse可執行文件的軟鏈接,供客戶端連接使用。
-
clickhouse-server:一個指向ClickHouse可執行文件的軟鏈接,供服務端啟動使用。
-
clickhouse-compressor:內置提供的壓縮工具,可用於數據的正壓反解。
啟動/關閉服務
## 啟動服務
[root@cdh06 ~]# service clickhouse-server start
Start clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/
DONE
## 關閉服務
[root@cdh06 ~]# service clickhouse-server stop
客戶端連接
[root@cdh06 ~]# clickhouse-client
ClickHouse client version 19.17.4.11.
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 19.17.4 revision 54428.
cdh06 :) show databases;
SHOW DATABASES
┌─name────┐
│ default │
│ system │
└─────────┘
2 rows in set. Elapsed: 0.004 sec.
基本操作
創建數據庫
- 語法
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(...)]
- 例子
CREATE DATABASE IF NOT EXISTS tutorial
默認情況下,ClickHouse使用的是原生的數據庫引擎Ordinary(在此數據庫下可以使用任意類型的表引擎,在絕大多數情況下都只需使用默認的數據庫引擎)。當然也可以使用Lazy引擎和MySQL引擎,比如使用MySQL引擎,可以直接在ClickHouse中操作MySQL對應數據庫中的表。假設MySQL中存在一個名為clickhouse的數據庫,可以使用下面的方式連接MySQL數據庫。
-- --------------------------語法-----------------------------------
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')
-- --------------------------示例------------------------------------
CREATE DATABASE mysql_db ENGINE = MySQL('192.168.200.241:3306', 'clickhouse', 'root', '123qwe');
-- ---------------------------操作-----------------------------------
cdh06 :) use mysql_db;
cdh06 :) show tables;
SHOW TABLES
┌─name─┐
│ test │
└──────┘
1 rows in set. Elapsed: 0.005 sec.
cdh06 :) select * from test;
SELECT *
FROM test
┌─id─┬─name──┐
│ 1 │ tom │
│ 2 │ jack │
│ 3 │ lihua │
└────┴───────┘
3 rows in set. Elapsed: 0.047 sec.
創建表
- 語法
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [compression_codec] [TTL expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [compression_codec] [TTL expr2],
...
) ENGINE = engine
- 示例
-- 注意首字母大寫
-- 建表
create table test(
id Int32,
name String
) engine=Memory;
上面命令創建了一張內存表,即使用Memory引擎。表引擎決定了數據表的特性,也決定了數據將會被如何存儲及加載。Memory引擎是ClickHouse最簡單的表引擎,數據只會被保存在內存中,在服務重啟時數據會丟失。
集群安裝
安裝步驟
上面介紹了單機安裝的基本步驟和ClickHouse客戶端的基本使用。接下來將介紹集群的安裝方式。ClickHouse集群安裝非常簡單,首先重復上面步驟,分別在其他機器上安裝ClickHouse,然后再分別配置一下**/etc/clickhouse-server/config.xml和/etc/metrika.xml兩個文件即可。值得注意的是,ClickHouse集群的依賴於Zookeeper**,所以要保證先安裝好Zookeeper集群,zk集群的安裝步驟非常簡單,本文不會涉及。本文演示三個節點的ClickHouse集群安裝,具體步驟如下:
-
首先,重復單機安裝的步驟,分別在另外兩台機器安裝ClickHouse
-
然后,在每台機器上修改**/etc/clickhouse-server/config.xml**文件
<!-- 如果禁用了ipv6,使用下面配置--> <listen_host>0.0.0.0</listen_host> <!-- 如果沒有禁用ipv6,使用下面配置 <listen_host>::</listen_host> -->
尖叫提示(1):
在禁用了ipv6時,如果使用<listen_host>::</listen_host>配置,會報如下錯誤
Application: DB::Exception: Listen [::]:8123 failed: Poco::Exception. Code: 1000, e.code() =0, e.displayText() = DNS error: EAI: -9
尖叫提示(2):
ClickHouse默認的tcp端口號是9000,如果存在端口沖突,可以在**/etc/clickhouse-server/config.xml**文件中修改 端口號<tcp_port>9001</tcp_port>
-
最后在/etc下創建metrika.xml文件,內容如下,下面配置是不包含副本的分片配置,我們還可以為分片配置多個副本
<yandex> <!-- 該標簽與config.xml的<remote_servers incl="clickhouse_remote_servers" >保持一致 --> <clickhouse_remote_servers> <!-- 集群名稱,可以修改 --> <cluster_3shards_1replicas> <!-- 配置三個分片,每個分片對應一台機器--> <shard> <replica> <host>cdh04</host> <port>9001</port> </replica> </shard> <shard> <replica> <host>cdh05</host> <port>9001</port> </replica> </shard> <shard> <replica> <host>cdh06</host> <port>9001</port> </replica> </shard> </cluster_3shards_1replicas> </clickhouse_remote_servers> <!-- 該標簽與config.xml的<zookeeper incl="zookeeper-servers" optional="true" /> 保持一致 --> <zookeeper-servers> <node> <host>cdh02</host> <port>2181</port> </node> <node> <host>cdh03</host> <port>2181</port> </node> <node> <host>cdh06</host> <port>2181</port> </node> </zookeeper-servers> <!-- 分片和副本標識,shard標簽配置分片編號,<replica>配置分片副本主機名 需要修改對應主機上的配置--> <macros> <shard>01</shard> <replica>cdh04</replica> </macros> </yandex>
-
分別在各自的機器上啟動clickhouse-server
# service clickhouse-server start
-
(可選配置)修改**/etc/clickhouse-client/config.xml**文件
由於clickhouse-client默認連接的主機是localhost,默認連接的端口號是9000,由於我們修改了默認的端口號,所以需要修改客戶端默認連接的端口號,在該文件里添加如下內容:
<port>9001</port>
當然也可以不用修改,但是記得在使用客戶端連接時,加上**–port 9001**參數指明要連接的端口號,否則會報錯:
Connecting to localhost:9000 as user default. Code: 210. DB::NetException: Connection refused (localhost:9000)
基本操作
驗證集群
在完成上述配置之后,在各自機器上啟動clickhouse-server,並開啟clickhouse-clent
// 啟動server
# service clickhouse-server start
// 啟動客戶端,-m參數支持多行輸入
# clickhouse-client -m
可以查詢系統表驗證集群配置是否已被加載:
cdh04 :) select cluster,shard_num,replica_num,host_name,port,user from system.clusters;
接下來再來看一下集群的分片信息(宏變量):分別在各自機器上執行下面命令:
cdh04 :) select * from system.macros;
┌─macro───┬─substitution─┐
│ replica │ cdh04 │
│ shard │ 01 │
└─────────┴──────────────┘
cdh05 :) select * from system.macros;
┌─macro───┬─substitution─┐
│ replica │ cdh05 │
│ shard │ 02 │
└─────────┴──────────────┘
cdh06 :) select * from system.macros;
┌─macro───┬─substitution─┐
│ replica │ cdh06 │
│ shard │ 03 │
└─────────┴──────────────┘
分布式DDL操作
默認情況下,CREATE、DROP、ALTER、RENAME操作僅僅在當前執行該命令的server上生效。在集群環境下,可以使用ON CLUSTER語句,這樣就可以在整個集群發揮作用。
比如創建一張分布式表:
CREATE TABLE IF NOT EXISTS user_cluster ON CLUSTER cluster_3shards_1replicas
(
id Int32,
name String
)ENGINE = Distributed(cluster_3shards_1replicas, default, user_local,id);
Distributed表引擎的定義形式如下所示:關於ClickHouse的表引擎,后續文章會做詳細解釋。
Distributed(cluster_name, database_name, table_name[, sharding_key])
各個參數的含義分別如下:
- cluster_name:集群名稱,與集群配置中的自定義名稱相對應。
- database_name:數據庫名稱
- table_name:表名稱
- sharding_key:可選的,用於分片的key值,在數據寫入的過程中,分布式表會依據分片key的規則,將數據分布到各個節點的本地表。
尖叫提示:
創建分布式表是讀時檢查的機制,也就是說對創建分布式表和本地表的順序並沒有強制要求。
同樣值得注意的是,在上面的語句中使用了ON CLUSTER分布式DDL,這意味着在集群的每個分片節點上,都會創建一張Distributed表,這樣便可以從其中任意一端發起對所有分片的讀、寫請求。
創建完成上面的分布式表時,在每台機器上查看表,發現每台機器上都存在一張剛剛創建好的表。
接下來就需要創建本地表了,在每台機器上分別創建一張本地表:
CREATE TABLE IF NOT EXISTS user_local
(
id Int32,
name String
)ENGINE = MergeTree()
ORDER BY id
PARTITION BY id
PRIMARY KEY id;
我們先在一台機器上,對user_local表進行插入數據,然后再查詢user_cluster表
-- 插入數據
cdh04 :) INSERT INTO user_local VALUES(1,'tom'),(2,'jack');
-- 查詢user_cluster表,可見通過user_cluster表可以操作所有的user_local表
cdh04 :) select * from user_cluster;
┌─id─┬─name─┐
│ 2 │ jack │
└────┴──────┘
┌─id─┬─name─┐
│ 1 │ tom │
└────┴──────┘
接下來,我們再向user_cluster中插入一些數據,觀察user_local表數據變化,可以發現數據被分散存儲到了其他節點上了。
-- 向user_cluster插入數據
cdh04 :) INSERT INTO user_cluster VALUES(3,'lilei'),(4,'lihua');
-- 查看user_cluster數據
cdh04 :) select * from user_cluster;
┌─id─┬─name─┐
│ 2 │ jack │
└────┴──────┘
┌─id─┬─name──┐
│ 3 │ lilei │
└────┴───────┘
┌─id─┬─name─┐
│ 1 │ tom │
└────┴──────┘
┌─id─┬─name──┐
│ 4 │ lihua │
└────┴───────┘
-- 在cdh04上查看user_local
cdh04 :) select * from user_local;
┌─id─┬─name─┐
│ 2 │ jack │
└────┴──────┘
┌─id─┬─name──┐
│ 3 │ lilei │
└────┴───────┘
┌─id─┬─name─┐
│ 1 │ tom │
└────┴──────┘
-- 在cdh05上查看user_local
cdh05 :) select * from user_local;
┌─id─┬─name──┐
│ 4 │ lihua │
└────┴───────┘
總結
本文首先介紹了ClickHouse的基本特點和使用場景,接着闡述了ClickHouse單機版與集群版離線安裝步驟,並給出了ClickHouse的簡單使用案例。本文是ClickHouse的一個簡單入門,在接下來的分享中,會逐步深入探索ClickHouse的世界。