详解 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;
相关推荐
科研前沿5 小时前
镜像视界 CameraGraph™+多智能体:构建自感知自决策的全域空间认知网络技术方案
大数据·运维·人工智能·数码相机·计算机视觉
晚风_END6 小时前
Linux|操作系统|最新版openzfs编译记录
linux·运维·服务器·数据库·spring·中间件·个人开发
发哥来了6 小时前
AI视频生成模型选型指南:五大核心维度对比评测
大数据·人工智能·机器学习·ai·aigc
发哥来了6 小时前
AI驱动生产线的实际落地:一个东莞厂商的技术选型实录
大数据·人工智能·机器学习·ai·aigc
dLYG DUMS6 小时前
DBeaver连接本地MySQL、创建数据库表的基础操作
数据库·mysql
历程里程碑7 小时前
4 Git远程协作:从零开始,玩转仓库关联与代码同步(带实操代码讲解)
大数据·c++·git·elasticsearch·搜索引擎·gitee·github
苍煜7 小时前
MySQL分库分表和ES到底怎么选?
数据库·mysql·elasticsearch
茉莉玫瑰花茶7 小时前
Qt 信号与槽 [ 1 ]
开发语言·数据库·qt
czlczl200209257 小时前
松散索引扫描/跳跃索引扫描
数据库·mysql·性能优化
AI周红伟8 小时前
周红伟:运营商一季度净利集体下滑 Token运营提速
大数据·网络·人工智能