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的存储结构
|
2月前
|
消息中间件 分布式计算 关系型数据库
大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他数据源 HDFS MySQL
大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他数据源 HDFS MySQL
60 0
|
6月前
|
存储 SQL 消息中间件
ClickHouse(12)ClickHouse合并树MergeTree家族表引擎之AggregatingMergeTree详细解析
AggregatingMergeTree是ClickHouse的一种表引擎,它优化了MergeTree的合并逻辑,通过将相同主键(排序键)的行聚合为一行并存储聚合函数状态来减少行数。适用于增量数据聚合和物化视图。建表语法中涉及AggregateFunction和SimpleAggregateFunction类型。插入数据需使用带-State-的聚合函数,查询时使用GROUP BY和-Merge-。处理逻辑包括按排序键聚合、在合并分区时计算、以分区为单位聚合等。常用于物化视图配合普通MergeTree使用。查阅更多资料可访问相关链接。
318 4
|
6月前
|
存储 SQL 算法
ClickHouse(13)ClickHouse合并树MergeTree家族表引擎之CollapsingMergeTree详细解析
CollapsingMergeTree是ClickHouse的一种表引擎,它扩展了`MergeTree`,通过折叠行来优化存储和查询效率。当`Sign`列值为1和-1的成对行存在时,该引擎会异步删除除`Sign`外其他字段相同的行,只保留最新状态。建表语法中,`sign`列必须为`Int8`类型,用来标记状态(1)和撤销(-1)。写入时,应确保状态和撤销行的对应关系以保证正确折叠。查询时,可能需要使用聚合函数如`sum(Sign * x)`配合`GROUP BY`来处理折叠后的数据。使用`FINAL`修饰符可强制折叠,但效率较低。系列文章提供了更多关于ClickHouse及其表引擎的详细解析。
235 1
|
2月前
|
SQL 消息中间件 分布式计算
大数据-141 - ClickHouse 集群 副本和分片 Zk 的配置 Replicated MergeTree原理详解(一)
大数据-141 - ClickHouse 集群 副本和分片 Zk 的配置 Replicated MergeTree原理详解(一)
79 0
|
2月前
|
SQL 大数据
大数据-141 - ClickHouse 集群 副本和分片 Zk 的配置 Replicated MergeTree原理详解(二)
大数据-141 - ClickHouse 集群 副本和分片 Zk 的配置 Replicated MergeTree原理详解(二)
88 0
|
2月前
|
存储 SQL 分布式计算
大数据-139 - ClickHouse 集群 表引擎详解4 - MergeTree 实测案例 ReplacingMergeTree SummingMergeTree
大数据-139 - ClickHouse 集群 表引擎详解4 - MergeTree 实测案例 ReplacingMergeTree SummingMergeTree
36 0
|
2月前
|
存储 算法 NoSQL
大数据-138 - ClickHouse 集群 表引擎详解3 - MergeTree 存储结构 数据标记 分区 索引 标记 压缩协同
大数据-138 - ClickHouse 集群 表引擎详解3 - MergeTree 存储结构 数据标记 分区 索引 标记 压缩协同
41 0
|
2月前
|
存储 消息中间件 分布式计算
大数据-137 - ClickHouse 集群 表引擎详解2 - MergeTree 存储结构 一级索引 跳数索引
大数据-137 - ClickHouse 集群 表引擎详解2 - MergeTree 存储结构 一级索引 跳数索引
43 0
|
6月前
|
传感器 存储 SQL
ClickHouse(15)ClickHouse合并树MergeTree家族表引擎之GraphiteMergeTree详细解析
GraphiteMergeTree是ClickHouse用于优化Graphite数据存储和汇总的表引擎,适合需要瘦身和高效查询Graphite数据的开发者。它基于MergeTree,减少存储空间并提升查询效率。创建表时需包括Path、Time、Value和Version列。配置涉及pattern、regexp、function和retention,用于指定聚合函数和数据保留规则。文章还提供了建表语句示例和相关资源链接。
103 1