详解 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;
相关推荐
云和恩墨7 小时前
OceanBase企业版会话级SQL跟踪实操:DBMS_MONITOR(类Oracle 10046事件)
数据库·sql·oracle·oceanbase
为什么不问问神奇的海螺呢丶7 小时前
oracle 数据库巡检 sql
数据库·sql·oracle
麦麦鸡腿堡7 小时前
MySQL数据库操作指令
数据库·mysql
未来之窗软件服务10 小时前
一体化系统(九)智慧社区综合报表——东方仙盟练气期
大数据·前端·仙盟创梦ide·东方仙盟·东方仙盟一体化
陈天伟教授13 小时前
人工智能训练师认证教程(2)Python os入门教程
前端·数据库·python
火星资讯14 小时前
Zenlayer AI Gateway 登陆 Dify 市场,轻装上阵搭建 AI Agent
大数据·人工智能
星海拾遗14 小时前
git rebase记录
大数据·git·elasticsearch
Elastic 中国社区官方博客14 小时前
Elasticsearch:在分析过程中对数字进行标准化
大数据·数据库·elasticsearch·搜索引擎·全文检索
聪明努力的积极向上14 小时前
【MYSQL】字符串拼接和参数化sql语句区别
数据库·sql·mysql
代码or搬砖14 小时前
RBAC(权限认证)小例子
java·数据库·spring boot