详解 ClickHouse 的分片集群

一、简介

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

ClickHouse 进行分片集群的目的是解决数据的横向扩容,通过分片把一份完整的数据进行切分,不同的分片分布到不同的节点上,再通过 Distributed 表引擎把数据拼接起来一同使用。

二、集群规划

3 分片 2 副本共 6 个节点,s 表示分片数,r 表示副本数

hadoop1 hadoop2 hadoop3 hadoop4 hadoop5 hadoop6
s1r1 s1r2 s2r1 s2r2 s3r1 s3r2

1. 写入流程

实际生产中会设置 internal_replication=true,开启副本内部同步

2. 读取流程

  • 优先选择 error_count 值小的副本进行读取
  • 当同一分片的 error_count 值相同时选择方式有随机、顺序、优先第一顺位和主机名称近似等四种

3. 集群配置

shell 复制代码
su root
cd /etc/clickhouse-server/config.d

vim metrika.xml

#添加配置
<yandex>
    <remote_servers>
        <gmall_cluster> <!-- 自定义集群名称-->
            <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>hadoop104</host>
                     <port>9000</port>
                 </replica>
             </shard>
             <shard> <!--集群的第三个分片-->
                 <internal_replication>true</internal_replication>
                 <replica> <!--该分片的第一个副本-->
                     <host>hadoop105</host>
                     <port>9000</port>
                 </replica>
                 <replica> <!--该分片的第二个副本-->
                     <host>hadoop106</host>
                     <port>9000</port>
                 </replica>
             </shard>
        </gmall_cluster>
    </remote_servers>
</yandex>

#也可以直接在 config.xml 的<remote_servers>中指定

三、三节点版本集群配置操作

生产上 ClickHouse 建议独立部署在服务器上,建议资源:100G内存,CPU为32线程

1. 分片及副本规划

hadoop102 hadoop103 hadoop104
s1r1 s1r2 s2r1

2. 实操步骤

  • 在 hadoop102 节点的 /etc/clickhouse-server/config.d 目录下创建 metrika-shard.xml 文件

    shell 复制代码
    su root
    cd /etc/clickhouse-server/config.d 
    vim metrika-shard.xml
    
    #添加配置
    <?xml version="1.0"?>
    <yandex>
        <remote_servers>
            <gmall_cluster> <!-- 自定义集群名称-->
                <shard> <!--集群的第一个分片-->
                    <internal_replication>true</internal_replication>
                    <replica> <!--该分片的第一个副本-->
                        <host>hadoop102</host>
                        <port>9000</port>
                    </replica>
                    <replica> <!--该分片的第二个副本-->
                        <host>hadoop103</host>
                        <port>9000</port>
                    </replica>
                </shard>
                <shard> <!--集群的第二个分片-->
                    <internal_replication>true</internal_replication>
                    <replica> <!--该分片的第一个副本-->
                        <host>hadoop104</host>
                        <port>9000</port>
                    </replica>
                </shard>
            </gmall_cluster>
        </remote_servers>
        <zookeeper-servers>
            <node index="1">
            <host>hadoop102</host>
            <port>2181</port>
            </node>
            <node index="2">
            <host>hadoop103</host>
            <port>2181</port>
            </node>
            <node index="3">
            <host>hadoop104</host>
            <port>2181</port>
            </node>
        </zookeeper-servers>
        <macros>
            <shard>01</shard> <!--不同机器放的分片数不一样-->
            <replica>rep_1_1</replica> <!--不同机器放的副本数不一样-->
        </macros>
    </yandex>
    
    chown clickhouse:clickhouse metrika-shard.xml
    
    #也可以直接在 config.xml 的<remote_servers>中指定
  • 在 hadoop102 上修改 /etc/clickhouse-server/config.xml

    shell 复制代码
    cd /etc/clickhouse-server
    
    vim config.xml
    
    #添加外部文件路径
    <zookeeper incl="zookeeper-servers" optional="true" />
    <include_from>/etc/clickhouse-server/config.d/metrika-shard.xml</include_from>
  • 分发配置到 hadoop103 和 hadoop104

    shell 复制代码
    /etc/clickhouse-server/config.d/metrika-shard.xml
    /etc/clickhouse-server/config.xml
  • 分别修改 hadoop103 和 hadoop104 中 metrika-shard.xml<macros> 的配置

    shell 复制代码
    #hadoop103
    sudo vim /etc/clickhouse-server/config.d/metrika-shard.xml
    
    <macros>
        <shard>01</shard> <!--不同机器放的分片数不一样-->
        <replica>rep_1_2</replica> <!--不同机器放的副本数不一样-->
    </macros>
    
    #hadoop104
    sudo vim /etc/clickhouse-server/config.d/metrika-shard.xml
    
    <macros>
        <shard>02</shard> <!--不同机器放的分片数不一样-->
        <replica>rep_2_1</replica> <!--不同机器放的副本数不一样-->
    </macros>
  • 分别在三台节点上启动 clickhouse 服务

    shell 复制代码
    sudo clickhouse start
  • 在 hadoop102 上创建一张本地表

    sql 复制代码
    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','{replica}')
    partition by toYYYYMMDD(create_time)
    primary key (id)
    order by (id,sku_id);
    
    --on cluster 的集群名字要和配置文件中自定义的集群名一致
    --分片和副本名称从配置文件的宏定义中获取
    --hadoop103 和 hadoop104 上会自动同步创建这张表
  • 在 hadoop102 上创建 Distribute 分布式表

    sql 复制代码
    create table st_order_mt_all2 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));
    
    --on cluster 的集群名字要和配置文件中自定义的集群名一致
    --hadoop103 和 hadoop104 上会自动同步创建这张表
    --表引擎为 Distributed,其中的参数分别为:集群名称,数据库名,本地表名,分片键
    --分片键必须是整型数字,所以用 hiveHash 函数转换,也可以 rand()
  • 向 hadoop102 上的分布式表插入数据

    sql 复制代码
    insert into st_order_mt_all2 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');
  • 分别在 hadoop102、hadoop103 和 hadoop104 上查询本地表和分布式表的数据进行对比

    sql 复制代码
    --hadoop102
    select * from st_order_mt;
    select * from st_order_mt_all2;
    
    --hadoop103
    select * from st_order_mt;
    select * from st_order_mt_all2;
    
    --hadoop104
    select * from st_order_mt;
    select * from st_order_mt_all2;
相关推荐
做梦敲代码8 分钟前
达梦数据库-读写分离集群部署
数据库·达梦数据库
小蜗牛慢慢爬行1 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
hanbarger1 小时前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
微服务 spring cloud1 小时前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
先睡1 小时前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
弗罗里达老大爷1 小时前
Redis
数据库·redis·缓存
仰望大佬0072 小时前
Avalonia实例实战五:Carousel自动轮播图
数据库·microsoft·c#
学不透java不改名2 小时前
sqlalchemy连接dm8 get_columns BIGINT VARCHAR字段不显示
数据库
一只路过的猫咪2 小时前
thinkphp6使用MongoDB多个数据,聚合查询的坑
数据库·mongodb