土法炼钢 · 系统与基础设施

【列存引擎内核】监控与系统表

文章导航

分类入口
databaseobservability
标签入口
#clickhouse#system-tables#monitoring#parts#merge#replication#query-log

目录

MergeTree 的健康状况 几乎全在 system 表——不像 PostgreSQL 需凑 pg_stat_* + OS。平台工程师应把 system.partssystem.mergessystem.replicassystem.query_log 纳入基线监控,并与 可观测性系列 的 metrics/logs 栈对接:Pull SQL → Prometheus clickhouse_exporter 或定制 cron。

本文说明 字段含义、组合查询、告警阈值思路——不编造具体数字阈值;阈值须按集群规模与 SLA 在本环境标定。

版本锚定:ClickHouse 24.x LTS


一、监控分层

flowchart TB
  subgraph l1 [L1 存活]
    UP[HTTP /ping]
    ZK[Keeper 连通]
  end
  subgraph l2 [L2 存储健康]
    P[parts 数量]
    M[merge 队列]
    R[replica lag]
  end
  subgraph l3 [L3 查询]
    Q[query_log 延迟]
    MEM[memory tracking]
  end
  subgraph l4 [L4 业务]
    SLA[dashboard p95]
  end
  l1 --> l2 --> l3 --> l4
层级 目标 主要数据源
L1 进程与协调 system.metrics, Keeper
L2 Part/Merge/副本 parts, merges, replicas
L3 查询与资源 query_log, events, asynchronous_metrics
L4 业务 SLA 应用 + CH 聚合

二、system.parts

Part 是 MergeTree 数据单元(第 02 篇)。

2.1 核心字段

字段 含义
database, table 逻辑表
partition 分区键字符串
name Part 目录名
active 是否参与查询(merge 后旧 part 为 0)
rows, bytes_on_disk 规模
level merge 深度(越大 part 越大)
modification_time 最后修改
min_date, max_date 分区列范围(视表定义)

2.2 常用查询

-- 每表 active part 数(too many parts 前兆)
SELECT database, table, count() AS parts, sum(rows) AS rows, sum(bytes_on_disk) AS bytes
FROM system.parts
WHERE active
GROUP BY database, table
ORDER BY parts DESC;

-- 分区级 part 数
SELECT database, table, partition, count() AS parts
FROM system.parts
WHERE active
GROUP BY database, table, partition
HAVING parts > 50
ORDER BY parts DESC;

告警思路:单表 active parts 持续增长且不回落 → merge 跟不上(第 15 篇)。阈值取决于 parts_to_throw_insert 配置(第 16 篇)。

2.3 Wide vs Compact

part_type 字段(版本相关)——Wide 每列独立文件;监控磁盘时 bytes_on_disk 已含全部。


三、system.merges

后台 merge 任务实时视图。

字段 含义
database, table 目标表
elapsed 已运行秒
progress 0~1 进度(若可用)
num_parts 合并 part 数
result_part_name 产出 part
total_size_bytes_compressed 输入压缩大小
memory_usage 当前内存
SELECT database, table, elapsed, progress, num_parts, memory_usage
FROM system.merges
ORDER BY elapsed DESC;

告警思路

Merge 机制(第 06 篇) 对照读 merge_algorithm


四、system.replication_queue

ReplicatedMergeTree 待执行 log entry(第 08 篇)。

SELECT database, table, replica_name, position, node_name, type, create_time, num_tries, last_exception
FROM system.replication_queue
ORDER BY create_time
LIMIT 50;
信号 含义
position 持续增大 副本 lag
num_tries 执行失败重试
last_exception 非空 需人工介入
SELECT database, table,
       max(log_max_index - log_pointer) AS lag_approx
FROM system.replicas
GROUP BY database, table;

(字段名以 24.x 为准——log_pointerlog_max_index 等。)


五、system.replicas

副本状态汇总。

字段 含义
is_leader 是否 leader replica
is_readonly 只读(ZK 断等)
absolute_delay 与 leader 延迟秒
queue_size 队列长度
inserts_in_queue 待 insert
merges_in_queue 待 merge
SELECT database, table, replica_name, is_leader, is_readonly, absolute_delay, queue_size
FROM system.replicas
WHERE absolute_delay > 0
ORDER BY absolute_delay DESC;

告警is_readonly=1absolute_delay 超 SLA → 副本故障模式(第 15 篇)。


六、system.query_log

需配置 query_log(通常默认开启)。

SELECT
    type,
    event_time,
    query_duration_ms,
    read_rows,
    read_bytes,
    written_rows,
    memory_usage,
    exception_code,
    query
FROM system.query_log
WHERE event_date = today()
  AND type = 'QueryFinish'
ORDER BY query_duration_ms DESC
LIMIT 20;
字段 用途
read_rows vs result 剪枝效率
ProfileEvents 细粒度 counter(JSON)
used_row_policies 权限
distributed_depth 分布式层数

慢查挖掘:

SELECT normalizeQuery(query) AS q, count(), avg(query_duration_ms), max(read_rows)
FROM system.query_log
WHERE event_date >= today() - 7 AND type = 'QueryFinish' AND query_duration_ms > 1000
GROUP BY q
ORDER BY count() DESC
LIMIT 20;

不粘贴示例输出


七、system.metrics 与 asynchronous_metrics

SELECT metric, value FROM system.metrics WHERE metric LIKE '%Merge%';
SELECT metric, value FROM system.asynchronous_metrics WHERE metric LIKE '%Memory%';

对接 Prometheus:社区 exporter 映射这些指标——版本与 metric 名随 CH 演进,部署时 diff 24.x 文档。


八、system.events

累积 counter,重启清零。

SELECT event, value FROM system.events
WHERE event IN ('InsertedRows', 'MergedRows', 'OSIOWaitMicroseconds')
ORDER BY value DESC
LIMIT 30;

计算 ingest 速率:两次采样 InsertedRows 差 / Δt。


九、system.mutations

SELECT database, table, mutation_id, command, create_time, parts_to_do, is_done, latest_failed_part
FROM system.mutations
WHERE NOT is_done
ORDER BY create_time;

parts_to_do 长期不降 → mutation 堆积(第 15 篇)。


十、system.detached_parts

异常 part 被 detach 后躺在此——磁盘泄漏与复制异常信号。

SELECT database, table, name, reason, bytes_on_disk
FROM system.detached_parts;

十一、内存 tracking

Settings:

SELECT formatReadableSize(value) FROM system.settings WHERE name = 'max_server_memory_usage';

system.processes 看当前查询内存:

SELECT query_id, user, elapsed, formatReadableSize(memory_usage) AS mem, query
FROM system.processes
ORDER BY memory_usage DESC;

十二、分布式监控

逐 shard 跑相同 SQL 或通过 cluster()

SELECT hostName(), count() AS parts
FROM clusterAllReplicas('prod', system.parts)
WHERE active AND database = 'db' AND table = 'events_local'
GROUP BY hostName();

第 09 篇 Distributed 写入不均时 parts 倾斜可见。


十三、与 observability 栈集成

方式 说明
Prometheus exporter scrape SQL metrics
ClickHouse 存 logs/traces 自举——meta
Grafana CH datasource + 系统表 SQL
告警 Alertmanager 规则 on exporter metrics

指标体系 建议:Ticket 级 告警 parts/merge lag;Page 级 仅当 CH 故障影响业务 SLA。


十四、基线采集脚本框架

#!/bin/bash
# 示例:cron 每分采集 parts 计数 — 须配置 clickhouse-client
clickhouse-client --query "
  SELECT now(), database, table, count() AS parts
  FROM system.parts WHERE active
  GROUP BY database, table
  FORMAT CSV
" >> /var/log/ch_parts_baseline.csv

十五、DuckDB 监控(对照)

DuckDB 无 system.parts——嵌入式用:

PRAGMA database_size;
SELECT * FROM duckdb_memory();

生产 OLAP 监控主战场仍是 ClickHouse;DuckDB 进程内由宿主应用 metrics。


十六、学术谱系:论文少谈的运维可观测

列存论文(C-Store、X100、Abadi 2008)证明 scan/压缩/向量化;生产故障却常来自 parts 计数、merge 队列、副本 lag——实验设定很少把 system.* 当一等公民。

坐标 论文侧 本篇落点
正确性 / 吞吐 TPC-H 类 query_log 读字节
后台归并 一笔带过 system.merges / parts
副本 常假设单机 replicas / replication_queue

16.1 开放问题

  1. 哪些 system 指标应成为「列存 SLO」标准集? 可检验:parts 数、merge 积压、replica lag 与查询 p95 的相关(入口:第 15 篇故障模式;CH system tables)。
  2. 论文基准是否应强制报告 merge 与 parts 状态? 仍开放;本站要求自测时记录环境(WRITING_GUIDE)。

十七、小结

回答什么
parts 是否 too many parts
merges merge 是否堵住
replicas / replication_queue 副本是否 lag
query_log 谁慢、读多少行
mutations ALTER 是否堆积
processes 谁在耗内存

附录 A、system.parts 与 disk 联合

SELECT
    database,
    table,
    formatReadableSize(sum(bytes_on_disk)) AS disk,
    count() AS parts,
    sum(rows) AS rows
FROM system.parts
WHERE active
GROUP BY database, table
ORDER BY sum(bytes_on_disk) DESC
LIMIT 30;

附录 B、ProfileEvents 示例键

Event 含义
SelectedParts 选中 part 数
SelectedMarks 选中 mark 数
OSIOWaitMicroseconds IO 等待
RealTimeMicroseconds 墙钟
MemoryAllocator 相关 分配

query_log.ProfileEvents JSON 解析——键名随版本增删。

附录 C、query_log 表引擎与 TTL

query_log 自身是 MergeTree——可 TTL event_date + INTERVAL 30 DAY 防磁盘涨。log_queries_min_type 控制写入类型。

附录 D、Prometheus 映射思路

业务指标 SQL 来源
parts_total count system.parts
merge_running count system.merges
replica_delay_max max absolute_delay
insert_rows_rate delta InsertedRows

exporter 定时 scrape——阈值在 Grafana 按环境设

上一篇选型对照

下一篇经典故障模式

参考资料

核心论文 / 坐标

  1. C-Store / X100 / Abadi 2008(第 01/04 篇)——证明列存正确性与吞吐;本篇补运维可观测缺口

规范 / 源码 / 文档

  1. ClickHouse Documentation, System tablesMonitoring(24.x;A 级)。
  2. Altinity Knowledge Base — 运维查询(B 级,版本标注)。

读完这篇,下一步读什么

优先读同系列或同问题的下一篇,把单篇消费变成主题集群。

2026-06-18 · database / storage

【列存引擎内核】Merge 与 Mutation

MergeTree 后台 merge 触发与 selector、ReplacingMergeTree/CollapsingMergeTree 语义、ALTER UPDATE/DELETE mutation 异步路径与危害。对照 LSM compaction。源码 MergeTreeDataMergerMutator。24.x LTS。

2026-06-18 · database / distributed

【列存引擎内核】ReplicatedMergeTree

ReplicatedMergeTree 副本协调:Log entry、ClickHouse Keeper/ZooKeeper 路径、副本同步与 recovery。双节点实验步骤(本环境未部署)。24.x LTS 默认推荐 Keeper。

2026-06-18 · database / architecture

【列存引擎内核】经典故障模式

Too many parts、merge 跟不上 insert、mutation 堆积、副本延迟与 lost replica、max_memory_usage OOM 的症状链、根因与缓解;附测试环境复现框架。

2026-06-18 · database / storage

【列存引擎内核】列存基础与 ClickHouse 架构

行存 vs 列存的带宽、压缩与向量化三角;ClickHouse Server 进程模型、线程池与 MergeTree 引擎家族地图;src/Storages 与 src/Processors 源码入口。对照 PG 行存与 LSM 写优化路径,版本锚定 ClickHouse 24.x LTS。


By .