1 前言
1.1 簡介
ClickHouse是一個用於聯機分析(OLAP)的列式數據庫管理系統(DBMS)。在傳統的行式數據庫系統中,處於同一行中的數據總是被物理的存儲在一起。而在列式數據庫系統中,來自不同列的值被單獨存儲,來自同一列的數據被存儲在一起。
ClickHouse 有以下重要優勢:
1. 真正的面向列的數據庫管理系統。在真正的面向列DBMS中,沒有額外的數據與值一起存儲。
2. 數據壓縮。它提供了在磁盤空間和CPU消耗之間權衡取舍的壓縮編解碼器,
3. 獨特的數據磁盤存放方式。按照主鍵對數據進行物理排序,可以提取數據的特定值或值范圍的低延遲(小於幾十毫秒)。
4. 多核並行處理。使用當前服務器上所有可用的必要資源,使大型查詢自然而然地並行化。
5. 在多台服務器上進行分布式處理。在ClickHouse中,數據可以駐留在不同的分片上。每個分片可以是一組用於容錯的副本。
6. SQL支持。 ClickHouse支持一種基於SQL的聲明式查詢語言,在許多情況下與ANSI SQL標准相同。
7. 向量計算引擎。數據不僅按列存儲,而且通過向量(列的一部分)進行處理,從而可以實現較高的CPU效率。
8. 數據復制和數據完整性支持。ClickHouse使用異步多主復制。寫入任何可用的副本后,所有其余副本在后台檢索其副本。系統在不同副本上維護相同的數據。
同時,它也有一些不足:
1. 不支持事務事務。
2. 缺乏以高速率和低延遲修改或刪除已插入數據的能力。但有批量刪除和更新可用於清理或修改數據。
3. 稀疏索引使得ClickHouse在點查詢中根據鍵檢索單行時效率不高。
ClickHouse的特性決定了它適合OLAP場景。本文將介紹clickhouse的基礎知識,常用功能和使用方法。
1.2實驗環境
服務器:
六台服務器,IP 地址和主機名分別如下:
IP地址 |
主機名 |
10.19.134.22 |
node01 |
10.19.134.23 |
node02 |
10.19.134.24 |
node03 |
10.19.134.25 |
node04 |
10.19.134.26 |
node05 |
10.19.134.27 |
node06 |
硬件:
CPU:邏輯CPU 8個,
內存:32GB
操作系統:
CentOS 7.7
軟件:
yum
ClickHouse 20.9.2.20
2 安裝ClickHouse
本文安裝的ClickHouse 20.9.2.20 ,需要以下依賴:
gcc 9.1
ninja 1.7.2
cmake 3.3
yum 3.4.3,並安裝了 Centos-7.repo 和 epel-7.repo
php
pthreads
我們分別介紹通過 yum 安裝和源碼安裝的方法。
2.1 通過yum 安裝
這個方法操作簡單,成功率高。
只需要執行如下幾條命令。
在中國:
yum install yum-utils
rpm --import https://mirrors.tuna.tsinghua.edu.cn/clickhouse/CLICKHOUSE-KEY.GPG
yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/clickhouse/rpm/stable/x86_64
yum install clickhouse-server clickhouse-client
在國外:
yum install yum-utils
rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG
yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/stable/x86_64
yum install clickhouse-server clickhouse-client
安裝后,程序會創建操作系統用戶clickhouse.
2.2 源碼安裝
這種方法操作復雜,成功率低。
1. 首先,使用yum安裝依賴組件:
yum -y install gcc
yum -y install gcc-c++
yum -y install zlib
yum -y install zlib-devel
yum -y install libtool
yum -y install -y libstdc++-static
yum -y install -y readline-devel
yum -y install -y libicu-devel
2. 安裝 cmake 3.3 以上的版本
2.1 下載 cmake 3.3 以上的版本。這里我們下載cmake-3.19.0-rc1.tar.gz.
2.2 解壓這個包,並進入解壓后的目錄
tar zxvf cmake-3.19.0-rc1.tar.gz.
2.3 編譯並安裝
./bootstrap
make && make install
3. 安裝 gcc 9.0
3.1 下載gcc 源碼,版本9.0以上。
wget https://ftp.gnu.org/gnu/gcc/gcc-9.1.0/gcc-9.1.0.tar.gz
3.2 解壓文件包並進入解壓后的目錄:
tar zxvf gcc-9.1.0.tar.gz
cd gcc-9.1.0
3.3 執行腳本download_prerequisites,下載所依賴庫。
./contrib/download_prerequisites
或者手動將這些包下載到gcc源碼的目錄中,然后解壓,並創建如下軟連接。
tar zxvf mpc-1.0.3.tar.gz
tar jxvf gmp-6.1.0.tar.bz2
tar jxvf isl-0.18.tar.bz2
tar jxvf mpfr-3.1.4.tar.bz2
ln -sf mpc-1.0.3 mpc
ln -sf gmp-6.1.0 gmp
ln -sf isl-0.18 isl
ln -sf mpfr-3.1.4 mpfr
3.4 編譯前配置
./configure --enable-languages=c,c++ --disable-multilib --disable-checking
3.5 擴大交換分區。gcc 的編譯和安裝需要很大的存儲空間。
SWAP=/tmp/swap
dd if=/dev/zero of=$SWAP bs=1M count=500
mkswap $SWAP
swapon $SWAP
3.6 編譯,這會花費1個小時左右的時間。
make -j 16
3.7之后正式安裝
make install
3.8 完成上述過程后,gcc會安裝到 /usr/local/bin。進入這個目錄,創建如下軟鏈接
ln -sf /usr/local/bin/gcc /usr/local/bin/gcc-9
ln -sf /usr/local/bin/g++ /usr/local/bin/g++-9
ln -sf /usr/local/bin/gcc /usr/local/bin/cc
ln -sf /usr/local/bin/g++ /usr/local/bin/c++
3.9 將動態庫 libstdc++.so 復制到 /usr/lib64 目錄中。對於gcc-9.1 需要復制的是 libstdc++.so.6.0.26。
cp ./x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/ libstdc++.so.6.0.26 /usr/lib64
3.10 在/usr/lib64中創建指向libstdc++.so.6.0.26的軟鏈接:
cd /usr/lib64
rm -f libstdc++.so.6
ln -s libstdc++.so.6.0.26 libstdc++.so.6
4. 安裝 clickhouse
4.1 聲明如下環境變量:
export CC=gcc-9
export CXX=g++-9
4.2 下載 ClickHouse源碼。本文下載的版本是20.9.2.20。
4.3 解壓這個包,並進入解壓后的目錄
tar ClickHouse-20.9.2.20-stable.tar.gz
cd ClickHouse-20.9.2.20-stable
4.4 編譯並安裝
mkdir build
cd build
cmake ..
ninja
4.5 安裝后,創建用戶clickhouse,用戶組clickhouse。
groupadd -g 993 clickhouse
useradd -g clickhouse --no-create-home -d /nonexistent --shell /bin/false clickhouse
3 配置
ClickHouse 的配置文件位於etc/clickhouse-server/中。ClickHouse支持多配置文件管理。主配置文件是 /etc/clickhouse-server/config.xml。其余文件在目錄 /etc/clickhouse-server/config.d中。
這一章介紹一些基本的配置。第8章會介紹一些針對特定的場景的配置。
1. 在初次安裝的clickhouse 中,配置監聽的地址。具體方法是編輯 /etc/clickhouse-server/config.xml,在 <yandex>…</yandex> 內部,配置listen_host。
例如:
<listen_host>::</listen_host>
表示監聽所有ip地址。
配置參數詳見服務器配置。
2. clickhouse的默認的用戶是“default”,初始是沒有密碼的。為了安全起見,應該為用戶 “default”設置密碼,還應該創建自定義的用戶。
為 default 設置密碼的方法:
1. 獲取自定義密碼的SHA256密文形式。
我們可以自己設置密碼。例如,這里密碼的明文為“default”,則獲取密文的方法如下:
[root@node01 ~]# echo -n "default" | sha256sum | tr -d '-'
37a8eec1ce19687d132fe29051dca629d164e2c4958ba141d5f4133a33f0688f
也可以生成隨機的密碼:
[root@node01 ~]# PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'
O96NIXfx
094c52130fd080481d988e02bd8fc2226ab12d2ec335a5993b6f3e2188c05337
上面的兩行結果分別是是明文密碼和密文密碼。
2. 編輯 users.xml,在yandex-> users->default中新增條目 <password_sha256_hex>,內容是上一步獲得的密文密碼,例如:
<password_sha256_hex>37a8eec1ce19687d132fe29051dca629d164e2c4958ba141d5f4133a33f0688f </password_sha256_hex>
它也支持明文密碼,標簽是 <password>,但安全性不如密文密碼。
3. 創建自定義用戶。編輯文件 users.xml,在yandex -> users中,新增用戶。本文中添加用戶 clickhouse,密碼是clickhouse。
<clickhouse>
<password_sha256_hex>7e099f39b84ea79559b3e85ea046804e63725fd1f46b37f281276aae20f86dc3</password_sha256_hex>
<access_management>1</access_management>
<networks incl="networks" replace="replace">
<ip>::/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
</clickhouse>
這里 access_management是一個很重要的參數,如果值為1,則表示用戶是超級用戶。如果值為或沒有配置,則用戶只能登錄。除非這個用戶得到超級用戶的授權。
4. 如果希望更安全,可以取消屬主以外用戶的對配置文件的讀寫權限。
cd /etc/clickhouse-server
chmod o-rwx *
5. 重啟數據庫即可
systemctl restart clickhouse-server.service