本节摘要:监控是运维的眼睛。本节把 ClickHouse 的关键指标分层(系统/服务/查询/副本),给出告警阈值建议,并讲怎么搭监控体系。
阅读完本节,你应当能够:
ClickHouse 的监控指标可以分成四层,从底到上:系统资源、服务状态、查询质量、副本健康。

ClickHouse 把大量指标暴露在 system.* 表里,配合 Prometheus exporter 采集。几个必盯的:
| 指标 | 来源 | 告警阈值 |
|---|---|---|
| 磁盘使用率 | system.disks | >85% 警告,>92% 紧急 |
| 活跃 part 数 | system.parts (active=1) | 单表 >1000 查合并 |
| 合并队列长度 | system.merges | 持续 >10 排查 |
| 慢查询数 | system.query_log | >10s 的查询激增告警 |
| 查询失败率 | system.query_log | >1% 告警 |
| 副本延迟 | system.replicas.absolute_delay | 持续 >100 排查 |
| ZooKeeper 会话 | system.replicas.is_session_expired | 任一节点 expired 告警 |
| 内存使用 | system.metrics | 接近 max_memory_usage 告警 |
排查问题时这几个表最常用:
-- 磁盘 SELECT name, path, free, total FROM system.disks; -- 活跃 part 数(按表) SELECT database, table, count() AS parts FROM system.parts WHERE active GROUP BY database, table ORDER BY parts DESC LIMIT 20; -- 合并进度 SELECT database, table, elapsed, progress, num_parts FROM system.merges; -- 副本状态 SELECT database, table, replica_name, absolute_delay, is_readonly FROM system.replicas; -- 慢查询 SELECT query_duration_ms, query, ReadRows, MemoryUsage FROM system.query_log WHERE type = 'QueryFinish' AND query_duration_ms > 10000 ORDER BY query_duration_ms DESC LIMIT 20;
主流方案是 Prometheus + Grafana:
system.* 指标转成 Prometheus 格式。社区有现成的 ClickHouse Grafana 仪表盘模板,导入即用,再按自己集群调整。
监控会报很多,要学会区分:
⚠️ 常见坑:新手把所有指标都设告警,结果告警泛滥,真正出问题反而被淹没。告警要少而精——只盯会导致故障的指标,设合理阈值,避免"狼来了"。
💡 关键直觉:监控的价值不在"看多少指标",在"出问题时能快速定位"。四层指标 + 合理阈值 + 少而精的告警,比堆一百个仪表盘有用。
下一节讲备份与恢复——出事时的保险。
监控体系搭好之前,先用几条 SQL 把核心指标查出来,手工做一张"体检表"也很有价值。下面的语句可以在几条查询里汇总四层指标:
-- 服务层:当前连接数、正在执行的查询数 SELECT (SELECT value FROM system.metrics WHERE metric = 'TCPConnection') AS tcp_conn, (SELECT count() FROM system.processes) AS running_queries; -- 数据层:各表活跃 part 数 SELECT database, table, count() AS active_parts FROM system.parts WHERE active GROUP BY database, table ORDER BY active_parts DESC LIMIT 10; -- 查询质量:最近一小时的慢查询数与失败率 SELECT countIf(query_duration_ms > 10000) AS slow_count, countIf(exception IS NOT NULL) / count() AS fail_rate FROM system.query_log WHERE event_time > now() - INTERVAL 1 HOUR AND type = 'QueryFinish';
这三段可以组合成一个"每日体检"脚本,输出一行健康概览。等 Prometheus + Grafana 搭好后,把同样的指标接进去持续采集,体检就从"每日一次"变成"实时刷新"。
告警阈值设计有一个实用的原则:阈值要比"正常波动上限"略高,比"故障下限"略低。比如磁盘使用率,正常运营一般到 60%-80%,故障临界在 90% 以上,把警告设在 85%、紧急设在 92%,既不会天天误报,也不会等爆盘才发现。
别忘了把告警分级:警告级(磁盘 85%)当天处理即可,紧急级(副本会话过期、磁盘 92%)要立刻响应。分级能让值班的人分清轻重缓急,避免所有告警一视同仁带来的麻木。
前面讲了看哪些指标,这里落到可执行的一步:把慢查询阈值和失败率做成每日自检视图。用 system.query_log 配一个简单的视图,值班的人每天看一眼就能掌握整体质量:
-- 建立慢查询与失败率自检视图 CREATE VIEW v_query_health AS SELECT toStartOfHour(event_time) AS hour, countIf(query_duration_ms > 10000) AS slow_queries, countIf(exception IS NOT NULL) AS failed_queries, count() AS total_queries FROM system.query_log WHERE type = 'QueryFinish' GROUP BY hour ORDER BY hour DESC;
这个视图把"查询质量"压缩成按小时一行,慢查询数和失败数一目了然。等 Prometheus 接入后,同一个查询可以直接转成指标表达式,阈值和分级沿用前面讨论的规则。监控不是越复杂越好——先把核心指标查到、看到、告警到,再逐步丰富,是运维体系从零到一的正确路径。