数据库监控:Prometheus 导出器与 Grafana

FreeGuideOnline 最新 2026-06-30

数据库监控实战:Prometheus + Exporter + Grafana

为什么需要数据库监控

数据库是大多数应用的核心,其健康状况直接影响业务。通过监控数据库的运行指标(如连接数、查询速率、慢查询、缓存命中率等),可以在问题发生前预警,并在故障时快速定位根因。

Prometheus 是云原生时代的监控标准,配合专用 Exporter(导出器)与 Grafana 可视化,可以构建一套轻量且强大的数据库监控体系。本文将带你从零搭建 MySQL 的监控,并推广至其他数据库。


整体架构

MySQL 实例
    │
    ▼
mysql_exporter (采集MySQL性能指标并以 /metrics 接口暴露)
    │
    ▼
Prometheus Server (定期拉取 exporter 的指标并存储)
    │
    ▼
Grafana (对接 Prometheus 数据源,展示仪表盘、设置告警)

同样的模式适用于 PostgreSQL、Redis、MongoDB 等,只需更换相应 exporter。


环境准备

安装 Prometheus 与 Grafana

若已有运行中的 Prometheus 和 Grafana 可跳过。快速部署方式:

# 使用 Docker Compose
services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"
  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"

启动后访问 http://SERVER_IP:9090http://SERVER_IP:3000 验证。

安装 MySQL Exporter

下载 mysqld_exporter 二进制文件:

wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.0/mysqld_exporter-0.15.0.linux-amd64.tar.gz
tar xzf mysqld_exporter-0.15.0.linux-amd64.tar.gz

配置 MySQL Exporter

创建监控专用用户

登录 MySQL,创建低权限监控用户:

CREATE USER 'exporter'@'%' IDENTIFIED BY 'exporter_password';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
FLUSH PRIVILEGES;

配置数据源连接

Exporter 通过环境变量或配置文件获取 MySQL 连接信息。创建 .my.cnf 文件:

[client]
user=exporter
password=exporter_password
host=127.0.0.1
port=3306

启动 Exporter:

export DATA_SOURCE_NAME="exporter:exporter_password@(127.0.0.1:3306)/"
./mysqld_exporter --config.my-cnf=.my.cnf

默认监听在 9104 端口,访问 http://Exporter_IP:9104/metrics 可以看到大量 mysql_* 开头的指标。


配置 Prometheus 采集

编辑 prometheus.yml,在 scrape_configs 下增加 Job:

scrape_configs:
  - job_name: 'mysql'
    static_configs:
      - targets: ['mysql-exporter:9104']
    metrics_path: /metrics
    scrape_interval: 15s

重启 Prometheus 后,在 Targets 页面 (http://localhost:9090/targets) 确认 mysql Job 状态为 UP。


PromQL 常用查询

以下是一些最实用的 PromQL 示例(假设指标前缀为 mysql_global_status_,受版本影响可能略有差异):

当前连接数

mysql_global_status_threads_connected

数据库运行时间

mysql_global_status_uptime

每秒查询数(QPS)

rate(mysql_global_status_queries[1m])

慢查询数量

mysql_global_status_slow_queries

InnoDB 缓存命中率

(rate(mysql_global_status_innodb_buffer_pool_read_requests[5m]) - rate(mysql_global_status_innodb_buffer_pool_reads[5m]))
/ rate(mysql_global_status_innodb_buffer_pool_read_requests[5m]) * 100

在 Prometheus 的 Graph 页面输入这些表达式即可进行临时调试。


Grafana 可视化

添加 Prometheus 数据源

  1. 登录 Grafana,进入 Configuration > Data Sources
  2. 点击 Add data source,选择 Prometheus
  3. 填写 Prometheus 地址(如 http://prometheus:9090),点击 Save & Test

导入官方仪表盘模板

Grafana 社区提供了大量预置仪表盘。推荐使用 7362(MySQL Overview):

  1. 点击 + > Import
  2. 输入 Dashboard ID 7362,点击 Load
  3. 选择此前创建的 Prometheus 数据源,导入。

几秒内你就能看到一个包含 QPS、连接数、缓存命中率、InnoDB 读写等面板的完整监控大屏。

自定义面板示例

新建一个面板,用于展示“当前连接数趋势”:

  • 查询表达式:mysql_global_status_threads_connected
  • 可视化类型:Graph (Time series)
  • 标题:当前连接数

告警配置(可选)

Prometheus 告警规则

创建 mysql_alerts.yml 规则文件:

groups:
- name: mysql
  rules:
  - alert: HighThreadsConnected
    expr: mysql_global_status_threads_connected > 100
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "MySQL 连接数过高 ({{ $value }})"

prometheus.yml 中引入该文件,并配置 Alertmanager 实现通知。

Grafana 告警

也可以在 Grafana 面板中设置阈值告警,通过 Webhook、邮件等渠道发送。


其他数据库监控延伸

  • PostgreSQL:使用 postgres_exporter,指标前缀 pg_*
  • Redis:使用 redis_exporter,指标前缀 redis_*
  • MongoDB:使用 mongodb_exporter
  • 每个 exporter 的部署方式类似,仅需调整连接字符串与配置参数。

总结

通过 Prometheus + Exporter + Grafana 的组合,你可以分钟级搭建起生产级的数据库监控系统。这套方案免费、开源、可扩展,并且有强大的社区支持。关键步骤回顾:

  1. 安装并配置对应数据库的 exporter。
  2. 在 Prometheus 中添加抓取目标。
  3. 使用 PromQL 探索关键指标。
  4. 导入 Grafana 仪表盘展示数据。
  5. 按需设置告警规则。

现在就开始监控你的数据库吧!