一、 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');
06-29 22:09