2. Prometheus 基础回顾:架构、数据模型、PromQL 与告警规则
在构建数据库自愈脚本之前,必须牢固掌握 Prometheus 的核心概念。本章将系统梳理 Prometheus 的架构组件、数据模型、PromQL 查询语言基础以及告警规则的配置方法,为后续的告警接收与自动化处理奠定基础。
2.1 Prometheus 整体架构
Prometheus 采用拉取(Pull)模式采集指标,核心组件包括 Prometheus Server、Exporter、Alertmanager 以及可视化工具。下图展示了各组件之间的数据流与协作关系:
架构要点:Prometheus Server 定期从 Exporter 拉取指标,存储于本地 TSDB;告警规则在 Server 端评估,触发后推送至 Alertmanager;Alertmanager 负责去重、分组、抑制,最终通过 Webhook 或邮件通知自愈脚本或运维人员。
2.2 数据模型
Prometheus 的所有数据都存储为时间序列,每个序列由指标名称(Metric Name)和一组标签(Labels)唯一标识。
| 概念 | 说明 | 示例 |
|---|---|---|
| Metric Name | 指标名称,描述被监控对象的含义 | mysql_global_status_threads_connected |
| Labels | 键值对标签,用于维度区分 | instance="db01:9104", env="prod" |
| Sample | 时间戳 + 浮点数值 | @1620000000 128 |
| Metric Type | Counter / Gauge / Histogram / Summary | Counter 只增不减,Gauge 可增可减 |
自愈脚本关注点:数据库自愈场景中,最常使用 Gauge 类型指标(如连接数、复制延迟、QPS)和 Counter 类型指标(如错误日志计数、慢查询累计数)。
2.3 PromQL 基础
PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询语言,用于实时聚合和分析时间序列数据。以下是自愈脚本开发中最高频使用的 PromQL 模式:
2.3.1 常用查询模式
| 查询模式 | PromQL 示例 | 用途 |
|---|---|---|
| 即时向量 | mysql_global_status_threads_connected |
获取当前连接数 |
| 范围向量 | mysql_global_status_threads_connected[5m] |
获取过去 5 分钟连接数序列 |
| 聚合运算 | avg by(instance) (mysql_global_status_threads_connected) |
按实例计算平均连接数 |
| 速率计算 | rate(mysql_global_status_queries_total[1m]) |
计算每秒查询速率 |
| 阈值判断 | mysql_global_status_threads_connected > 200 |
筛选连接数超过 200 的实例 |
2.3.2 自愈场景常用 PromQL 表达式
# 数据库连接数过高(Gauge)
mysql_global_status_threads_connected > 300
# 主从复制延迟(Gauge,单位秒)
mysql_slave_status_seconds_behind_master > 30
# 慢查询速率(Counter,计算 5 分钟速率)
rate(mysql_global_status_slow_queries_total[5m]) > 10
# 数据库实例存活(Up 指标)
up{job="mysql"} == 0
# 磁盘使用率(Gauge,百分比)
(1 - node_filesystem_avail_bytes{mountpoint="/data"} / node_filesystem_size_bytes{mountpoint="/data"}) * 100 > 90
注意:在告警规则中使用 PromQL 时,务必考虑 for 语句(持续时间)来避免因瞬时抖动导致的误告警。例如:连接数超过 300 持续 2 分钟才触发告警。
2.4 告警规则配置
告警规则定义在 Prometheus 配置文件(通常为 rules.yml)中,由 Prometheus Server 定期评估。规则文件采用 YAML 格式,包含 groups 和 rules 两个层级。
2.4.1 规则文件结构
groups:
- name: mysql_alerts
interval: 15s
rules:
- alert: MySQLHighConnections
expr: mysql_global_status_threads_connected > 300
for: 2m
labels:
severity: critical
annotations:
summary: "MySQL 连接数过高 ({{ $value }})"
description: "实例 {{ $labels.instance }} 当前连接数 {{ $value }},超过阈值 300"
- alert: MySQLReplicationLag
expr: mysql_slave_status_seconds_behind_master > 30
for: 1m
labels:
severity: warning
annotations:
summary: "MySQL 主从复制延迟 ({{ $value }}s)"
description: "实例 {{ $labels.instance }} 复制延迟 {{ $value }} 秒"
2.4.2 告警规则字段说明
| 字段 | 必填 | 说明 |
|---|---|---|
alert |
是 | 告警名称,必须唯一 |
expr |
是 | PromQL 表达式,返回非零结果时触发 |
for |
否 | 持续时间,防止抖动误报 |
labels |
否 | 附加标签,如 severity(严重级别) |
annotations |
否 | 告警描述信息,支持模板变量 {{ $value }}、{{ $labels }} |
2.4.3 告警状态流转
Prometheus 告警的生命周期包含三种状态:
- Pending:表达式条件满足,但尚未达到
for指定的持续时间。 - Firing:条件持续满足超过
for时间,告警被正式触发并发送至 Alertmanager。 - Resolved:条件不再满足,告警自动恢复。
自愈脚本触发点:自愈脚本通常监听 Alertmanager 的 Webhook,接收 Firing 状态的告警。当收到 Resolved 通知时,脚本可以执行恢复确认或清理操作。
2.5 本章小结
本章回顾了 Prometheus 的四大核心基础:
- 架构:Pull 模式、Exporter、Server、Alertmanager 的分工与数据流。
- 数据模型:时间序列由 Metric Name + Labels 唯一标识,支持 Counter/Gauge 等类型。
- PromQL:即时向量、范围向量、聚合、速率计算是自愈脚本中最常用的查询模式。
- 告警规则:通过 YAML 定义 expr、for、labels、annotations,告警状态经历 Pending → Firing → Resolved 的流转。