ClickHouse集群(1)INSERT、MERGE执行流程

CH集群架构 (metrika.xml)基本由 副本+分片 组成。副本:源数据的冗余,防止数据丢失;分片:数据的水平拆分,提升查询性能。对于ClickHouse而言,集群架构由简单到复杂如下:

在这里插入图片描述

来自《ClickHouse原理解析与应用实践》一书
准备环境

集群架构是2分片,1副本

在这里插入图片描述

create database testdb;
use testdb;

2.分布式DDL的建表语句
2.1 本地表

create table test_local ON CLUSTER my_cluster (ID Int8, Name String, BirthDate Date) \
            ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test_local','{replica}') PARTITION BY toYYYYMMDD(BirthDate) ORDER BY (Name, BirthDate) SETTINGS index_granularity = 8192;

ReplicatedMergeTree的定义方式:
ENGINE =ReplicatedMergeTree(‘zk_path’,‘replica_name’)

ClickHouse提供的配置模板


<default_replica_path>/clickhouse/tables/{shard}/{table}</default_replica_path>
<default_replica_name>{replica}</default_replica_name>

图片
对于zk_path,同一张数据表的同一个分片的不同副本,定义相同的路径;而对于replica_name,同一张数据表的同一个分片的不同副本,定义不同的名称。

详情查看 Creating Replicated Tables

https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/replication/

2.2 分布表

create table test_all ON CLUSTER my_cluster (ID Int8, Name String, BirthDate Date) \
            ENGINE = Distributed(my_cluster,testdb,test_local, rand());

在这里插入图片描述

3.插入测试数据

insert into test_all values(1,'zhangsan',now()),(2,'lisi',now()),(3,'wangwu',now()),(4,'maliu',now());

在这里插入图片描述

在这里插入图片描述

来自《ClickHouse原理解析与应用实践》一书
在MergeTree中,一个数据分区由开始创建到全部完成,会历经两类存储区域。
(1)内存:数据首先会被写入内存缓冲区。
(2)本地磁盘:数据接着会被写入tmp临时目录分区,待全部完成后再将临时目录重命名为正式分区,然后向/block节点写入该数据分区的block_id(用于去重)。ReplicatedMergeTree在上述基础之上增加了ZooKeeper的部分,它会进一步在ZooKeeper内创建一系列的监听节点,并以此实现多个实例之间的通信。

shard:/01/ 192.168.6.129 选择拉取远端副本:192.168.6.128

在这里插入图片描述

其中可以看到shard:/01/ 的192.168.6.129 选择拉取远端副本:192.168.6.128 的时候第一次下载请求失败。ClickHouse默认配置可以共请求5次。
在这里插入图片描述

shard:/02/ 192.168.6.84 选择拉取远端副本:192.168.6.130
图片
追踪日志信息可以看出,基于DataPartsExchange的响应后,先将数据写入了tmp_fetch_20210611_0_0_0,待全部数据接收完成之后,重命名该目录:Renaming temporary part tmp_fetch_20210611_0_0_0 to 20210611_0_0_0。
4.查询
在这里插入图片描述

在这里插入图片描述

建表语句中分区键是:BirthDate ,主键是 Name, BirthDate
根据追踪的信息,解读SQL执行计划:
该SQL没有使用主键索引:

Key condition: unknown

该SQL没有使用分区索引:

MinMax index condition: unknown

该SQL查询,共扫描了所有的1个分区目录,共计1个MarkRange:

Selected 1 parts by date, 1 parts by key, 1 marks to read from 1 ranges

5.合并

insert into test_all values(11,'zhangsan',now()-259200),(22,'lisi',now()-259200),(33,'wangwu',now()-259200),(44,'maliu',now()-259200);
insert into test_all values(5,'sunqi',now()),(6,'zhouba',now()),(7,'wujiu',now()),(8,'zhengshi',now());

图片

图片

optimize table test_local;

图片

根据追踪的信息,操作类型为Merge合并,需要合并的分区目录是20210611_68_68_0 和 20210611_69_69_0。同时,主副本还锁住执行线程,对日志的接收情况进行监听:

Waiting for 192.168.6.128 to pull log-0000000089 to queue

各个副本实例将分别监听/log/log-0000000089日志的推送,它们也会分别拉取日志到本地,并推送到各自的/queue任务队列:

Pulling 1 entries to queue: log-0000000089 - log-0000000089

各个副本基于队列分别在本地执行MERGE

Executing log entry to merge parts 20210611_68_68_0, 20210611_69_69_0 to 20210611_68_69_1
Merging 2 parts: from 20210611_68_68_0 to 20210611_69_69_0 into Wide

合并完成查询:
在这里插入图片描述在这里插入图片描述
更多精彩内容欢迎关注微信公众号

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ClickHouseMerge Tree引擎是一种基于日志结构的存储引擎,它使用了一系列的数据文件和索引文件来存储数据。Merge Tree引擎支持高并发、高可用、高性能的数据读写和查询。 下面是ClickHouse Merge Tree引擎的读写流程: 写入流程: 1. 客户端通过TCP/IP协议连接到ClickHouse的服务器,发送写入请求。 2. 服务器将写入请求传递给Merge Tree引擎。 3. Merge Tree引擎将数据写入到内存中的数据文件中。 4. 当内存中的数据文件大小达到一定阈值时,Merge Tree引擎将数据文件刷写到硬盘上的数据文件中。 5. 在数据文件刷写的同时,Merge Tree引擎会生成一个新的索引文件,并将其保存到硬盘上。 6. 如果数据文件的大小达到了一定的大小,Merge Tree引擎会合并多个数据文件和索引文件,并生成一个新的数据文件和一个新的索引文件。 7. 合并操作可以在后台异步进行,不影响数据写入的性能。 读取流程: 1. 客户端通过TCP/IP协议连接到ClickHouse的服务器,发送查询请求。 2. 服务器将查询请求传递给Merge Tree引擎。 3. Merge Tree引擎根据索引文件和数据文件,定位到相应的数据块。 4. Merge Tree引擎将数据块加载到内存中,并执行查询操作。 5. Merge Tree引擎将查询结果返回给客户端。 6. 如果查询的数据块在内存中不存在,Merge Tree引擎会从硬盘中加载数据块,并将其加载到内存中。 7. 如果需要查询多个数据块,Merge Tree引擎会将数据块合并,并返回合并后的结果。 以上就是ClickHouse Merge Tree引擎的写入和读取流程。通过使用Merge Tree引擎,ClickHouse可以支持高并发、高可用、高性能的数据读写和查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值