1、安装准备
操作系统:Centos8
3台服务器:server1、server2、server3
关闭selinux
关闭防火墙
配置系统打开文件数限制
安装JDK
安装zookeeper
配置主机名-IP映射
2、安装clickhouse
使用3台服务器,部署1分片3副本集群。

2.1  安装ClickHouse所需的依赖包
    yum -y install libtool *unixODBC*

    2.2 下载安装包
    下载地址:https://packages.clickhouse.com/rpm/stable/ 

    分别下载client,static,static-dbg,keeper-dbg和server五个安装包,五个包的版本要一致,这里以23.3.2.37版本为例。如:

    clickhouse-client-23.3.2.37.x86_64.rpm

    clickhouse-common-static-23.3.2.37.x86_64.rpm

    clickhouse-common-static-dbg-23.3.2.37.x86_64.rpm

    clickhouse-server-23.3.2.37.x86_64.rpm

    clickhouse-keeper-dbg-23.3.2.37.x86_64.rpm

    2.3 上传安装
    将下载的3个安装包,分别上传到3台服务器的/xcloud目录下,然后使用root用户,执行“rpm -ivh *.rpm”命令批量安装。

    安装过程中会提示输入密码,直接回车不设置密码,密码后面我们在配置文件中设置。

    注意:批量安装时,除clickhouse的5个安装包,/xcloud目录下应不包含其余rpm文件。

    2.4 目录说明
    安装完成后,系统中应生成如下目录:

目录

说明

/etc/clickhouse-server

服务端的配置文件目录,包括全局配置config.xml和用户配置users.xml等

/etc/clickhouse-client

客户端配置,包括conf.d文件夹和config.xml文件

/var/lib/clickhouse

默认的数据存储目录,建议修改路径到大容量磁盘

/var/log/clickhouse-server

默认保存日志的目录,建议修改路径到大容量磁盘

在大容量磁盘,创建数据存储目录、日志目录,替换上文的“/var/lib/clickhouse”、“/var/log/clickhouse-server ”。具体配置见下文。

    命令:

mkdir -p /xcloud/clickhouse/data

mkdir -p /xcloud/clickhouse/log

chown -R clickhouse:clickhouse /xcloud/clickhouse

chmod -R 755 /xcloud/

2.5 设置数据库密码
    安装clickhouse时,会创建一个默认用户default。我们可以在users.xml文件里,为它设置密码。命令如下:

cd /etc/clickhouse-server # 配置文件所在目录

cp users.xml user.xml.backup # 首先备份一下配置文件

vim users.xml # 编辑配置文件

:wq! # 配置文件只有读权限,所以需要强制保存,或者修改文件权限

在users.xml文件的第55行,添加用户密码,添加后如下:



    2.6 修改config.xml配置文件
    在“/etc/clickhouse-server”目录下,修改数据库的配置文件config.xml。

修改时区
配置文件第741行,修改后如下图:

开启外部访问
<listen_host>用于限制来源主机的请求,大约在配置文件第209行。

<listen_host>::</listen_host>

允许IP4和IP6源主机远程访问

<listen_host>0.0.0.0</listen_host>

仅允许IP4主机远程访问

<listen_host>::1</listen_host>

<listen_host>127.0.0.1</listen_host>

仅允许本地访问

本文因为禁用了IPV6,所以配置如下:

修改数据存放目录
配置文件第416行,修改后如下图:

修改日志存放目录
配置文件第25、26行,修改后如下图:

配置文件句柄数量
配置文件第371行,按需求修改:

http默认端口8123
配置文件第124行,默认即可。

tcp默认端口9000
配置文件第133行,默认即可。

zookeeper配置
大约在配置文件的1022行,按实际情况添加zookeeper的配置信息。这里是3个zookeeper节点,配置如下图:

集群配置
大约在配置文件第787行,<remote_servers>标签是ClickHouse 集群配置标签,固定写法。

<perftest_1shards_3replicas>标签是自定义的集群名称。通常,1shards,表示1个分片,3replicas表示每个分片有3个副本。

    <shard>,分片配置,一个 ClickHouse 集群可以分多个分片,每个分片可以存储数据,这里分片可以理解为 ClickHouse 机器中的每个节点,1个分片只能对应1个服务节点。这里可以配置一个或者任意多个分片,在每个分片中可以配置一个或任意多个副本,不同分片可配置不同数量的副本。如果只是配置一个分片,这种情况下查询操作应该称为远程查询,而不是分布式查询。

    <internal_replication>:默认为 false,写数据操作会将数据写入所有的副本。设置为 true,写操作只会选择一个正常的副本写入数据,其他副本通过zookeeper在后台进行同步,保证数据一致性。

    <replica>:每个分片的副本,默认每个分片配置了一个副本。也可以配置多个,副本的数量上限是由 ClickHouse 节点的数量决定的。如果配置了副本,读取操作可以从每个分片里选择一个可用的副本。如果副本不可用,会依次选择下个副本进行连接。该机制利于系统的可用性。

    本文中的集群,配置了1个分片,每个分片,3个副本。如下图:

复制表的替代参数配置
大约在配置文件的1037行,表示分片号,因为集群就一个分片,所以3个节点的分片号都是01,表示副本名称,三个节点的副本名称不能一样。

2.7 扩展配置文件metrika.xml
    在/etc/clickhouse-server/config.xml中,如果元素具有'incl'属性,则对其值将使用来自另一个文件的相应替换。默认情况下,替换文件的路径是/etc/metrika.xml。它可在'include_from'元素的配置中更改。

    本文中,没有使用扩展配置文件,而是直接在config.xml里修改所需配置。

3、启动clickhouse
命令如下:

systemctl start clickhouse-server # 启动clickhouse

systemctl status clickhouse-server # 查看clickhouse运行状态

systemctl stop clickhouse-server # 停止clickhouse

systemctl restart clickhouse-server # 重启clickhouse

4、验证
4.1 登录clickhouse
使用默认用户(default)登录当前节点。命令:

clickhouse-client --password

输出:



    登录指定节点,如XCloud181。命令:

clickhouse-client --host 192.168.0.181 --port=9000

输出:



    4.2 查看集群信息

select * from system.clusters;

SELECT * FROM system.zookeeper WHERE path = ‘/clickhouse’;

select * from system.macros;

4.3创建数据库

CREATE DATABASE db_test_01 ON CLUSTER perftest_1shards_3replicas;

4.4创建表
    参考资料:http://news.sohu.com/a/593781765_411876

    在perftest_1shards_3replicas集群的db_test数据库里,创建tb_test表。命令如下:

create table db_test.tb_test on cluster ‘perftest_1shards_3replicas’

(

id Int64,

p Int16

)

ENGINE = ReplicatedMergeTree( ‘/clickhouse/tables/{shard}/tb_test’, ‘{replica}’)

partition by p

order by id ;

输出:



    注释:

ReplicatedMergeTree表引,使得以上 MergeTree 家族拥有副本机制,保证高可用,用于生产环境,对于大数据量的表来说不推荐使用,因为副本是基于zk做数据同步的,大数据量会对zk造成巨大压力,成为整个ck整个集群瓶颈。业务可以根据数据重要程度在性能和数据副本之间做选择。
/clickhouse/tables/ 这一部分指定的是在ZK上创建的路径地址,可随意变换只要记得即可。
{shard} 指的是分片的标志,同一个分片内的所有机器应该保持相同。这里的数据就是在macros中配置的属性。
tb_test 建议使用表名称。
{replica} 指的是副本名称,这里就是在macros配置的节点ip。每台机器都是不一样的,因此就能确保每个表的识别符都是唯一的。

PARTITION BY:分区字段,强烈建议指定。
ORDER BY:排序字段。比如ORDER BY (Col1, Col2),值得注意的是,如果没有指定主键,默认情况下 sorting key(排序字段)即为主键。如果不需要排序,则可以使用ORDER BY tuple()语法,这样的话,创建的表也就不包含主键。这种情况下,ClickHouse会按照插入的顺序存储数据。必选。
4.5 写入数据
命令:

INSERT INTO db_test.tb_test VALUES(111,111);

INSERT INTO db_test.tb_test VALUES(222,222);

INSERT INTO db_test.tb_test VALUES(333,333);

INSERT INTO db_test.tb_test VALUES(444,444);

输出:



    4.6 查看数据
    命令:

select * from db_test.tb_test;

输出:

5、clickhouse集群的相关概念
5.1 副本
集群中的副本是防止数据丢失,增加数据冗余以保证数据的安全,或者实现读写分离。

5.2 分片
    集群中的分片是实现数据的水平切分,单张数据表可能会遇到瓶颈。

    如下图,假设ClickHouse的N个节点组成了一个集群,在集群的各个节点上,都有一张结构相同的数据表Y。如果它们的数据完全相同,则它们互为副本(红色部分)。如果N1的Y和N2的Y中的数据完全不同,则N1和N2互为分片(绿色部分)。



    分片和集群的使用方法。从数据表的初始形态1分片、0副本开始介绍;接着介绍如何为它添加副本,从而形成1分片、1副本的状态;再介绍如何引入分片,将其转换为多分片、1副本的形态(多副本的形态以此类推),如图下图所示。



    5.3 多分片多副本
    多分片多副本的情况下,最小需要4 台服务器,实际上如果资源紧张2台机器、3台机器都可以搭建一个 ClickHouse 多分片多副本的集群( 1 台机器只开一个实例)。

    使用3节点服务器搭建ClickHouse集群,在同一个节点放两个分片的数据,部署为环形架构,第一个分片在第一和第二节点上,第二个分片在第二和第三节点上,第三个分片在第三和第一节点上。



     ClickHouse 支持每个分片定义一个默认库,在配置文件中对应 default_database,从而使得两个不同的分片在同一节点上,实际是在两个不同的库中,这样就可以实现同一个节点放两个分片的数据。