这是《ClickHouse 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 ClickHouse 监控要覆盖服务存活、资源、存储、合并、副本、查询、写入和业务指标。只有服务 green 不代表链路健康。
27.1 监控层次
基础设施
-> ClickHouse 服务
-> 存储与合并
-> 副本与集群
-> 查询与写入
-> 业务数据质量
27.2 系统表
常用表:
| 系统表 | 用途 |
|---|---|
| system.metrics | 当前指标 |
| system.events | 累计事件 |
| system.asynchronous_metrics | 异步指标 |
| system.query_log | 查询日志 |
| system.part_log | part 操作 |
| system.merges | 当前合并 |
| system.replicas | 副本状态 |
| system.disks | 磁盘 |
| system.clusters | 集群 |
查看核心指标:
SELECT metric, value
FROM system.metrics
WHERE metric IN (
'Query',
'Merge',
'ReplicatedFetch',
'DistributedSend',
'Read',
'Write'
);
27.3 Prometheus
ClickHouse 提供 Prometheus 格式的 HTTP 端点,也可以使用 exporter。抓取配置示例:
scrape_configs:
- job_name: clickhouse
static_configs:
- targets:
- ch-01:8123
- ch-02:8123
采集内容要结合版本确认。常见监控项:
| 分类 | 指标 |
|---|---|
| 服务 | uptime、version、HTTP 可用 |
| CPU | 使用率、iowait |
| 内存 | used、swap、OOM |
| 磁盘 | 空间、IO util、延迟 |
| 查询 | QPS、失败率、耗时 |
| 写入 | 行数、字节、失败 |
| 合并 | 当前数、耗时、异常 |
| 副本 | readonly、queue、delay |
27.4 磁盘监控
SELECT
name,
path,
total_space,
free_space,
unreserved_space
FROM system.disks
ORDER BY free_space;
告警建议:
- 空间使用率超过 70% 预警;
- 超过 85% 处理;
- 剩余空间低于合并预估临时空间则高危;
- 磁盘只读立即处理。
27.5 合并与 part 监控
SELECT
database,
table,
count() AS active_parts,
sum(rows) AS rows,
sum(bytes_on_disk) AS bytes
FROM system.parts
WHERE active
GROUP BY database, table
ORDER BY active_parts DESC;
SELECT count() AS running_merges
FROM system.merges;
告警:
| 条件 | 级别 |
|---|---|
| 单分区 parts 持续增长 | 预警 |
| 接近 max parts_in_total | 高危 |
| merge 异常增加 | 预警 |
| 磁盘 IO util 持续 90%+ | 高危 |
27.6 副本监控
SELECT
database,
table,
replica_name,
is_readonly,
queue_size,
inserts_in_queue,
merges_in_queue,
absolute_delay
FROM system.replicas;
告警:
- 任一副本 readonly;
- queue_size 持续增长;
- absolute_delay 超过阈值;
- Keeper 会话断开;
- 副本消失。
27.7 查询监控
SELECT
count() AS total,
countIf(type = 'QueryFinish') AS finished,
countIf(type = 'ExceptionWhileProcessing') AS failed,
avg(query_duration_ms) AS avg_ms,
max(query_duration_ms) AS max_ms
FROM system.query_log
WHERE event_date = today();
Top 慢查询:
SELECT query, query_duration_ms, read_bytes, memory_usage
FROM system.query_log
WHERE type = 'QueryFinish'
ORDER BY query_duration_ms DESC
LIMIT 20;
27.8 Kafka 链路监控
必须采集:
- consumer group lag;
- topic 分区落后;
- 消息错误数;
- dead letter 数量;
- ClickHouse 写入失败;
- 目标表行数环比。
查看 ClickHouse 消费者:
SELECT database, table, consumer_id, assignments.topic
FROM system.kafka_consumers;
27.9 日志
常见日志:
/var/log/clickhouse-server/clickhouse-server.log
/var/log/clickhouse-server/clickhouse-server.err.log
搜索关键字:
rg -n "Too many parts|MEMORY_LIMIT_EXCEEDED|KeeperException|DNS_ERROR|Timeout|Broken part|Disk space" \
/var/log/clickhouse-server
日志保留要与故障回溯窗口匹配,并集中采集到日志系统。
27.10 告警分级
| 级别 | 示例 |
|---|---|
| P0 | 集群不可用、磁盘满、多数 Keeper 失败 |
| P1 | 大量写入失败、副本 readonly、核心报表无数据 |
| P2 | lag 增长、慢查询增加、parts 上涨 |
| P3 | 配置漂移、低峰任务超时 |
每条告警应有 runbook:原因、检查 SQL、处理步骤、升级路径。
本章小结
监控 ClickHouse 不能只看进程和端口。磁盘、合并、副本队列、查询成本、Kafka lag 和业务对账共同决定系统健康。告警必须可行动,并配套可执行的排查手册。
思考题
- 为什么磁盘空间监控要预留合并空间?
- 副本 queue_size 增长说明什么?
- 如何发现高成本 SQL?
- Kafka lag 应按什么维度告警?
- 一条合格告警应包含哪些信息?