一、 clickhouse集群安装
1. 在各个节点上面安装并启动clickhouse-server
#使用脚本安装yum源
curl -s https://packagecloud.io/install/repositories/altinity/clickhouse/script.rpm.sh | sudo bash
#yum 安装 server 以及 client
sudo yum install -y clickhouse-server clickhouse-client
#启动clickhouse-server
systemctl start clickhouse-server.service
2. 修改配置文件 /etc/clickhouse-server/config.xml
<!-- 放开远程访问 -->
<listen_host>::</listen_host>
修改后重启一下clickhouse-server,此时每个节点上面的服务是独立的。
二、单分片多副本的配置
- 如果只使用副本,对数据表不进行分片,则只需要配置好zookeeper即可,不需要配置集群。
- 可以在 /etc/clickhouse-server/config.xml中进行配置,也可以在一个另外的配置文件中进行配置,而clickhouse默认会加载/etc/metrika.xml中的配置。
1. 在每个节点创建/etc/metrika.xml,添加以下内容
<yandex>
<!-- 配置zookeeper -->
<zookeeper-servers>
<node index="1">
<host>192.168.10.101</host>
<port>2181</port>
</node>
</zookeeper-servers>
<!-- 添加本节点的环境变量,在使用分布式DDL时使用,每个节点的变量可不同 -->
<macros>
<shard>test02</shard>
<replica>test02</replica>
</macros>
</yandex>
2. 在/etc/clickhouse-server/config.xml中配置
不配置的话,会造成副本之间无法同步,该配置在/etc/metrika.xml中添加无效,原因未知。
<interserver_http_host>192.168.10.102</interserver_http_host>
这是设置副本同步的ip,每个节点配置成自己的ip地址
3. 副本测试
-- 在每个节点上分别创建表
-- ReplicatedCollapsingMergeTree('/clickhouse/tables/01/t_order','test01',sign)
-- zookeeper path中的分片标识必须相同,而副本标识在每个节点建表时必须不相同
create table t_order
(
customer_id Int32 comment '连锁编号',
order_no String comment '订单号',
card_no String comment '会员卡号',
pay_money Decimal64(2) comment '支付金额',
store_no String comment '门店编号',
store_user_no String comment '店员编号',
buy_date Int8 comment '下单时间',
origin_money Decimal64(2) comment '应收金额',
year Int16 comment '下单时间-年 2018',
month Int32 comment '下单时间-月 201808',
day Int32 comment '下单时间-日 20180801',
pay_way String comment '支付方式',
create_date DateTime DEFAULT now() comment '入库时间',
sign Int8
)ENGINE =
ReplicatedCollapsingMergeTree('/clickhouse/tables/01/t_order','test01',sign)
partition by (year,month)
order by (customer_id,year,month,order_no);
-- 在test01节点上插入数据,然后在test02节点上可以查询
INSERT INTO t_order (customer_id, year, month, order_no, card_no, pay_money, store_no, store_user_no, buy_date, origin_money, day, pay_way, create_date, sign) VALUES (109817, 2020, 202012, '111', '-1', -1.00, '-1', '-1', -1, -1.00, -1, '保留数据', '2020-12-29 10:02:48', -1);
三、多分片单副本配置
1. 在每个节点创建/etc/metrika.xml,添加以下内容
注意:一个分片有N个副本就需要N个节点来部署,且不能与其他分片的副本处在同一节点。因为每个副本就是一个单独的进程,这和hdfs中的副本概念不一样。
我们也可以通过在一台机器上启动多个clickhouse-server 服务(指定不同的端口号)来启动多个节点。**
<yandex>
<!-- 配置zookeeper -->
<zookeeper-servers>
<node index="1">
<host>192.168.10.101</host>
<port>2181</port>
</node>
</zookeeper-servers>
<clickhouse_remote_servers>
<!-- 集群名字 -->
<cluster01>
<shard>
<internal_replication>true</internal_replication>
<!-- 如果在1个shard标签下定义N(N>=1)组replica,则该shard的语义表示1个分片和N-1个副本 -->
<replica>
<host>192.168.10.101</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>192.168.10.102</host>
<port>9000</port>
</replica>
</shard>
</cluster01>
</clickhouse_remote_servers>
<!-- 添加本节点的环境变量,在使用分布式DDL时使用,每个节点的变量可不同 -->
<macros>
<shard>test02</shard>
<replica>test02</replica>
</macros>
</yandex>
重启服务。查看集群
select * from system.clusters;
2. 创建分布式表
创建分布式表的方式有两种,一种是分别在每个节点上创建本地表和基于Distributed引擎的表,另一种是直接通过分布式DDL创建表
方式一 、在每台节点上分别建表
- 同一分片的不同副本,只有副本标识不一样
- 不同分片的分片和副本标识都不同
-- 创建本地表,注意zookeeper path和副本标识在每台节点上面不一样
CREATE TABLE stu_local(
id UInt8,
name String
)ENGINE =ReplicatedMergeTree('/clickhouse/tables/02/stu_local','test02')
ORDER BY id
PARTITION BY id;
CREATE TABLE stu_all(
id UInt8,
name String
)ENGINE =Distributed('cluster01','test','stu_local',id);
方式二 、通过分布式DDL创建表
只需要在一台节点上执行建表语句,指定集群,则会在各个节点上执行。
-- 创建本地表
CREATE TABLE stu_local on cluster 'cluster01'(
id UInt8,
name String
)ENGINE =ReplicatedMergeTree('/clickhouse/tables/{shard}/stu_local','{replica}')
ORDER BY id
PARTITION BY id;
-- 创建分布式表
CREATE TABLE stu_all on cluster 'cluster01' (
id UInt8,
name String
)ENGINE =Distributed('cluster01','test','stu_local',id);
insert into stu_all values(961,'ayy');