前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Clickhouse副本及分片

Clickhouse副本及分片

作者头像
awwewwbbb
发布2022-05-11 08:45:34
1.1K0
发布2022-05-11 08:45:34
举报
文章被收录于专栏:chaplinthink的专栏

副本

副本的目的主要是保障数据的高可用性,即使一台 ClickHouse 节点宕机,那么也可以从其他服务器获得相同的数据

配置副本

1. zookeeper集群准备

2. Clickhouse准备两个节点

Node1, Node2 在 Node1 的/etc/clickhouse-server/config.d 目录下创建一个名为 metrika.xml 的配置文件,内容如下: 注:也可以不创建外部文件,直接在 config.xml 中指定

代码语言:javascript
复制
vim /etc/clickhouse-server/config.d/metrika.xml
<?xml version="1.0"?>
<yandex>
    <zookeeper-servers>
        <node index="1">
            <host>node2</host>
            <port>2181</port>
        </node>
        <node index="2">
            <host>xxx</host>
            <port>2181</port>
        </node>
        <node index="3">
            <host>xxx</host>
            <port>2181</port>
        </node>
        </zookeeper-servers>
</yandex>

3. 同步到Node2

代码语言:javascript
复制
scp /etc/clickhouse-server/config.d/metrika.xml root@Node2:/etc/clickhouse-server/config.d/

4. 在 Node1 的/etc/clickhouse-server/config.xml 中增加

代码语言:javascript
复制
<zookeeper incl="zookeeper-servers" optional="true" />
<include_from>/etc/clickhouse-server/config.d/metrika.xml</include_from>

同步到node2

重启clickhouse:

代码语言:javascript
复制
sudo clickhouse restart

5. 在 Node1 和 Node2 上分别建表

代码语言:javascript
复制
create table t_order_rep7 (
id UInt32,
sku_id String,
total_amount Decimal(16,2),
create_time Datetime
) engine =ReplicatedMergeTree('/clickhouse/table/01/t_order_rep7','rep_fz_102')
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id);
代码语言:javascript
复制
create table t_order_rep7 (
id UInt32,
sku_id String,
total_amount Decimal(16,2),
create_time Datetime
) engine =ReplicatedMergeTree('/clickhouse/table/01/t_order_rep7','rep_fz_103')
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id);

参数解释: ReplicatedMergeTree 中, 第一个参数是分片的 zk_path 一般按照:/clickhouse/table/{shard}/{table_name} 的格式写,如果只有一个分片就写 01 即可。 第二个参数是副本名称,相同的分片副本名称不能相同

7. 验证

node1上插入数据,然后在node2上执行select 验证,可以查询出结果,说明副本配置正确

分片

副本虽然能够提高数据的可用性,降低丢失风险,但是每台服务器实际上必须容纳全量数据,对数据的横向扩容没有解决。 要解决数据水平切分的问题,需要引入分片的概念。通过分片把一份完整的数据进行切分,不同的分片分布到不同的节点上,再通过 Distributed 表引擎把数据拼接起来一同使用。

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

  1. 查看集群
代码语言:javascript
复制
show clusters;
  1. 在 Node01 上执行建表语句 会自动同步到 Node02 和 Node03 上 集群名字要和配置文件中的一致 分片和副本名称从配置文件的宏定义中获取
代码语言:javascript
复制
create table st_fz_order_mt_01 on cluster gmall_cluster (
               id UInt32,
               sku_id String,
               total_amount Decimal(16,2),
               create_time Datetime
               ) engine
               =ReplicatedMergeTree('/clickhouse/tables/{shard}/st_fz_order_mt_01','{replica}')
               partition by toYYYYMMDD(create_time)
               primary key (id)
               order by (id,sku_id);

在Node02和Node03上查看表是否创建成功

代码语言:javascript
复制
show tables;
  1. 在 Node02 上创建 Distribute 分布式表
代码语言:javascript
复制
create table st_fz_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_fz_order_mt_01,hiveHash(sku_id));

参数含义: Distributed(集群名称,库名,本地表名,分片键) 分片键必须是整型数字,所以用 hiveHash 函数转换,也可以 rand()

  1. 在 Node01 上插入测试数据
代码语言:javascript
复制
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');
  1. 通过查询分布式表和本地表观察输出结果 1)分布式表
代码语言:javascript
复制
select * From st_fz_order_mt_all2;
SELECT *
FROM st_fz_order_mt_all2
Query id: d8b676e9-c119-4483-8ca2-f0b5cd150a61
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 202 │ sku_002 │         2000 │ 2020-06-01 12:00:00 │
│ 203 │ sku_004 │         2500 │ 2020-06-01 12:00:00 │
│ 204 │ sku_002 │         2000 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 205 │ sku_003 │          600 │ 2020-06-02 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 201 │ sku_001 │         1000 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘

(2)本地表

Node1:

代码语言:javascript
复制
 select * From st_fz_order_mt_01;
代码语言:javascript
复制
SELECT *
FROM st_fz_order_mt_01
Query id: ddcb5176-e443-4253-9877-57fec8f57311
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 202 │ sku_002 │         2000 │ 2020-06-01 12:00:00 │
│ 203 │ sku_004 │         2500 │ 2020-06-01 12:00:00 │
│ 204 │ sku_002 │         2000 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
3 rows in set. Elapsed: 0.002 sec. 

Node2:

Node3:

代码语言:javascript
复制
date1001 :) select * From st_fz_order_mt_01;
代码语言:javascript
复制
SELECT *
FROM st_fz_order_mt_01
Query id: 7a336004-7040-4098-948e-1e7c5d983edb
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 205 │ sku_003 │          600 │ 2020-06-02 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 201 │ sku_001 │         1000 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
2 rows in set. Elapsed: 0.002 sec. 

数据分布在Node1和Node3两个节点上

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 副本
  • 配置副本
  • 分片
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档