4. 监控体系设计

ClickHouse 作为市场数据监控的存储与分析底座,其监控体系不能只盯着“服务是否存活”。市场数据场景具有写入吞吐高、查询模式多变、数据时效敏感、容量增长快等特点,监控体系必须同时覆盖资源层、数据库层、业务层和容量层。本节围绕指标分类、采集频率、告警阈值和可视化方案四个维度,给出一套可落地的设计方法。

一、核心原理:四层指标分类模型

监控指标如果混在一起采集和告警,会导致噪声大、定位慢。建议按“资源—数据库—业务—容量”四层分类,每层关注不同的对象和判断逻辑。

  • 资源层:CPU、内存、磁盘 IO、网络带宽、文件句柄、磁盘使用率。关注点是“机器是否成为瓶颈”。
  • 数据库层:查询 QPS、写入行数/秒、Merge 队列长度、Part 数量、副本延迟、ZooKeeper/Keeper 会话状态、连接数。关注点是“ClickHouse 内部是否健康”。
  • 业务层:行情快照写入延迟、K 线聚合任务完成时间、行情查询 P95/P99 延迟、数据缺口数量、乱序数据比例。关注点是“市场数据是否完整、及时、可查”。
  • 容量层:单表日增数据量、压缩后磁盘占用、分区数量、TTL 剩余天数、未来 30 天预测容量。关注点是“还能撑多久”。
四层指标不是孤立的。例如业务层“查询 P99 升高”往往由数据库层“Merge 队列积压”引起,而 Merge 积压又可能源于资源层“磁盘 IO 饱和”。分类的目的是让告警能沿着链路快速下钻。

二、采集频率:按指标变化速度分层

采集频率不是越高越好。频率过高会增加 ClickHouse 自身和采集器的负担,频率过低会漏掉尖峰。建议按指标变化速度分三档:

频率 适用指标 采集方式 保留周期
10 秒 CPU、内存、查询 QPS、写入行数、Merge 队列、副本延迟 Prometheus + clickhouse-exporter 15 天
1 分钟 Part 数量、分区数量、磁盘使用率、连接数、Keeper 延迟 Prometheus 或定时 SQL 采集 90 天
1 小时 / 1 天 日增数据量、压缩率、TTL 剩余天数、容量预测、数据缺口统计 物化视图或离线任务写入监控表 1 年以上

对于市场数据业务,写入延迟和数据缺口建议采用 10 秒级采集,因为行情中断几分钟就可能造成不可逆的数据缺失。而容量类指标变化慢,1 小时或 1 天采集一次即可。

三、告警阈值:静态基线 + 动态偏离

阈值设计最容易犯的错误是“拍脑袋定一个固定值”。市场数据有明显的高峰和低谷,固定阈值在开盘时段频繁误报,在收盘时段又过于宽松。推荐组合策略:

  1. 静态硬阈值:用于绝对红线,如磁盘使用率 > 85%、副本延迟 > 300 秒、Keeper 无主 > 60 秒。这类指标一旦触发必须立即处理。
  2. 动态基线:对查询 QPS、写入行数等周期性指标,用过去 7 天同时段均值 ± 3 倍标准差作为正常区间,偏离则告警。
  3. 趋势预测:对容量类指标,用线性回归预测未来 30 天磁盘占用,若预测值超过 80% 则提前告警。
  4. 业务 SLO 阈值:行情查询 P99 < 500ms、K 线聚合任务在开盘前 30 分钟完成、数据缺口为 0。这类阈值直接对应业务承诺。
告警阈值必须与“告警分级”绑定。P0 级(数据中断、副本不可用)走电话+短信;P1 级(查询变慢、Merge 积压)走企业微信/钉钉;P2 级(容量预警、慢查询增多)走邮件日报。否则所有告警都发到同一个群,很快就会被忽略。

四、可视化方案:从总览到下钻

可视化不是把 Grafana 面板堆满,而是按“总览—分层—单实例—单表”四级下钻设计。总览看红绿灯,分层看趋势,单实例看资源,单表看分区和 Part。市场数据场景建议至少包含以下面板:

  • 行情写入总览:写入行数/秒、写入延迟 P99、乱序比例、缺口数量。
  • 查询健康度:QPS、P95/P99 延迟、慢查询 Top 10、失败查询数。
  • ClickHouse 内部状态:Merge 队列、Part 数量、副本延迟、Keeper 延迟。
  • 容量趋势:日增数据量、压缩后占用、TTL 剩余天数、30 天预测曲线。

下面是一段用于采集“单表日增数据量与分区占用”的 SQL 示例,可写入监控表后由 Grafana 读取:

SELECT
    table,
    partition,
    sum(rows) AS rows,
    formatReadableSize(sum(bytes_on_disk)) AS disk_size,
    max(modification_time) AS last_modify
FROM system.parts
WHERE active = 1
  AND database = 'market_data'
GROUP BY table, partition
ORDER BY table, partition;

该查询按表和分区聚合,能快速发现某个分区异常膨胀或长时间未更新。配合定时任务写入监控表后,即可在 Grafana 中绘制分区增长曲线。

ClickHouse 市场数据监控体系:四层指标 × 采集频率 资源层 CPU · 内存 · 磁盘IO · 网络 · 文件句柄 10 秒采集 数据库层 QPS · Merge队列 · Part数 · 副本延迟 · Keeper 10 秒 / 1 分钟 业务层 写入延迟 · 查询P99 · 数据缺口 · 乱序比例 10 秒采集 容量层 日增数据量 · 压缩占用 · TTL剩余 · 30天预测 1 小时 / 1 天 告警分级 P0 电话 · P1 企微 · P2 邮件日报 可视化下钻 总览 → 分层 → 单实例 → 单表

五、案例与误区复盘

案例:某行情平台开盘后查询变慢。监控面板显示业务层查询 P99 从 200ms 升到 1.8s。按四层下钻:数据库层发现 Merge 队列从 3 涨到 47,Part 数量在 10 分钟内翻倍;资源层发现磁盘 IO util 达到 95%。根因是行情写入突增导致小 Part 过多,Merge 跟不上。处理方式是临时调大 max_insert_block_size 并增加后台 Merge 线程,同时将写入批次从 1 秒改为 3 秒。复盘结论:业务层告警必须能一键下钻到数据库层和资源层,否则定位时间会从 5 分钟拉长到 30 分钟。

常见误区:

  • 只监控 ClickHouse 进程存活,不监控业务数据完整性,导致“服务正常但行情缺了 10 分钟”无人发现。
  • 所有指标都用 10 秒采集,监控表自身膨胀过快,反而拖慢 ClickHouse。
  • 告警阈值写死,开盘高峰频繁误报,团队逐渐关闭告警,真正故障时无人响应。
  • 可视化面板只做总览,没有单表和分区下钻,容量问题无法提前发现。
监控体系设计的最终检验标准只有一条:当行情数据出现延迟、缺口或查询变慢时,值班人员能否在 5 分钟内通过面板和告警定位到具体层级和具体表。四层分类、分层采集频率、动静结合的阈值、四级下钻可视化,都是为这一目标服务的。