1. 为什么需要监控MySQL数据库?
作为最流行的开源关系型数据库之一,MySQL承载着大量企业的核心业务数据。我经历过多次线上事故,都是因为数据库性能问题未被及时发现导致的。有一次凌晨3点被叫醒处理数据库崩溃,就是因为没有完善的监控系统,等发现问题时已经造成了业务中断。
数据库监控的核心价值在于:
- 实时掌握数据库健康状态(连接数、查询性能、资源使用等)
- 快速定位性能瓶颈(慢查询、锁等待、索引缺失等)
- 预测容量问题(磁盘空间、内存使用增长趋势)
- 故障快速响应(设置合理的告警阈值)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Prometheus监控方案选型
2.1 为什么选择Prometheus?
在评估了多种监控方案后,我最终选择了Prometheus,主要基于以下考量:
-
多维数据模型:Prometheus的时序数据通过metric名称和键值对标签标识,非常适合监控MySQL这种有多维度指标需求的场景。比如我们可以区分不同数据库实例、不同业务表的监控指标。
-
强大的查询语言PromQL:这让我们可以灵活地分析监控数据。例如计算95分位的查询延迟:
histogram_quantile(0.95, rate(mysql_global_status_queries_duration_seconds_bucket[5m])) -
生态完善:有成熟的MySQL exporter可以直接使用,与Grafana的集成也非常顺畅。
-
易于扩展:当需要监控更多MySQL实例时,只需简单配置即可。
提示:虽然Prometheus是拉取模式,但通过合理的scrape_interval配置(通常30s-1m)对MySQL性能影响极小。
2.2 监控指标分类规划
根据多年DBA经验,我将MySQL监控指标分为几个关键类别:
| 类别 | 核心指标示例 | 监控意义 |
|---|---|---|
| 资源使用 | CPU、内存、磁盘、网络 | 主机层资源瓶颈 |
| 连接管理 | 线程数、连接数、活跃连接 | 连接池配置合理性 |
| 查询性能 | 慢查询数、查询延迟、QPS | SQL优化效果 |
| 存储引擎 | InnoDB缓冲池命中率、行操作量 | 引擎层性能 |
| 复制状态 | 主从延迟、复制线程状态 | 高可用保障 |
3. 部署MySQL Exporter
3.1 安装配置最佳实践
MySQL Exporter是Prometheus官方推荐的采集器。这是我验证过的安装步骤:
bash复制# 下载最新版本(以0.14.0为例)
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.14.0/mysqld_exporter-0.14.0.linux-amd64.tar.gz
tar xvfz mysqld_exporter-*.tar.gz
cd mysqld_exporter-*
# 创建监控专用账号
mysql -uroot -p -e "CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'StrongPassword' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
FLUSH PRIVILEGES;"
# 配置环境变量文件
echo 'export DATA_SOURCE_NAME="exporter:StrongPassword@(localhost:3306)/"' > .env
source .env
# 启动exporter
nohup ./mysqld_exporter > exporter.log 2>&1 &
关键安全建议:
- 一定要为exporter创建独立账号,不要使用root
- 限制该账号的最大连接数(避免监控影响业务)
- 只授予必要权限:PROCESS, REPLICATION CLIENT和SELECT
3.2 高级配置技巧
在~/.my.cnf中配置采集参数可以获取更丰富的指标:
ini复制[client]
user=exporter
password=StrongPassword
[exporter]
collect.auto_increment.columns=true
collect.binlog_size=true
collect.custom_query.queries="SELECT * FROM information_schema.INNODB_METRICS"
实测发现开启这些配置后,指标数量从基础的350+增加到500+,特别是InnoDB的详细监控对性能调优很有帮助。
4. Prometheus服务配置
4.1 基础配置模板
在prometheus.yml中添加MySQL监控job:
yaml复制scrape_configs:
- job_name: 'mysql'
static_configs:
- targets: ['mysql-server1:9104', 'mysql-server2:9104']
metrics_path: /metrics
scrape_interval: 30s
relabel_configs:
- source_labels: [__address__]
target_label: instance
4.2 关键参数调优
- scrape_interval:生产环境建议30-60s,太频繁会影响MySQL性能
- scrape_timeout:设置为interval的80%(如30s interval则设24s timeout)
- 样本保留时间:通常设置15-30天足够分析趋势
踩坑记录:曾经因为没设置timeout,导致Prometheus因网络抖动堆积了大量等待的scrape请求,最终内存溢出崩溃。
5. Grafana可视化实战
5.1 仪表盘导入与定制
推荐使用Percona提供的官方仪表盘(ID:7362)。导入后我通常会做这些定制:
- 添加业务关键指标的首屏展示
- 根据实例规格调整告警阈值
- 增加趋势对比功能(同比/环比)
sql复制-- 常用的一些PromQL查询示例:
-- 连接数使用率
sum(mysql_global_status_threads_connected) by (instance) / sum(mysql_global_variables_max_connections) by (instance)
-- InnoDB缓冲池命中率
1 - (mysql_innodb_buffer_pool_reads / mysql_innodb_buffer_pool_read_requests)
-- 慢查询率
rate(mysql_global_status_slow_queries[5m]) / rate(mysql_global_status_questions[5m])
5.2 告警规则配置
以下是一些经过验证的核心告警规则:
yaml复制groups:
- name: mysql-alerts
rules:
- alert: HighThreadsRunning
expr: mysql_global_status_threads_running > 0.8 * mysql_global_variables_max_connections
for: 5m
labels:
severity: critical
annotations:
summary: "High threads running on {{ $labels.instance }}"
description: "Threads running ({{ $value }}) > 80% of max_connections"
- alert: InnoDBBufferPoolLowHitRate
expr: (1 - (mysql_innodb_buffer_pool_reads / mysql_innodb_buffer_pool_read_requests)) < 0.95
for: 15m
labels:
severity: warning
6. 生产环境经验总结
6.1 性能优化要点
-
指标采集优化:
- 禁用不需要的collector(如不监控复制可以关闭collect.slave_status)
- 调整采集频率(从默认的15s改为30s可降低30%负载)
-
查询优化:
- 对高频查询使用Recording Rules预计算
- 避免在Grafana中使用范围过大的查询(如超过7天)
6.2 常见问题排查
问题1:Exporter连接被拒绝
- 检查:
SHOW PROCESSLIST确认exporter连接 - 解决:确保账号权限正确,防火墙开放9104端口
问题2:指标缺失
- 检查:访问http://exporter:9104/metrics查看原始数据
- 解决:确认.my.cnf中开启了对应collector
问题3:Prometheus刮取超时
- 检查:
up{job="mysql"}指标 - 解决:增加scrape_timeout或优化MySQL性能
7. 进阶监控方案
对于大型MySQL集群,建议采用这些增强方案:
- 分片监控:为不同业务库配置不同的采集job和标签
- 自定义指标:通过collect.custom_query添加业务特定指标
- 慢查询日志分析:结合pt-query-digest实现全量SQL监控
- 多维度下钻:在Grafana中配置按实例、按库、按表的筛选器
这是我经过3年生产环境验证的监控体系,每天处理超过50TB的MySQL监控数据。关键在于持续优化:每月review一次指标使用情况,去掉没人看的图表,增加新的业务关注点。
