Clickhouse MergeTree 原理(一)

2024-03-14 23:20
文章标签 原理 clickhouse mergetree

本文主要是介绍Clickhouse MergeTree 原理(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:俊达
MergeTree是Clickhouse里最核心的存储引擎。Clickhouse里有一系列以MergeTree为基础的引擎(见下图),理解了基础MergeTree,就能理解整个系列的MergeTree引擎的核心原理。
在这里插入图片描述

本文对MergeTree的基本原理进行介绍。

1 MergeTree引擎表创建

1、基本语法:

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],...INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = MergeTree()
ORDER BY expr
[PARTITION BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...]
[SETTINGS name=value, ...]

2、关键属性说明
[partition by expr] : 分区键,分区键可以指定一个或多个字段,若不指定分区键时默认为其生成一个名为all的分区。[选填]

[order by expr] : 排序键,指定一个数据段内的数据排序规则。默认情况下主键与排序键相同。排序键可以是一个或多个字段。[必填]

[primary key expr] : 主键,若设置表primary key,表数据会按照主键字段生成一级索引;若无显式执行primary key,则使用order by字段作为主键排序。MergeTree主键允许重复数据。[选填]

[sample by expr] : 抽样表达式,声明使用何种方式进行抽样采集。[选填]

上面的这些属性,只有Order by是必填的。

下面是一个具体的例子:

CREATE TABLE local.metrics
(`tt` DateTime,`tags` Map(String, String),`metric` String,`value` Float64,`str_value` String
)
ENGINE = MergeTree
PARTITION BY toYYYYMMDD(tt)
ORDER BY (metric, tt)
SETTINGS index_granularity = 8192

2 MergeTree物理存储结构

1、Clickhouse中,一个MergeTree引擎表,由一个或多个分区(partition)组成。如果建表时没有制定分区条件,则所有的数据都位于同一个分区。

2、每一个分区,由1个或多个part组成。每一个part,对应clickhouse数据目录中的一个目录,该目录下存储了part对应的数据。

3、part是clickhouse数据存储、数据复制、数据合并的基本单位。每次insert数据,会写入到单独的part中。

4、part的数据一旦写入,就不会发生变化。只有在数据合并时,才会将被合并的part设置为inactive,等后台进程清理。

5、数据合并时,会对同一个分区(partition)中的part进行合并。不同分区的数据不会合并到一起。

我们可以通过system库中的parts表查看part信息。

ck01 :) select * from system.parts where table='metrics'\GSELECT *
FROM system.parts
WHERE table = 'metrics'Query id: 2948f29c-1f23-4f5e-b9a5-ac6006ce5383Row 1:
──────
partition:                             20221129
name:                                  20221129_1_4_2
uuid:                                  00000000-0000-0000-0000-000000000000
part_type:                             Compact
active:                                1
marks:                                 2
rows:                                  3
bytes_on_disk:                         412
data_compressed_bytes:                 203
data_uncompressed_bytes:               92
marks_bytes:                           176
min_block_number:                      1
max_block_number:                      4
level:                                 2
data_version:                          1
primary_key_bytes_in_memory:           36
primary_key_bytes_in_memory_allocated: 8256
is_frozen:                             0
database:                              local
table:                                 metrics
engine:                                MergeTree
disk_name:                             default
path:                                  /data/clickhouse/clickhouse/store/def/def88518-fd7b-418d-a7dd-6564e38bba39/20221129_1_4_2/
...

分区目录命名规则

分区目录的命名规范为: PartitionID_MinBlockNum_MaxBlockNum_Level

PartitionID : 分区ID。

MinBlockNum、MaxBlockNum : 最小数据块编号、最大数据块编号,数据块编号由1开始自增长。

Level : 合并操作层级,随着合并的次数递增。

分区目录内容

在这里插入图片描述
checksums.txt : 校验文件,使用二进制格式存储。记录了各类文件的大小以及大小的hash值

columns.txt : 列信息文件,使用明文存格式储。存储了该分区下的表字段信息。

count.txt : 计数文件,存储了当前分区下的数据行数。

default_compression_codec.txt :

[column].bin : 列字段数据文件,默认使用LZ4格式压缩存储。

[column].mrk2 : 列字段标记文件,使用二进制格式存储,标记文件中保存了[column].bin文件中数据的偏移量。标记文件是一级索引文件与数据文件之间进行关联的桥梁。

primary.idx : 一级索引文件,使用二进制格式存储。存储了该分区的稀疏索引,MergeTree通过primary by或order by声明一级索引的定义。

skip_idx[column].idx、skip_idx[column].mrk2 : 如果建表语句中声明了相关的二级索引(跳数索引),则会生成相关二级索引的索引文件与标记文件。

clickhouse part数据存储分两种格式:

  • compact: 所有字段的数据都存储道data.bin中。如上图中part的格式就是compact。

  • wide: 每个字段都存储到单独的文件中

存储格式受参数min_bytes_for_wide_part和min_rows_for_wide_part控制。只有当纪录数或记录占用的空间超过配置参数,才以wide格式存储。

part合并过程

当多个同分区的分区目录进行合并时:

  • 分区ID相同
  • MinBlockNum取所有待合并分区目录中最小的MinBlockNum值
  • MaxBlockNum取所有待合并分区目录中最大的MaxBlockNum值
  • Level取所有待合并分区目录中最大Level+1

更多技术信息请查看云掣官网https://yunche.pro/?t=yrgw

这篇关于Clickhouse MergeTree 原理(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/810039

相关文章

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事