1. 项目概述
MySQL作为最流行的开源关系型数据库之一,在企业级应用中扮演着重要角色。随着业务规模扩大,数据库性能监控成为运维工作的关键环节。传统的人工检查方式效率低下,而基于Prometheus的监控方案能够实现:
- 实时采集40+核心指标(连接数、查询吞吐、缓存命中率等)
- 历史数据存储与分析(最长可保留2年原始数据)
- 智能告警机制(基于PromQL设置动态阈值)
典型应用场景包括:
- 电商大促期间的数据库容量规划
- 慢查询分析与索引优化
- 主从复制延迟监控
- 资源使用率趋势预测
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与组件部署
2.1 组件架构解析
完整监控体系包含三个核心组件:
| 组件 | 作用 | 默认端口 |
|---|---|---|
| mysqld_exporter | 采集MySQL指标 | 9104 |
| Prometheus Server | 存储时间序列数据 | 9090 |
| Grafana | 数据可视化 | 3000 |
2.2 mysqld_exporter部署
创建监控专用账户:
sql复制CREATE USER 'exporter'@'192.168.1.%' IDENTIFIED BY 'Exporter@2023' WITH MAX_USER_CONNECTIONS 5;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'192.168.1.%';
Docker部署方案:
yaml复制version: '3'
services:
mysqld-exporter:
image: prom/mysqld-exporter:v0.14.0
ports:
- "9104:9104"
environment:
DATA_SOURCE_NAME: "exporter:Exporter@2023@(mysql-host:3306)/"
restart: unless-stopped
注意:生产环境建议配置TLS加密连接,避免密码明文传输
2.3 Prometheus配置
修改prometheus.yml添加抓取任务:
yaml复制scrape_configs:
- job_name: 'mysql'
static_configs:
- targets: ['mysqld-exporter:9104']
metrics_path: /metrics
scrape_interval: 15s
关键参数说明:
scrape_interval:采集频率,OLTP建议15s,OLAP可设为60sevaluation_interval:告警规则评估间隔
3. 核心监控指标解析
3.1 性能类关键指标
| 指标名称 | 健康阈值 | 告警建议 |
|---|---|---|
| mysql_global_status_Threads_connected | < 最大连接数80% | 检查连接泄漏或连接池配置 |
| mysql_global_status_Innodb_row_lock_time_avg | < 500ms | 检查事务隔离级别 |
| mysql_global_status_Slow_queries | 每分钟<5次 | 分析慢查询日志 |
3.2 资源使用类指标
promql复制# 内存使用率计算
100 * (1 - (mysql_global_status_Innodb_buffer_pool_bytes_data / mysql_global_variables_innodb_buffer_pool_size))
3.3 复制监控指标
主从复制健康检查表达式:
promql复制mysql_global_status_Slave_io_running != 1 or mysql_global_status_Slave_sql_running != 1
4. Grafana看板配置
4.1 导入官方模板
- 访问Grafana控制台
- 导航到Dashboard → Import
- 输入模板ID:7362(MySQL Overview)
- 选择Prometheus数据源
4.2 自定义看板技巧
热点表监控面板:
sql复制SELECT
table_schema as db,
table_name as table,
data_length as size
FROM
information_schema.tables
ORDER BY
data_length DESC
LIMIT 10
动态变量配置:
- 添加
$instance变量:label_values(mysql_up, instance) - 添加
$database变量:label_values(mysql_database_size_bytes{instance=~"$instance"}, database)
5. 生产环境优化实践
5.1 指标采集优化
禁用非必要采集器(在mysqld_exporter启动参数中添加):
code复制--no-collect.info_schema.clientstats
--no-collect.perf_schema.eventswaits
5.2 存储优化策略
Prometheus TSDB配置建议:
yaml复制storage:
tsdb:
retention: 30d # 原始数据保留
chunk_encoding: "ddf" # 高压缩率编码
5.3 告警规则示例
yaml复制groups:
- name: mysql-alerts
rules:
- alert: HighCPUUsage
expr: rate(process_cpu_seconds_total{job="mysql"}[1m]) > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU usage on MySQL instance {{ $labels.instance }}"
6. 故障排查指南
6.1 常见问题诊断
Exporter无法连接MySQL:
- 检查网络连通性:
telnet <mysql_host> 3306 - 验证账户权限:
SHOW GRANTS FOR 'exporter'@'192.168.1.%' - 查看日志:
docker logs mysqld-exporter
指标缺失问题:
- 确认采集器已启用:访问
http://exporter:9104/metrics - 检查Prometheus target状态:
http://prometheus:9090/targets
6.2 性能调优案例
场景:QPS突降50%
- 检查锁等待:
mysql_global_status_Innodb_row_lock_waits - 分析线程状态:
mysql_global_status_Threads_running - 定位慢查询:
mysql_global_status_Slow_queries
7. 扩展监控方案
7.1 多实例监控
使用Consul服务发现:
yaml复制scrape_configs:
- job_name: 'mysql'
consul_sd_configs:
- server: 'consul:8500'
services: ['mysql-exporter']
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*production.*
action: keep
7.2 自定义指标采集
通过--collect.custom_query参数:
ini复制[client]
user=exporter
password=Exporter@2023
[collect.custom_query]
query_slave_status=SHOW SLAVE STATUS
metric_name=mysql_slave_status_{column}
type=GAUGE
实际部署中发现,对于大型MySQL集群(50+节点),建议:
- 每台物理机部署一个exporter实例
- 配置Prometheus分片采集
- 使用VictoriaMetrics替代Prometheus存储长期数据
