ClickHouse 自动 Merge 完整详解(MergeTree 引擎核心机制)
一、什么是自动 Merge
MergeTree 系列引擎(包含 ReplacingMergeTree/AggregatingMergeTree)写入数据时不会直接合并分区内数据,每次 INSERT 都会生成独立小数据块(part); ClickHouse 后台有自动合并后台线程,定时把多个小 part 合并成大 part,实现:
- 减少文件数量,降低磁盘 IO、元数据查询开销
- 执行去重、聚合、数据压缩(Replacing/Aggregating 引擎依赖 Merge 生效逻辑)
- 回收过期、删除标记数据
整个过程完全后台自动执行,无需人工干预,也支持手动触发、参数调优。
二、自动 Merge 触发规则
1. 基础触发条件(默认阈值)
- 同一分区内存在多个 part;
- 满足最小合并块数量:
merge_tree_min_rows_for_concurrent_merge/merge_tree_min_rows_for_active_parts; - 后台合并线程池有空闲资源;
- 避开磁盘、CPU 高负载限流。
2. 自动合并优先级
- 小 part 优先合并:零散几百 / 几千行的小块优先合并,防止文件爆炸;
- 分层合并:小块→中层块→超大块,阶梯式合并;
- 带删除标记、TTL 过期的 part 优先合并清理;
- 大分区冷数据合并会降低优先级,避免占用业务 CPU。
3. 关键:ReplacingMergeTree/AggregatingMergeTree 依赖 Merge
你业务使用的 AggregatingMergeTree(Bitmap 分群表)、ReplacingMergeTree:
- 未 Merge 前:多条同主键数据会同时存在,查询会返回多条原始数据;
- 只有自动 Merge 完成后,才会执行聚合 / 去重逻辑,得到最终一条合并结果;
- 临时查询想要实时去重,必须手动加
FINAL:
sql
三、查看当前合并状态(排查卡顿 / 堆积)
1. 查看全局合并任务
sql
字段说明:
database/table:执行合并的库表elapsed:已耗时progress:合并进度 0~1rows_read/rows_written:读写行数
2. 查看表内所有数据块 part(判断是否堆积大量小块)
sql
active=1:当前可用数据块;- 若单分区几十上百个小 part,说明自动 Merge 跟不上写入速度,需要调参。
3. 查看合并相关系统参数
sql
四、核心自动 Merge 调优参数(解决合并跟不上、CPU 打满)
1. 控制并发合并线程数(最常用)
ini
2. 控制触发合并的最小数据量
ini
3. 限流保护:防止合并吃光磁盘 IO/CPU
ini
4. 分层合并控制(避免无限叠加超大块)
ini
五、手动操作 Merge(自动合并堆积时应急)
1. 手动触发指定分区全量合并
sql
FINAL:强制合并并执行聚合 / 去重(Replacing/Aggregating 必须加);- 适合分群 Bitmap 表,定时执行让位图提前合并,查询不加 FINAL 也能拿到完整 UV。
2. 整表全部分区合并
sql
⚠️ 高并发业务慎用,会占用大量 IO,建议低峰期执行。
3. 取消卡住的合并任务
sql
六、常见自动 Merge 问题 & 解决方案
问题 1:大量小 part 堆积,合并跟不上写入
现象:system.parts 单分区几十上百个小块,查询变慢 解决:
- 调高
max_background_merges增加并发合并线程; - 批量写入时加大单次 insert 行数,减少小 part 生成;
- 低峰定时
OPTIMIZE TABLE ... FINAL手动兜底合并。
问题 2:合并 CPU / 磁盘 IO 打满,业务查询超时
解决:
- 降低
merge_tree_max_write_bandwidth限流; - 开启
merge_tree_stop_merges_on_high_load自动限流; - 拆分大分区(缩短分区粒度,按天 / 按 6 小时分区)。
问题 3:AggregatingMergeTree 查询 UV 数值不准
根因:自动 Merge 未完成,多个位图块未聚合 解决:
- 查询统一加
FINAL; - 定时凌晨低峰执行
OPTIMIZE TABLE xxx FINAL提前合并位图。
问题 4:合并任务卡死、长时间 progress 不动
- 磁盘满、磁盘坏道、文件权限异常;
- 大 part 合并内存不足,调大
merge_tree_max_memory_usage; - 执行
KILL MUTATION终止卡死任务,重启 CK 服务。
七、业务落地建议(适配你的 Bitmap 分群表)
- 分群结果表
AggregatingMergeTree建议按天分区分割,减少单分区合并压力; - 每日凌晨定时执行
OPTIMIZE TABLE {project}_segment_results FINAL,预合并位图,提升白天报表查询速度; - 监控
system.merges任务数量、system.parts块数量,堆积过多自动告警; - 批量写入分群数据时,单次 insert 聚合更多用户,减少零散小 part 生成。
:
一站式技术运维 和 业务分析平台,一站式大数据分析系统,我们致力于解决线上的疑难杂症和精细化分析业务数据;全链路监控系统面向技术、埋点系统面向业务,两者配合使用,相得益彰,为企业数字化业务保驾护航。