Clickhouse数据库八:搭建分片集群(高并发)
复本虽然能够提高数据的可用性,降低丢失风险,但是对数据的横向扩容没有解决。每台机子实际上必须容纳全量数据。
要解决数据水平切分
的问题,需要引入分片
的概念。
通过分片把一份完整的数据进行切分,不同的分片分布到不同的节点上
。再通过Distributed表引擎
把数据拼接起来一同使用。
Distributed表引擎本身不存储数据,有点类似于MyCat之于MySql,成为一种中间件,通过分布式逻辑表来写入、分发、路由来操作多台节点不同分片的分布式数据。
8.1 读写原理
8.2 分片集群规划
规划一个即分片, 有复本的集群.
说明:
- shard1 一共两个复本(hadoop102, hadoop103)
- shard2 只有一个复本(hadoop104)
8.3配置分片集群
- 在hadoop102, 打开配置文件:
sudo vim /etc/clickhouse-server/config.d/metrika.xml
<?xml version="1.0"?>
<yandex>
<clickhouse_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>
</clickhouse_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> <!-- 不同机器放的分片索引不一样, hadoop103,hadoop104需要更改 -->
<replica>hadoop102</replica> <!-- 不同机器放的副本数不一样, hadoop103,hadoop104需要更改, 以主机命名比较方便-->
</macros>
</yandex>
分发metrika.xml到hadoop103,hadoop104
- 不要忘记先在hadoop104安装clickhouse
- 分发/etc/clickhouse-server/config.xml
- 分发/etc/clickhouse-server/config.d/metrika.xml
hadoop103 的宏
<!-- 宏: 将来建表的时候, 可以从这里自动读取, 每个机器上的建表语句就可以一样了 相当于变量 -->
<macros>
<shard>01</shard> <!-- 不同机器放的分片索引不一样, hadoop103,hadoop104需要更改 -->
<replica>hadoop103</replica> <!-- 不同机器放的副本数不一样, hadoop103,hadoop104需要更改, 以主机命名比较方便-->
</macros>
</yandex>
hadoop104的宏
<!-- 宏: 将来建表的时候, 可以从这里自动读取, 每个机器上的建表语句就可以一样了 相当于变量 -->
<macros>
<shard>02</shard> <!-- 不同机器放的分片索引不一样, hadoop103,hadoop104需要更改 -->
<replica>hadoop104</replica> <!-- 不同机器放的副本数不一样, hadoop103,hadoop104需要更改, 以主机命名比较方便-->
</macros>
</yandex>
8.4 3个节点创建数据库
分别在hadoop102,hadoop103,hadoop104上创建数据库gmall
create database gmall;
8.5 任意节点创建本地表
选择任意一节点
创建本地表, 会自动同步到其他节点
本地表只负责存储自己的切片数据!
create table st_order_mt_gmall on cluster gmall_cluster (
id UInt32,
sku_id String,
total_amount Decimal(16,2),
create_time Datetime
) engine =ReplicatedMergeTree('/clickhouse/tables/gmall/{shard}/st_order_mt_gmall','{replica}')
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id);
8.6 创建分布式表st_order_mt_gmall_all
在hadoop102创建分布式表
create table st_order_mt_gmall_all on cluster gmall_cluster
(
id UInt32,
sku_id String,
total_amount Decimal(16,2),
create_time Datetime
)engine = Distributed(gmall_cluster,gmall, st_order_mt_gmall,hiveHash(sku_id));
8.7 通过分布式表添加数据
insert into st_order_mt_gmall_all
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')
8.8 查询数据
- 通过分布式表查询
select * from st_order_mt_gmall_all;
可以查询到所有数据!
- 通过本地表查询
select * from st_order_mt_gmall;
只能查到当前节点的分片数据