ClickHouse 实时分析(七)- ClickHouse 分布式表详解
1. 分布式表
在上一篇《ClickHouse实时分析(六)- ClickHouse数据副本详解》中,讲了副本保障数据高可用的作用以及配置方式。这一篇开始讲讲 ClickHouse 的分片,也就是分布式表。
副本虽然能够提高数据的可用性,降低丢失数据的风险,但是每台服务器实际上必须容纳全量数据,对数据的横向扩容
没有解决。
要解决数据水平切分的问题,需要引入分片的概念。通过分片把一份完整的数据进行切分,不同的分片分布到不同的节点上,再通过Distributed
表引擎把数据拼接起来一同使用。
Distributed表引擎本身不存储数据
,有点类似于 MyCat 之于 MySql,成为一种中间件, 通过分布式逻辑表来写入、分发、路由来操作多台节点不同分片的分布式数据。
注意:ClickHouse 的集群是表级别的,实际生产环境中,大部分做了高可用,但是通常不会做分片,避免降低查询性能以及操作集群的复杂性。
2. 集群写入读取流程
2.1 写入流程
2.2 读取流程
3. 分片配置
3.1 集群及副本规划
2 个分片,只有第一个分片有副本:
hadoop121 | hadoop122 | hadoop123 |
---|---|---|
<macros> <shard>01</shard> <replica>rep_1_1</replica> </macros> |
<macros> <shard>01</shard> <replica>rep_1_2</replica> </macros> |
<macros> <shard>02</shard> <replica>rep_2_1</replica> </macros> |
3.2 配置步骤并演示
- 在
hadoop121
的/etc/clickhouse-server/config.xml
中指定<remote_servers>
,将<remote_servers>
标签内的内容全部注释,然后加入下面的内容:
1 | <gmall_cluster> <!-- 集群名称--> |
- 指定宏的配置:
1 | <macros> |
-
将
hadoop121
的/etc/clickhouse-server/config.xml
同步到hadoop122
和hadoop123
上,并修改hadoop122
和hadoop123
宏的配置:
hadoop1221
2
3
4<macros>
<shard>01</shard>
<replica>rep_1_2</replica>
</macros>hadoop123
1
2
3
4<macros>
<shard>02</shard>
<replica>rep_2_1</replica>
</macros> -
重启三台 ClickHouse 服务器,
systemctl restart clickhouse-server
(需要开启 Zookeeper,具体可参考《ClickHouse实时分析(六)- ClickHouse数据副本详解》); -
在
hadoop121
上执行建表语句:1
2
3
4
5
6
7
8create 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); -
在
hadoop122
和hadoop123
上查看表是否创建成功:
-
在
hadoop121
上创建Distribute
分布式表:1
2
3
4
5
6create 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()
-
在
hadoop121
上插入测试数据:
1 | insert into st_order_mt_all values |
- 查询分布式表:
- 查询本地表:
hadoop121
hadoop122
hadoop123
配置的集群可以在System.cluster
表中查看到。也可以通过show clusters
中看到。
参考文献
【1】https://clickhouse.com/docs/zh/
【2】https://www.bilibili.com/video/BV1Yh411z7os?from=search&seid=4579023877699743987&spm_id_from=333.337.0.0
【3】https://clickhouse.com/docs/zh/