ClickHouse 简单使用(一)
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