背景介绍

目前线上环境 clickhouse 版本为 22.2.2.1

此版本发布时间为 2022-09-02 算是比较老的版本了,不过线上一直运行较为稳定

近期开始出现 ttl 失效问题,表现为磁盘占用提升,apm 表未按照预期 ttl 进行数据清理

 

ck 某个节点 fs_usage 持续上升

目前线上 ck 共由三副本组成:

replica_namecpu/mem存储设备磁盘使用率
apm-ck-132c128g5.4T/7.8T ssd73%
apm-ck-232c128g5.4T/7.8T ssd73%
apm-ck-332c128g6.4T/7.8T ssd87%

其中 apm-ck-3 节点磁盘占用由于 ttl 失效提升至 87%

目前所有表 ttl 均为 14 天,理论上 ck 会周期性的清除 14 天前的分区数据,但由于某种原因,apm-ck-3 节点 ttl 失效,导致仍旧存在 14 天前的分区数据

以最大的 dubbo 请求指标表为例:

表结构:

可以看到 ttl 设置为 14 天

查看分区数据量

可以看到 14 天前从 2025-07-292025-08-01,共有 4 天的分区数据未被清除

并非只有 middleware_dubbo_service_request_total_ck_shard 表,从 2025-07-29 开始所有表 ttl 均失效

问题排查

查看 ck 节点存储占用情况

 

查看 ttl 失效表的 TTL_DELETE 任务是否被推迟

可以看到任务被推迟 34983 次,推迟原因是:Not executing log entry queue-1860678115 for part 20250809_0_1781810_65 because 2 merges with TTL already executing, maximum 2.

受限于 TTL 合并任务的最大执行次数 2,这导致本任务一直被推迟

在ClickHouse的配置文件(如 config.xml)或用户配置文件中,增加以下参数的值:

 

可以提升 ttl 合并任务的并发数

尝试从 2 提升到 100,重启 clickhouse-server

此时再查询任务列表发现:

 

可以看到推迟原因变成了:Not executing log entry queue-1860678115 of type MERGE_PARTS for part 20250809_0_1781810_65 because source parts size (145.41 GiB) is greater than the current maximum (19.80 MiB).

这里也有一个配置项 max_bytes_to_merge_at_max_space_in_pool,在最新版的配置中它被默认为 150GB

根据我们的存储现状,将其修改为 200GB 也就是 214748364800,再次重启 clickhouse

 

clickhouse ttl 原理

了解 clickhouse merge

了解 ttl 为什么发生在 merge 期间

手动删除分区

 

注:

当删除任务卡住,可以查询系统表 system.replication_queue,确认是否有卡住的任务:

如果任务长时间卡住(如 num_tries 过高或 last_exception 报错),执行下面的 sql 重启表的副本(强制重置队列状态)

再手动删除 detached 目录,一般为:

 

适当增大 background_pool_size

提升后台线程 cpu 利用率,酌情提高,可能影响查询

开启 ttl_only_drop_parts

提升 ttl 删除失效数据的速度