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,从而使得两个不同的分片在同一节点上,实际是在两个不同的库中,这样就可以实现同一个节点放两个分片的数据。