篇一|ClickHouse快速入門


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的世界。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM