Clickhouse MergeTree引擎配置说明

不当当只是翻译Clickhouse官方网站的文章,还有自己的理解。感谢各位大神提出宝贵的意见

总结

  1. 分区目录可以不断被合并,最终可能被合并成一个目录
  2. 分区目录数据量最大可达150G
  3. 插入的数据只有落地到磁盘之后,客户端才能查询到数据
  4. 数据写入类似于kafka:支持同步,异步写入。支持最近数据插入去重校验
  5. 数据块合并之后,旧的数据块默认情况下会在480s之后 被删除

注意:

不活动的数据块:数据被合并后旧的数据块

活动的数据块:合并新生成 或 刚写入的 数据块 

数据块就是:表数据目录下生成的存储数据的目录

配置说明

max_parts_in_total

如果表的所有分区中的活动数据块总数超过 max_parts_in_total,则插入操作将被中断并抛出“Too many parts (N)”异常。

可能的取值:

  • 任何正整数。

默认值为 100000。

表中大量的数据块会降低 ClickHouse 查询的性能并增加 ClickHouse 的启动时间。

parts_to_throw_insert

如果单个分区中活动数据块数量超过parts_to_throw_insert值,则插入操作会因为Too many parts(N)而中断。与插入操作相比,合并操作的处理速度显著较慢。

可能的取值:

  • 任何正整数。

默认值:300。

为了实现SELECT查询的最大性能,需要尽量减少分区数据块的数量,请参见Merge Tree。

您可以将值设置为更大,这将降低Too many parts错误的概率,但同时SELECT性能可能会下降。

parts_to_delay_insert

如果单个分区中的活动数据块数量超过 parts_to_delay_insert,则插入操作会人为地减慢。

可能的取值:

  • 任何正整数。

默认值为 150。

ClickHouse 人为地延长了 INSERT 的执行时间(添加“sleep”),提升后天数据合并效率。

max_delay_to_insert

如果单个分区中的活动数据块数量超过 parts_to_throw_insert,则此参数用于计算插入延迟的秒数值。

可能的取值:

  • 任何正整数。

默认值为 1。

INSERT 的延迟(以毫秒为单位)通过以下公式计算:

max_k = parts_to_throw_insert - parts_to_delay_insert
k = 1 + parts_count_in_partition - parts_to_delay_insert
delay_milliseconds = pow(max_delay_to_insert * 1000, k / max_k)

例如,如果一个分区有 299 个活动数据块,parts_to_throw_insert 为 300,parts_to_delay_insert 为 150,max_delay_to_insert 为 1,则插入将延迟 pow(1 * 1000, (1 + 299 - 150) / (300 - 150)) = 1000 毫秒。

从版本 23.1 开始,公式已更改为:

allowed_parts_over_threshold = parts_to_throw_insert - parts_to_delay_insert
parts_over_threshold = parts_count_in_partition - parts_to_delay_insert + 1
delay_milliseconds = max(min_delay_to_insert_ms, (max_delay_to_insert * 1000) * parts_over_threshold / allowed_parts_over_threshold)

例如,如果一个分区有 224 个活动数据块,parts_to_throw_insert 为 300,parts_to_delay_insert 为 150,max_delay_to_insert 为 1,min_delay_to_insert_ms 为 10,则插入将延迟 max(10, 1 * 1000 * (224 - 150 + 1) / (300 - 150)) = 500 毫秒

inactive_parts_to_throw_insert

如果单个分区中的非活动数据块数量超过 inactive_parts_to_throw_insert,则插入操作将被中断并抛出“Too many inactive parts (N). Parts cleaning are processing significantly slower than inserts”异常。

可能的取值:

  • 任何正整数。

默认值为 0(不限制)。

inactive_parts_to_delay_insert

如果表中单个分区中的非活动数据块数量至少达到 inactive_parts_to_delay_insert,则插入操作会人为地减慢。当服务器无法快速清理数据块时,这很有用。

可能的取值:

  • 任何正整数。

默认值为 0(不限制)。

simultaneous_parts_removal_limit

如果存在大量过时的数据块,则清理线程将尝试在一次迭代中删除多达 simultaneous_parts_removal_limit 个数据块。将 simultaneous_parts_removal_limit 设置为 0 表示没有限制。

默认值为 0。

replicated_deduplication_window

写入副本表时 存储数据块哈希值以防止重复数据插入。由于网络抖动,客户端可能会发起两次数据插入,每次数据插入节点可能不一样,所以 ClickHouse 将数据块的哈希值写入 ClickHouse Keeper,用于副本节点之间共享数据块的哈希值

可能的取值:

  • 任何正整数。
  • 0(禁用去重)。

默认值为 100。

Insert 命令会创建一个或多个数据块(part)。写入副本表时会进行插入去重校验,ClickHouse 将所创建 数据块 的哈希值写入 ClickHouse Keeper。仅存储最近的 replicated_deduplication_window 个数据块的哈希值。旧的哈希值将从 ClickHouse Keeper 中删除。如果replicated_deduplication_window 设置过大,会减慢插入,因为需要比较更多的条目。哈希值是从插入数据的字段名称、类型和数据(字节流)通过hash计算而来的。

non_replicated_deduplication_window

在非副本表的 MergeTree 表中,存储用于检查重复 插入数据块的哈希值 的个数

可能的取值:

  • 任何正整数。
  • 0(禁用去重)。

默认值为 0。

使用与副本表类似的去重机制(参见 replicated_deduplication_window 设置)

replicated_deduplication_window_seconds

数据块的哈希值 从 ClickHouse Keeper 中删除的时间(以秒为单位)。

可能的取值:

  • 任何正整数。

默认值为 604800(1 周)。

replicated_deduplication_window 类似,replicated_deduplication_window_seconds 指定存储插入去重的数据块的哈希值保留时长。超过 replicated_deduplication_window_seconds 的哈希值将从 ClickHouse Keeper 中删除,即使数量小于 replicated_deduplication_window。如果只有一条记录,则会永久存储。

replicated_deduplication_window_for_async_inserts

类似配置:replicated_deduplication_window,该配置应用于异步数据插入并且 默认值为 10000。

replicated_deduplication_window_seconds_for_async_inserts

类似配置:replicated_deduplication_window_seconds

use_async_block_ids_cache

如果为 true,则缓存异步插入数据块的哈希值,提升插入性能。

可能的取值:

  • true,false

默认值为 false。

一个包含多个异步插入将生成多个数据块的哈希值。这些哈希值存储在Keeper 上,如果开启这个缓存,Clickhouse将监视 Keeper 中的存储该分区哈希值的路径。如果在 Keeper 中监视到更新,则尽快更新缓存,以便我们能够在内存中过滤重复的插入。

async_block_ids_cache_min_update_interval_ms

更新数据块哈希值 的最小间隔(以毫秒为单位)。

可能的取值:

  • 任何正整数。

默认值为 100。

通常,只要监视 Keeper 路径中有更新,内存中的数据块哈希值就会立即更新。但是,缓存更新可能过于频繁并成为重负担。这个最小间隔可以防止缓存更新得太快。

max_replicated_logs_to_keep

How many records may be in the ClickHouse Keeper log if there is inactive replica. An inactive replica becomes lost when when this number exceed.

Possible values:

  • Any positive integer.

Default value: 1000

min_replicated_logs_to_keep

同上,这是最小值,默认值为:10

prefer_fetch_merged_part_time_threshold

在副本同步过程中,如果zk上同步日志创建时长大于prefer_fetch_merged_part_time_threshold,并且需要同步的数据大小总和大于 prefer_fetch_merged_part_size_threshold,则优先从副本中拉取合并后的数据块,而不是拉取原始数据并在本地执行合并。这是为了加速数据合并。

可能的取值:

  • 任何正整数。

默认值为 3600。

prefer_fetch_merged_part_size_threshold

在副本同步过程中,如果zk上同步日志创建时长大于prefer_fetch_merged_part_time_threshold,并且需要同步的数据大小总和大于 prefer_fetch_merged_part_size_threshold,则优先从副本中拉取合并后的数据块,而不是拉取原始数据并在本地执行合并。这是为了加速数据合并。

可能的取值:

  • 任何正整数。

默认值为 10,737,418,240(10G)

execute_merges_on_single_replica_time_threshold

当此设置的值大于零时,则仅一个副本立即开始合并,其他副本等待execute_merges_on_single_replica_time_threshold秒后下载合并好的数据。如果所选副本在execute_merges_on_single_replica_time_threshold秒后未完成合并,则会回退到标准行为。

可能的取值:

  • 任何正整数。

默认值为0(秒)。

remote_fs_execute_merges_on_single_replica_time_threshold

当此设置的值大于零时,如果合并数据块在共享存储上(比如s3上),并且启用了 allow_remote_fs_zero_copy_replication,则仅一个副本立即开始合并。其他的副本等待,超过该值还没有完成合并,则会回退到标准行为。

allow_remote_fs_zero_copy_replication 还处于实验阶段
ClickHouse 版本 22.8 及更高版本默认禁用。不建议在生产环境中使用此功能。

可能的取值:

  • 任何正整数。

默认值为 10800。

try_fetch_recompressed_part_timeout

Recompression 是代表更换压缩方式 对数据进行压缩??

Recompression works slow in most cases, so we don’t start merge with recompression until this timeout and trying to fetch recompressed part from replica which assigned this merge with recompression.

Possible values:

  • Any positive integer.

Default value: 7200

always_fetch_merged_part

副本同步时,只拉取合并好的分区

可能的取值:

  • true,false

默认值为 false。

max_suspicious_broken_parts

分区中最大的被损坏的数据块数量,如果超过此值,则停止自动删除。

可能的取值:

  • 任何正整数。

默认值为 100。

max_suspicious_broken_parts_bytes

分区中最大被损坏的数据块的数据总和大小,如果超过此值,则停止自动删除。

可能的取值:

  • 任何正整数。

默认值为 1,073,741,824。(1G)

max_files_to_modify_in_alter_columns

如果要修改(删除、添加)的文件数量大于此设置,则取消ALTER操作。

可能的取值:

  • 任何正整数。

默认值为75。

max_files_to_remove_in_alter_columns

如果在列删除时,需要删除的文件数量大于此设置,则取消ALTER操作。

可能的取值:

  • 任何正整数。

默认值为50。

replicated_max_ratio_of_wrong_parts

如果被损坏的数据块占总数据块的数量的比例小于此值,则允许启动,反之就无法启动

可能的取值:

  • 浮点数,0.0 - 1.0。

默认值为0.5。

replicated_max_parallel_fetches_for_host

副本数据同步线程次大小

可能的取值:

  • 任何正整数。
  • 默认值为15。

replicated_can_become_leader

标记节点是否参与主副本的竞争

可能的取值:

  • true,false

默认值为 true。

zookeeper_session_expiration_check_period

ZooKeeper 会话过期检查周期,以秒为单位。

可能的取值:

  • 任何正整数。

默认值为60。

detach_old_local_parts_when_cloning_replica

在修复丢失的副本时,不要删除旧的本地数据块。

可能的取值:

  • true,false

默认值为 true。

replicated_fetches_http_connection_timeout

拉取数据数据块请求的连接超时(以秒为单位)。如果未明确设置,则继承自默认配置文件的 http_connection_timeout

可能的取值:

  • 任何正整数。
  • 0 - 使用 http_connection_timeout 的值。

默认值为0。

replicated_fetches_http_send_timeout

拉取数据块的请求发送超时时间(以秒为单位。如果未明确设置,则继承自默认配置文件的 http_send_timeout

可能的取值:

  • 任何正整数。
  • 0 - 使用 http_send_timeout 的值。

默认值为0。

replicated_fetches_http_receive_timeout

拉取数据块的请求接收超时时间(以秒为单位)。如果未明确设置,则继承自默认配置文件的 http_receive_timeout

可能的取值:

  • 任何正整数。
  • 0 - 使用 http_receive_timeout 的值。

默认值为0

max_replicated_fetches_network_bandwidth

限制副本同步过程中 数据拉取最大速度,以每秒字节数为单位。这个设置可以应用于特定的表,

max_replicated_fetches_network_bandwidth_for_server用于控制Clickhouse server限制副本同步过程中 数据拉取最大速度,但是对于这个设置,表级别的值应该小于服务器级别的值。否则,服务器只考虑 max_replicated_fetches_network_bandwidth_for_server

这个设置不能完全精确地跟踪。

可能的取值:

  • 正整数。
  • 0 - 无限制。

默认值为0。

用法

可以用于在向新增或替换节点,复制数据时限制速度。

max_replicated_sends_network_bandwidth

限制副本同步过程中 数据发送出去最大速度,以每秒字节数为单位。这个设置可以应用于特定的表,

max_replicated_sends_network_bandwidth_for_server 用于控制Clickhouse server限制副本同步过程中 数据发送出去最大速度,但是对于这个设置,表级别的值应该小于服务器级别的值。否则,服务器只考虑 max_replicated_sends_network_bandwidth_for_server

这个设置不能完全精确地跟踪。

可能的取值:

  • 正整数。
  • 0 - 无限制。

默认值为0。

用法

可以用于在向新增或替换节点,复制数据时限制速度。

old_parts_lifetime

合并后产生的非活动数据块保留时长(以秒为单位)。

可能的取值:

  • 任何正整数。

默认值为:480。

多个数据块合并为一个新数据块后,ClickHouse 将原始数据块标记为非活动状态,如果它们不被现有的查询引用,即数据块的引用计数为零,在 old_parts_lifetime 秒后会删除它们。

对于新的数据块,不会调用 fsync,因此新的数据块在一段时间内仅存在于服务器的内存(操作系统缓存)中。如果服务器异常重启,新的数据块可能会丢失或损坏。为了保护数据,非活动数据块不会立即被删除。

在启动期间,ClickHouse 会检查数据块的完整性。如果合并的数据块已损坏,则将原来非活动数据块放到活动列表中,并在以后再次合并它们。然后,将已损坏的数据块重命名(添加 broken_ 前缀)并移动到 detached 文件夹中。如果合并的数据块未损坏,则将原始非活动数据块重命名(添加 ignored_ 前缀)并移动到 detached 文件夹中。

默认的 dirty_expire_centisecs 值(Linux 内核设置)为 30 秒(需要被写入磁盘数据存储在 内存 中的最长时间),但在磁盘系统的负载高的情况下,数据可以写入得更晚。通过实验,选择了 old_parts_lifetime 的值为 480 秒,这样可以保证新数据块被写入磁盘

max_bytes_to_merge_at_max_space_in_pool

如果有足够的资源可用的情况下,合并为一个数据块的最大总数据块大小(以字节为单位),max_bytes_to_merge_at_max_space_in_pool大致对应于自动后台合并后最大可能数据块大小。

可能的取值:

  • 任何正整数。

默认值为161061273600(150 GB)。

合并调度程序会定期分析分区中的数据块大小和数量,如果池中有足够的空闲资源,则启动后台合并。合并将持续进行,直到源数据块的总大小大于 max_bytes_to_merge_at_max_space_in_pool

由 OPTIMIZE FINAL 发起的合并会忽略 max_bytes_to_merge_at_max_space_in_pool,只考虑可用资源(空闲磁盘空间)进行合并,直到分区中只剩下一个数据块为止。

max_bytes_to_merge_at_min_space_in_pool

可用资源最少的情况, 合并为一个数据块的最小总数据块大小(以字节为单位)

可能的取值:

  • 任何正整数。

默认值为1048576(1 MB)。

max_bytes_to_merge_at_min_space_in_pool 定义了即使缺少可用磁盘空间,也可以合并的数据块的最大总大小。这是为了减少小数据块的数量和“Too many parts”错误的几率。由于合并过程中会翻倍占用磁盘空间。因此,当可用磁盘空间很少时,可能会出现这样的情况:虽然有空闲空间,但该空间已经被正在进行的大型合并所占用,因此其他合并无法启动,并且随着大量的数据插入,小数据块的数量会不断增多。

merge_max_block_size

合并过程中 每次从原始数据中读取的行数。

可能的取值:

  • 任何正整数。

默认值为8192。

数据合并时,将从原始数据中以 merge_max_block_size 行作为一个段进行读取,然后将数据合并写入到新的数据块。读取的数据会被放置在 内存 中,因此 merge_max_block_size 影响合并所需的 内存 大小。因此,对于具有多列的表(如果平均行大小为100kb,则合并10个数据块时,(100kb * 10 * 8192)= ~8GB RAM),合并可能会消耗大量内存。通过减小 merge_max_block_size,可以减少合并所需的内存,但会减低合并操作性能。

number_of_free_entries_in_pool_to_lower_max_size_of_merge

当池中(或复制队列中)的可用空闲条目少于number_of_free_entries_in_pool_to_lower_max_size_of_merge时,开始减少每次合并的数据量 ,减少合并线程占用太多时间

可能的取值:

  • 任何正整数。

默认值为8。

number_of_free_entries_in_pool_to_execute_mutation

当线程池中空闲数少于number_of_free_entries_in_pool_to_execute_mutation时,不再执行数据变更操作。这是为了留出空闲线程进行常规合并操作,避免出现“Too many parts”的错误。

可能的取值:

  • 任何正整数。

默认值为20。

使用:

number_of_free_entries_in_pool_to_execute_mutation 设置的值应该小于 background_pool_size * background_merges_mutations_concurrency_ratio 的值。否则,ClickHouse 会抛出异常。

min_age_to_force_merge_seconds

Merge parts if every part in the range is older than the value of min_age_to_force_merge_seconds.

Possible values:

  • Positive integer.

Default value: 0 — Disabled.

min_age_to_force_merge_on_partition_only

参数 min_age_to_force_merge_seconds是否仅应用于整个分区,而不是应用子目录上(project 目录)。

可能的取值:

  • true,false

默认值为 false。

max_part_loading_threads

加载分区元数据的线程数,默认与机器cup数量相等,在启动期间,ClickHouse 会读取所有表数据块的元数据文件,以构建内存中数据块的列表。如果数据块比较多,这个过程可能需要很长时间,可以通过适当增加max_part_loading_threads来缩短这个启动时间。

可能的取值:

  • 任何正整数。

默认值为 auto(即 CPU 核心数)。

max_partitions_to_read

限制一次查询中可以访问的最大分区数。可以通过查询级别的设置来覆盖表创建时指定的设置值。

可能的取值:

  • 任何正整数。

默认值为-1(无限制)

allow_floating_point_partition_key

允许浮点数类型字段作为分区字段

可能值:

0 - 不允许使用浮点分区键。

1 - 允许使用浮点分区键。

默认值: 0。

check_sample_column_is_correct

Enables the check at table creation, that the data type of a column for sampling or sampling expression is correct. The data type must be one of unsigned integer types: UInt8, UInt16, UInt32, UInt64.

Possible values:

  • true — The check is enabled.
  • false — The check is disabled at table creation.

Default value: true.

By default, the ClickHouse server checks at table creation the data type of a column for sampling or sampling expression. If you already have tables with incorrect sampling expression and do not want the server to raise an exception during startup, set check_sample_column_is_correct to false.

min_bytes_to_rebalance_partition_over_jbod

每次写入某个磁盘阵列时,数据的最小值

可能取值为:

  • 正整数。
  • 0 - 禁用平衡。

默认值为0。

使用:

min_bytes_to_rebalance_partition_over_jbod设置的值应该大于max_bytes_to_merge_at_max_space_in_pool/1024的值。否则,ClickHouse会抛出异常。

detach_not_byte_identical_parts

副本之间数据同步完成后,发现数据与副本数据不一样,是把副本数据卸载掉,还是直接删掉这些数据

可能的取值:

  • 0 - 删除数据块。
  • 1 - 卸载数据块。

默认值为0。

merge_tree_clear_old_temporary_directories_interval_seconds

设置多长时间(单位:秒)清理无用临时目录

可能的取值:

  • 任何正整数。

默认值为60秒。

merge_tree_clear_old_parts_interval_seconds

设置多长时间(单位:秒)清理无用数据

可能的取值:

  • 任何正整数。

默认值为1秒。

max_concurrent_queries

最大查询并发量,收到其他级别max_concurrent_queries的限制,比如整个集群查询最大并发量是100,表的最大查询并发量不能超过100

可能的取值:

  • 正整数。
  • 0 - 没有限制。

默认值为0(没有限制)。

min_marks_to_honor_max_concurrent_queries

The minimal number of marks read by the query for applying the max_concurrent_queries setting. Note that queries will still be limited by other max_concurrent_queries settings.

Possible values:

  • Positive integer.
  • 0 — Disabled (max_concurrent_queries limit applied to no queries).

Default value: 0 (limit never applied).

ratio_of_defaults_for_sparse_serialization

列中默认值数量 与 所有值数量 之比 的最小值。设置该值主要是为了使用 稀疏序列化存储,提升查询效率。

如果列是稀疏的(比如大部分行都是0),ClickHouse可以使用稀疏格式对其进行编码,在查询过程中 数据不需要进行完全解压缩 提升查询效率。要启用此 稀疏序列化 压缩特性,请将ratio_of_defaults_for_sparse_serialization设置为小于1.0的值。如果该值大于或等于1.0(默认值),则使用常规的方法序列化 列数据。

可能的取值:

  • 介于0和1之间的小数,表示启用稀疏序列化特性。
  • 如果不想使用稀疏序列化,则设置为1.0或更大。

默认值为1.0(表示禁用稀疏序列化特性)。

案例

以下表中的s列有95%的行为空字符串。在my_regular_table中,我们不使用稀疏序列化,在my_sparse_table中,我们将ratio_of_defaults_for_sparse_serialization设置为0.95

CREATE TABLE my_regular_table
(
    `id` UInt64,
    `s` String
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO my_regular_table
SELECT
    number AS id,
    number % 20 = 0 ? toString(number): '' AS s
FROM
    numbers(10000000);


CREATE TABLE my_sparse_table
(
    `id` UInt64,
    `s` String
)
ENGINE = MergeTree
ORDER BY id
SETTINGS ratio_of_defaults_for_sparse_serialization = 0.95;

INSERT INTO my_sparse_table
SELECT
    number,
    number % 20 = 0 ? toString(number): ''
FROM
    numbers(10000000);

注意:my_sparse_table表中的s列在磁盘上使用的存储空间较少:

SELECT table, name, data_compressed_bytes, data_uncompressed_bytes FROM system.columns
WHERE table LIKE 'my_%_table';
┌─table────────────┬─name─┬─data_compressed_bytes─┬─data_uncompressed_bytes─┐
│ my_regular_table │ id   │              37790741 │                75488328 │
│ my_regular_table │ s    │               2451377 │                12683106 │
│ my_sparse_table  │ id   │              37790741 │                75488328 │
│ my_sparse_table  │ s    │               2283454 │                 9855751 │
└──────────────────┴──────┴───────────────────────┴─────────────────────────┘

您可以通过查看system.parts_columns表的serialization_kind列来验证列是否使用稀疏编码:

SELECT column, serialization_kind FROM system.parts_columns
WHERE table LIKE 'my_sparse_table';
┌─column─┬─serialization_kind─┐
│ id     │ Default            │
│ s      │ Default            │
│ id     │ Default            │
│ s      │ Sparse             │
│ id     │ Default            │
│ s      │ Sparse             │
└────────┴────────────────────┘

clean_deleted_rows

启用/禁用使用ReplacingMergeTree引擎的表上执行OPTIMIZE … FINAL时自动删除标记为is_deleted的行。当禁用时,必须在OPTIMIZE … FINAL中添加CLEANUP关键字才能获得相同的行为。

可选的值

Always 或者 Never

默认:Never

参考资料

https://clickhouse.com/docs/en/operations/settings/settings

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值