数据库监控:Prometheus 导出器与 Grafana
数据库监控实战: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:9090 和 http://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 数据源
- 登录 Grafana,进入
Configuration > Data Sources。 - 点击
Add data source,选择Prometheus。 - 填写 Prometheus 地址(如
http://prometheus:9090),点击Save & Test。
导入官方仪表盘模板
Grafana 社区提供了大量预置仪表盘。推荐使用 7362(MySQL Overview):
- 点击
+>Import。 - 输入 Dashboard ID
7362,点击Load。 - 选择此前创建的 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 的组合,你可以分钟级搭建起生产级的数据库监控系统。这套方案免费、开源、可扩展,并且有强大的社区支持。关键步骤回顾:
- 安装并配置对应数据库的 exporter。
- 在 Prometheus 中添加抓取目标。
- 使用 PromQL 探索关键指标。
- 导入 Grafana 仪表盘展示数据。
- 按需设置告警规则。
现在就开始监控你的数据库吧!