ClickHouse基础知识(七):ClickHouse的分片集群

副本虽然能够提高数据的可用性,降低丢失风险,但是每台服务器实际上必须容纳全量数据,对数据的横向扩容没有解决。

要解决数据水平切分的问题,需要引入分片的概念。通过分片把一份完整的数据进行切 分,不同的分片分布到不同的节点上,再通过 Distributed 表引擎把数据拼接起来一同使用。

Distributed 表引擎本身不存储数据,有点类似于 MyCat 之于 MySql,成为一种中间 件,通过分布式逻辑表来写入、分发、路由来操作多台节点不同分片的分布式数据。

注意:ClickHouse 的集群是表级别的,实际企业中,大部分做了高可用,但是没有用分片,避免降低查询性能以及操作集群的复杂性。

1. 集群写入流程(3 分片 2 副本共 6 个节点)

2. 集群读取流程(3分片 2副本共 6个节点)

3. 3分片 2 副本共 6 个节点集群配置(供参考)

配置的位置还是在之前的/etc/clickhouse-server/config.d/metrika-shard.xml,内容如下

<yandex>
    <clickhouse_remote_servers>
        <gmall_cluster> <!-- 集群名称-->
            <shard> <!--集群的第一个分片-->
                <internal_replication>true</internal_replication>
                <!--该分片的第一个副本-->
                <replica>
                    <host>hadoop100</host>
                    <port>9000</port>
                </replica>
                <!--该分片的第二个副本-->
                <replica>
                    <host>hadoop101</host>
                    <port>9000</port>
                </replica>
            </shard>
            <shard> <!--集群的第二个分片-->
                <internal_replication>true</internal_replication>
                <replica> <!--该分片的第一个副本-->
                    <host>hadoop101</host>
                    <port>9000</port>
                </replica>
                <replica> <!--该分片的第二个副本-->
                    <host>hadoop102</host>
                    <port>9000</port>
                </replica>
            </shard>
            <shard> <!--集群的第三个分片-->
                <internal_replication>true</internal_replication>
                <replica> <!--该分片的第一个副本-->
                    <host>hadoop103</host>
                    <port>9000</port>
                </replica>
                <replica> <!--该分片的第二个副本-->
                    <host>hadoop103</host>
                    <port>9000</port>
                </replica>
            </shard>
        </gmall_cluster>
    </clickhouse_remote_servers>
</yandex>

4. 配置三节点版本集群及副本

4.1 集群及副本规划(2 个分片,只有第一个分片有副本)

4.2 配置步骤

(1)在 hadoop102 的/etc/clickhouse-server/config.d 目录下创 建 metrika-shard.xml 文件

<?xml version="1.0"?>
<yandex>
    <clickhouse_remote_servers>
        <gmall_cluster> <!-- 集群名称-->
            <shard> <!--集群的第一个分片-->
                <internal_replication>true</internal_replication>
                <replica> <!--该分片的第一个副本-->
                    <host>hadoop100</host>
                    <port>9000</port>
                </replica>
                <replica> <!--该分片的第二个副本-->
                    <host>hadoop101</host>
                    <port>9000</port>
                </replica>
            </shard>
            <shard> <!--集群的第二个分片-->
                <internal_replication>true</internal_replication>
                <replica> <!--该分片的第一个副本-->
                    <host>hadoop102</host>
                    <port>9000</port>
                </replica>
            </shard>
        </gmall_cluster>
    </clickhouse_remote_servers>
    <zookeeper-servers>
        <node index="1">
            <host>hadoop100</host>
            <port>2181</port>
        </node>
        <node index="2">
            <host>hadoop101</host>
            <port>2181</port>
        </node>
        <node index="3">
            <host>hadoop102</host>
            <port>2181</port>
        </node>
    </zookeeper-servers>
    <macros>
        <shard>01</shard> <!--不同机器放的分片数不一样-->
        <replica>rep_1_1</replica> <!--不同机器放的副本数不一样-->
    </macros>
</yandex>

注意:xml文件中的注释要删除,不能有中文注释,要不然会报错

(2)将 hadoop102 的 metrika-shard.xml 同步到 100 和 101,同时更新一下config.xml

sudo ./bin/xsync.sh /etc/clickhouse-server/config.d/metrika-shard.xml 
 sudo ./bin/xsync.sh /etc/clickhouse-server/config.xml

(3) 修改 101 和 102 中 metrika-shard.xml 宏的配置

(6)重启三台服务器上的 ClickHouse 服务

sudo systemctl stop clickhouse-server
sudo systemctl start clickhouse-server
ps -ef |grep click

(7)在 hadoop100 上执行建表语句

➢ 会自动同步到 hadoop101 和 hadoop102 上

➢ 集群名字要和配置文件中的一致

➢ 分片和副本名称从配置文件的宏定义中获取

create table st_order_mt on cluster gmall_cluster (
 id UInt32,
 sku_id String,
 total_amount Decimal(16,2),
 create_time Datetime
) engine =ReplicatedMergeTree('/clickhouse/tables/{shard}/st_order_mt_0325','{replica}')
 partition by toYYYYMMDD(create_time)
 primary key (id)
 order by (id,sku_id);

可以到 hadoop101 和 hadoop102 上查看表是否创建成功

(8)在 hadoop100上创建 Distribute 分布式表

create table st_order_mt_all on cluster gmall_cluster
(
 id UInt32,
 sku_id String,
 total_amount Decimal(16,2),
 create_time Datetime
)engine = Distributed(gmall_cluster,default, st_order_mt,hiveHash(sku_id));

参数含义

Distributed(集群名称,库名,本地表名,分片键)

分片键必须是整型数字,所以用 hiveHash 函数转换,也可以 rand()

(9)在 hadoop100上插入测试数据

insert into st_order_mt_all values
(201,'sku_001',1000.00,'2020-06-01 12:00:00') ,
(202,'sku_002',2000.00,'2020-06-01 12:00:00'),
(203,'sku_004',2500.00,'2020-06-01 12:00:00'),
(204,'sku_002',2000.00,'2020-06-01 12:00:00'),
(205,'sku_003',600.00,'2020-06-02 12:00:00');

(10) 通过查询分布式表和本地表观察输出结果

➢ 分布式表

SELECT * FROM st_order_mt_all;

➢ 本地表

select * from st_order_mt;

➢ 观察数据的分布

5. 项目为了节省资源,就使用单节点,不用集群

不需要求改文件引用,因为已经使用集群建表了,如果改为引用 metrika-shard.xml 的话,启动会报错。我们以后用的时候只启动 102 即可。

相关推荐
期待着20135 天前
ClickHouse创建分布式表
数据库·clickhouse
昨天今天明天好多天6 天前
【ClickHouse】创建表
数据库·clickhouse·oracle
从未完美过6 天前
clickhouse自增id的处理
数据库·clickhouse
sunny052966 天前
ClickHouse数据库SSL配置和SSL连接测试
数据库·clickhouse·ssl
东皋长歌6 天前
ClickHouse创建账号和连接测试
clickhouse
gengjianchun9 天前
clickhouse 安装配置
服务器·网络·clickhouse
东皋长歌9 天前
ClickHouse安装
clickhouse
大嘴吧Lucy9 天前
实战攻略 | ClickHouse优化之FINAL查询加速
数据库·mysql·clickhouse
东皋长歌9 天前
SpringBoot+ClickHouse集成
clickhouse·springboot
从未完美过10 天前
ClickHouse集成Mysql表引擎跨服务器读表说明
服务器·mysql·clickhouse