2. Prometheus 基础回顾:架构、数据模型、PromQL 与告警规则

在构建数据库自愈脚本之前,必须牢固掌握 Prometheus 的核心概念。本章将系统梳理 Prometheus 的架构组件、数据模型、PromQL 查询语言基础以及告警规则的配置方法,为后续的告警接收与自动化处理奠定基础。

2.1 Prometheus 整体架构

Prometheus 采用拉取(Pull)模式采集指标,核心组件包括 Prometheus Server、Exporter、Alertmanager 以及可视化工具。下图展示了各组件之间的数据流与协作关系:

Prometheus 核心架构 被监控目标 MySQL Exporter Node Exporter 自定义 Exporter Prometheus Server 检索器 (Retrieval) TSDB 存储 HTTP API 告警规则评估 Alertmanager 告警分组 告警抑制 告警静默 通知发送 通知渠道 邮件 / 钉钉 / Slack 可视化 Grafana / PromDash 自愈脚本 Python 自动化恢复 说明 自愈脚本通过 Webhook 接收 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:条件不再满足,告警自动恢复。
告警状态流转 正常 expr 不满足 条件满足 Pending 等待 for 时间 持续满足 Firing 发送告警 条件恢复 → 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 的流转。