跳至主要内容
跳至主要内容

部件合并

ClickHouse 中的部件合并是什么?


ClickHouse 速度很快,不仅体现在查询方面,还体现在插入方面,这得益于其 存储层,其运作方式类似于 LSM 树

① 插入(到 MergeTree 引擎家族中的表)会创建排序的、不可变的 数据部件

② 所有数据处理都卸载到后台部件合并中。

这使得数据写入轻量且高效

为了控制每个表的 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。数量并实现 ② 上述功能,ClickHouse 会持续合并(按分区)较小的 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。为较大的部件,直到它们达到大约 ~150 GB 的压缩大小。

下图概述了此后台合并过程


部件的 `merge level` 每次合并都会增加一。`0` 级表示部件是新的,尚未合并。 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。合并为较大的 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。后,会被标记为 inactive,并在 可配置 的时间(默认 8 分钟)后最终删除。随着时间的推移,这将创建一个由合并的 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。组成的 。因此得名 merge tree 表。

监控合并

什么是表部件 示例中,我们 展示了 ClickHouse 在 parts 系统表中跟踪所有表 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。的方式。我们使用以下查询来检索示例表中每个活动部件的合并级别和存储的行数

SELECT
    name,
    level,
    rows
FROM system.parts
WHERE (database = 'uk') AND (`table` = 'uk_price_paid_simple') AND active
ORDER BY name ASC;

先前记录的查询结果显示,示例表有四个活动 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。,每个部件都是由最初插入的 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。的一次合并创建的。

   ┌─name────────┬─level─┬────rows─┐
1. │ all_0_5_1   │     1 │ 6368414 │
2. │ all_12_17_1 │     1 │ 6442494 │
3. │ all_18_23_1 │     1 │ 5977762 │
4. │ all_6_11_1  │     1 │ 6459763 │
   └─────────────┴───────┴─────────┘

现在运行该查询显示,这四个 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。已合并为一个最终部件(前提是没有向表中进一步插入数据)。

   ┌─name───────┬─level─┬─────rows─┐
1. │ all_0_23_2 │     2 │ 25248433 │
   └────────────┴───────┴──────────┘

在 ClickHouse 24.10 中,一个新的 合并仪表板被添加到内置的 监控仪表板中。通过 /merges HTTP 处理程序,在 OSS 和 Cloud 中都可用,我们可以使用它来可视化示例表中所有部件合并。

PART MERGES

上面的记录仪表板捕获了整个过程,从初始数据插入到最终合并为一个部件。

① 活动 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。的数量。

② 部件合并,以框的形式可视化表示(大小反映部件大小)。

写入放大

并发合并

单个 ClickHouse 服务器使用多个后台 合并线程来执行并发部件合并


每个合并线程执行一个循环

① 决定下一个要合并的 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。,并将这些 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。加载到内存中。

② 在内存中将 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。合并为更大的部件。

③ 将合并后的部件写入磁盘。

转到 ①

请注意,增加 CPU 核心数量和 RAM 大小可以增加后台合并吞吐量。

内存优化合并

前面的示例所示,ClickHouse 不一定会一次将所有要合并的 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。加载到内存中。基于多个 因素,为了减少内存消耗(牺牲合并速度),所谓的 垂直合并按块加载和合并 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。,而不是一次性加载。

合并机制

下图说明了 ClickHouse 中的单个后台 合并线程如何合并 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。(默认情况下,不使用 垂直合并


部件合并分为几个步骤进行

① 解压缩和加载:要合并的 部件磁盘上存储表数据的一个物理文件(或目录)。这与分区不同,分区是使用分区键创建的表数据的逻辑划分。中的 压缩的二进制列文件被解压缩并加载到内存中。

② 合并:数据被合并为更大的列文件。

③ 索引:为合并的列文件生成一个新的 稀疏主索引

④ 压缩与存储:新的列文件和索引会被压缩并保存到一个新的目录中,该目录代表合并后的数据部分。

此外,数据部分中的附加元数据,例如二级数据跳过索引、列统计信息、校验和以及最小值-最大值索引,也会基于合并后的列文件重新创建。为了简化起见,我们省略了这些细节。

步骤 ② 的机制取决于使用的具体 MergeTree 引擎,因为不同的引擎处理合并的方式不同。例如,如果数据已过时,行可能会被聚合或替换。如前所述,这种方法将所有数据处理卸载到后台合并中,从而通过保持写入操作轻量级和高效来实现超快的插入

接下来,我们将简要概述 MergeTreeClickHouse 中的 MergeTree 是一种专为高数据摄取速率和大数据量设计的表引擎。它是 ClickHouse 的核心存储引擎,提供列式存储、自定义分区、稀疏主索引以及对后台数据合并的支持。 系列引擎的合并机制。

标准合并

下图说明了如何在标准的 MergeTree 表中合并 部分磁盘上存储表数据一部分的物理文件(或目录)。这与分区不同,分区是使用分区键创建的表的逻辑划分。


上图中的 DDL 语句创建了一个带有 排序键在 ClickHouse 中,排序键定义了磁盘上行的物理顺序。如果您没有指定主键,ClickHouse 将使用排序键作为主键。如果您同时指定了两者,则主键必须是排序键的前缀。 (town, street)MergeTree 表,这意味着磁盘上的数据按这些列排序,并相应地生成稀疏主索引。

① 解压缩的预排序表列在 ② 合并时保留表由表的 排序键在 ClickHouse 中,排序键定义了磁盘上行的物理顺序。如果您没有指定主键,ClickHouse 将使用排序键作为主键。如果您同时指定了两者,则主键必须是排序键的前缀。 定义的全局排序顺序,③ 生成新的稀疏主索引,④ 合并后的列文件和索引被压缩并存储为磁盘上的一个新的数据部分。

替换合并

ReplacingMergeTree 表中的部分合并与 标准合并类似,但仅保留每个行的最新版本,旧版本将被丢弃


上图中的 DDL 语句创建了一个带有 排序键在 ClickHouse 中,排序键定义了磁盘上行的物理顺序。如果您没有指定主键,ClickHouse 将使用排序键作为主键。如果您同时指定了两者,则主键必须是排序键的前缀。 (town, street, id)ReplacingMergeTree 表,这意味着磁盘上的数据按这些列排序,并相应地生成稀疏主索引。

② 合并的工作方式与标准的 MergeTree 表类似,结合了解压缩的预排序列,同时保留全局排序顺序。

但是,ReplacingMergeTree 会删除具有相同 排序键在 ClickHouse 中,排序键定义了磁盘上行的物理顺序。如果您没有指定主键,ClickHouse 将使用排序键作为主键。如果您同时指定了两者,则主键必须是排序键的前缀。 的重复行,仅保留基于其包含部分创建时间戳的最新行。


求和合并

SummingMergeTree 表的部分合并期间,数值数据会自动汇总


上图中的 DDL 语句定义了一个带有 town 作为 排序键在 ClickHouse 中,排序键定义了磁盘上行的物理顺序。如果您没有指定主键,ClickHouse 将使用排序键作为主键。如果您同时指定了两者,则主键必须是排序键的前缀。SummingMergeTree 表,这意味着磁盘上的数据按此列排序,并创建相应的稀疏主索引。

在 ② 合并步骤中,ClickHouse 会用相同 排序键在 ClickHouse 中,排序键定义了磁盘上行的物理顺序。如果您没有指定主键,ClickHouse 将使用排序键作为主键。如果您同时指定了两者,则主键必须是排序键的前缀。 的所有行替换为单行,对数值列的值求和。

聚合合并

上述 SummingMergeTree 表是 AggregatingMergeTree 表的一种专门变体,允许通过在部分合并期间应用 90 多个聚合函数来 自动增量数据转换


上图中的 DDL 语句创建了一个带有 town 作为 排序键在 ClickHouse 中,排序键定义了磁盘上行的物理顺序。如果您没有指定主键,ClickHouse 将使用排序键作为主键。如果您同时指定了两者,则主键必须是排序键的前缀。AggregatingMergeTree 表,确保数据按此列在磁盘上排序,并生成相应的稀疏主索引。

在 ② 合并期间,ClickHouse 会用相同 排序键在 ClickHouse 中,排序键定义了磁盘上行的物理顺序。如果您没有指定主键,ClickHouse 将使用排序键作为主键。如果您同时指定了两者,则主键必须是排序键的前缀。 的所有行替换为单行,该单行存储 部分聚合状态(例如,avg()sumcount)。这些状态通过增量后台合并确保准确的结果。

    © . This site is unofficial and not affiliated with ClickHouse, Inc.