clickhouse新特性之————MergeTree启动加速(使用篇)

简介: clickhouse新特性之————MergeTree启动加速(使用篇)

前言


MergeTree Family启动慢问题一直是ClickHouse社区的痛点。在完成对所有MergeTree part的加载之前,clickhouse-server实例无法对外提供服务。而在生产环境中,加载过程动辄持续几十分钟,严重影响clickhouse集群的可用性。


针对这个痛点,我们开发了MergeTree启动加速特性:通过RocksDB缓存part元数据,将clickhouse-server的启动时间从小时级减少到分钟级。该特性目前已被合入社区,PR见:https://github.com/ClickHouse/ClickHouse/pull/32928。本文将着重讲解如何使用该特性,并对启动性能进行评测。




使用


配置


首先需要在config.xml中加入配置

<!-- Uncomment if enable merge tree metadata cache -->
    <merge_tree_metadata_cache>
        <lru_cache_size>268435456</lru_cache_size>
        <continue_if_corrupted>true</continue_if_corrupted>
    </merge_tree_metadata_cache>

lru_cache_size: 用于缓存part元数据的RocksDB实例中的LRU大小

continue_if_corrupted: 当本地的RocksDB目录读取失败时,用户可选择退出进程(false)或者清空脏数据(true)。



建表


创建MergeTree Family的表时,需指定settings: use_metadata_cache = true,这样该表下所有part的元数据除了落地到文件中,还会写一份到RocksDB.

建表

CREATE TABLE test
(
    `x` UInt32, 
    `y` UInt32, 
    `z` UInt32, 
    `t` UInt32
)
ENGINE = MergeTree
PARTITION BY x % 10
ORDER BY (x, y) 
SETTINGS use_metadata_cache = true

插入数据

insert into test select number, number, number, number from system.numbers limit 100;

查看元数据缓存

:) desc system.merge_tree_metadata_cache 
DESCRIBE TABLE system.merge_tree_metadata_cache
Query id: d2a96900-db4f-45ef-8d19-f1d2f6edd930
┌─name──┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ key   │ String │              │                    │         │                  │                │
│ value │ String │              │                    │         │                  │                │
└───────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
:) select key from system.merge_tree_metadata_cache where key like 'default:%' limit 10; 
SELECT key
FROM system.merge_tree_metadata_cache
WHERE key LIKE 'default:%'
LIMIT 10
Query id: 7c87cb78-ba72-4702-b457-6bdfba5ee83c
┌─key──────────────────────────────────────────────────────────────────────────────────────────┐
│ default:store/b47/b47ee9c8-afa1-41ac-adfb-2e0dc42de819/0_1_1_0/checksums.txt                 │
│ default:store/b47/b47ee9c8-afa1-41ac-adfb-2e0dc42de819/0_1_1_0/columns.txt                   │
│ default:store/b47/b47ee9c8-afa1-41ac-adfb-2e0dc42de819/0_1_1_0/count.txt                     │
│ default:store/b47/b47ee9c8-afa1-41ac-adfb-2e0dc42de819/0_1_1_0/default_compression_codec.txt │
│ default:store/b47/b47ee9c8-afa1-41ac-adfb-2e0dc42de819/0_1_1_0/minmax_x.idx                  │
│ default:store/b47/b47ee9c8-afa1-41ac-adfb-2e0dc42de819/0_1_1_0/partition.dat                 │
│ default:store/b47/b47ee9c8-afa1-41ac-adfb-2e0dc42de819/0_1_1_0/primary.idx                   │
│ default:store/b47/b47ee9c8-afa1-41ac-adfb-2e0dc42de819/1_2_2_0/checksums.txt                 │
│ default:store/b47/b47ee9c8-afa1-41ac-adfb-2e0dc42de819/1_2_2_0/columns.txt                   │
│ default:store/b47/b47ee9c8-afa1-41ac-adfb-2e0dc42de819/1_2_2_0/count.txt                     │
└──────────────────────────────────────────────────────────────────────────────────────────────┘
10 rows in set. Elapsed: 0.002 sec. 

系统表system.merge_tree_metadata_cache可用于查询rocksdb缓存的part元数据。其中


  • key: part元数据文件的路径,格式为., 其中disk_name为配置在config.xml中的disk名称。如果该表使用默认存储策略,disk_name的值为default。relative_path为part元数据文件相对disk根目录的路径


  • value: part元数据文件的内容




测评


接下来我们分别测试在不使用和使用metadata cache的情况下,clickhouse-server的启动速度




环境准备


为了尽量模拟生产环境,在单个clickhouse实例上创建2000张MergeTree表,每张MergeTree表50个字段,350个part。单实例上一共70万个part,与笔者的生产环境持平。clickhouse版本选择22.4


脚本如下,用它分别初始化clickhouse实例A(禁用启动加速)和实例B(使用启动加速)

#!/bin/bash
num_tables=2000
num_columns=50
num_partitions=350
# 禁用启动加速特性
# use_metadata_cache=0
# 使用启动加速特性
use_metadata_cache=1
function get_create_table_query()
{
    id=$1
    echo -n "CREATE TABLE test.test_${id} (day Date"
    for i in `seq 1 $num_columns`; do
        echo -n ", col${i} String"
    done
    echo -n ") ENGINE = MergeTree() PARTITION BY toYYYYMMDD(day) ORDER BY col1"
    if [ $use_metadata_cache -eq 1 ]; then 
      echo -n " SETTINGS use_metadata_cache = true;"
    else
      echo -n " SETTINGS use_metadata_cache = false;"
    fi
}
function get_insert_table_query()
{
    id=$1
    offset=$2
    echo -n "insert into test.test_${id} values (today()-${offset}"
    for i in `seq 1 $num_columns`; do
        echo -n ", 'hello world:${i}'"
    done
    echo -n ");"
}
tock="clickhouse-client"
echo "drop database if exists test;" | tock
echo "create database if not exists test ENGINE = Ordinary;" | tock
for i in `seq 1 $num_tables`; do
    sql=`get_create_table_query $i`
    echo "$sql" | tock
    for offset in `seq 1 $num_partitions`; do
        (sql=`get_insert_table_query $i $offset`; echo "$sql" | tock)&
        if (( $offset % 90 == 0 )); then
            wait
        fi
    done
    wait
done



测试结果


环境 启动时长
使用MergeTree启动加速 63 minutes
禁用MergeTree启动加速 18 seconds



总结


在这篇文章中,我们介绍了如何使用启动加速特性,并对比了优化前后的启动性能。该特性能够将clickhouse的启动时长从小时级优化到分钟级。目前已经在我们的生产环境稳定运行超过一年,欢迎社区的小伙伴们使用。


相关文章
|
存储 数据库 索引
61.【clickhouse】ClickHouse从入门到放弃-MergeTree的存储结构
【clickhouse】ClickHouse从入门到放弃-MergeTree的存储结构
61.【clickhouse】ClickHouse从入门到放弃-MergeTree的存储结构
|
3月前
|
存储 SQL 消息中间件
ClickHouse(12)ClickHouse合并树MergeTree家族表引擎之AggregatingMergeTree详细解析
AggregatingMergeTree是ClickHouse的一种表引擎,它优化了MergeTree的合并逻辑,通过将相同主键(排序键)的行聚合为一行并存储聚合函数状态来减少行数。适用于增量数据聚合和物化视图。建表语法中涉及AggregateFunction和SimpleAggregateFunction类型。插入数据需使用带-State-的聚合函数,查询时使用GROUP BY和-Merge-。处理逻辑包括按排序键聚合、在合并分区时计算、以分区为单位聚合等。常用于物化视图配合普通MergeTree使用。查阅更多资料可访问相关链接。
161 4
|
3月前
|
存储 SQL 算法
ClickHouse(13)ClickHouse合并树MergeTree家族表引擎之CollapsingMergeTree详细解析
CollapsingMergeTree是ClickHouse的一种表引擎,它扩展了`MergeTree`,通过折叠行来优化存储和查询效率。当`Sign`列值为1和-1的成对行存在时,该引擎会异步删除除`Sign`外其他字段相同的行,只保留最新状态。建表语法中,`sign`列必须为`Int8`类型,用来标记状态(1)和撤销(-1)。写入时,应确保状态和撤销行的对应关系以保证正确折叠。查询时,可能需要使用聚合函数如`sum(Sign * x)`配合`GROUP BY`来处理折叠后的数据。使用`FINAL`修饰符可强制折叠,但效率较低。系列文章提供了更多关于ClickHouse及其表引擎的详细解析。
91 1
|
3月前
|
传感器 存储 SQL
ClickHouse(15)ClickHouse合并树MergeTree家族表引擎之GraphiteMergeTree详细解析
GraphiteMergeTree是ClickHouse用于优化Graphite数据存储和汇总的表引擎,适合需要瘦身和高效查询Graphite数据的开发者。它基于MergeTree,减少存储空间并提升查询效率。创建表时需包括Path、Time、Value和Version列。配置涉及pattern、regexp、function和retention,用于指定聚合函数和数据保留规则。文章还提供了建表语句示例和相关资源链接。
62 1
|
3月前
|
存储 SQL 关系型数据库
ClickHouse(11)ClickHouse合并树MergeTree家族表引擎之SummingMergeTree详细解析
`SummingMergeTree`是`MergeTree`引擎的变种,它合并相同主键的行并计算数值列的总和,从而节省存储空间和加速查询。通常与`MergeTree`配合使用,存储聚合数据以避免数据丢失。创建`SummingMergeTree`表时,可选参数`columns`指定要汇总的数值列。未指定时,默认汇总所有非主键数值列。注意,聚合可能不完整,查询时需用`SUM`和`GROUP BY`。文章还介绍了建表语法、数据处理规则以及对嵌套数据结构和`AggregateFunction`列的处理。查阅更多ClickHouse相关内容可访问相关链接。
128 5
|
3月前
|
存储 SQL 算法
ClickHouse(14)ClickHouse合并树MergeTree家族表引擎之VersionedCollapsingMergeTree详细解析
VersionedCollapsingMergeTree是ClickHouse的一种优化引擎,扩展了MergeTree,支持多线程异步插入和高效的数据折叠。它通过Sign和Version列处理对象状态的变化,Sign表示行的状态(正向或撤销),Version追踪状态版本。引擎自动删除旧状态,减少存储占用。在查询时,需注意可能需使用GROUP BY和聚合函数确保数据折叠,因为ClickHouse不保证查询结果已折叠。文章还提供了建表语法、使用示例和相关资源链接。
85 0
|
4月前
|
SQL 消息中间件 关系型数据库
ClickHouse(10)ClickHouse合并树MergeTree家族表引擎之ReplacingMergeTree详细解析
`ReplacingMergeTree`是ClickHouse的一种表引擎,用于数据去重。与`MergeTree`不同,它在合并分区时删除重复行,但不保证无重复。去重基于`ORDER BY`列,在ver列未指定时保留最新行,否则保留ver值最大者。数据处理策略包括延迟合并导致的不确定性及按分区去重。`CREATE TABLE`语法中,`ReplacingMergeTree`需要指定可选的`ver`列。相关系列文章提供了更深入的解析。
128 0
|
4月前
|
存储 SQL 关系型数据库
ClickHouse(09)ClickHouse合并树MergeTree家族表引擎之MergeTree详细解析
ClickHouse的MergeTree系列引擎是其高性能大数据存储的核心,特别适合大量数据的快速插入。数据按主键排序,支持分区和数据副本,提供数据采样功能。建表时,通过`ENGINE = MergeTree()`指定引擎,`ORDER BY`指定排序键,可选`PARTITION BY`分区,`SAMPLE BY`进行采样。此外,MergeTree支持多种索引和设置,如`index_granularity`控制索引粒度。查询时,ClickHouse利用主键和索引来高效检索数据,尤其在使用等值或范围条件时。
36 0
|
存储 SQL JSON
一文读懂 ClickHouse V22.8 新版本重要特性
ClickHouse 又双叒叕发布新版本了。
一文读懂 ClickHouse V22.8 新版本重要特性