1. 项目概述
MySQL作为最流行的开源关系型数据库之一,在企业级应用中承担着核心数据存储的角色。随着业务规模扩大,数据库性能监控成为运维工作的重中之重。传统的人工巡检方式已经无法满足实时性要求,我们需要一套自动化、可视化的监控方案。
Prometheus作为云原生时代的监控标杆,配合Grafana强大的可视化能力,可以构建完整的MySQL监控体系。这套方案不仅能实时捕捉数据库运行状态,还能通过历史数据分析性能趋势,提前发现潜在问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心组件解析
2.1 Prometheus监控体系
Prometheus采用拉取(Pull)模式采集指标,通过HTTP协议定期从配置的exporter获取数据。其核心优势包括:
- 多维数据模型(时间序列由metric名称和键值对标签组成)
- 灵活的查询语言PromQL
- 不依赖分布式存储,单个节点自治
- 通过HTTP协议拉取时间序列数据
- 支持推送时间序列通过中间网关
- 多种图形和仪表板支持
2.2 MySQL Exporter选择
官方推荐的mysql_exporter是最常用的采集器,它通过连接MySQL实例执行SHOW STATUS、SHOW VARIABLES等命令获取数百个关键指标。主要监控维度包括:
- 连接数(Threads_connected, Threads_running)
- 查询性能(Queries, Slow_queries)
- 缓冲池使用(Innodb_buffer_pool_reads)
- 网络流量(Bytes_received, Bytes_sent)
- 复制状态(Slave_IO_Running, Slave_SQL_Running)
2.3 Grafana可视化方案
Grafana作为可视化平台,提供以下核心功能:
- 支持PromQL查询
- 丰富的面板类型(Graph, Singlestat, Table等)
- 灵活的仪表板组织方式
- 告警规则配置
- 多数据源支持
3. 环境准备与部署
3.1 组件安装
bash复制# 下载Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz
tar xvfz prometheus-*.tar.gz
cd prometheus-*
# 下载mysql_exporter
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.0/mysqld_exporter-0.15.0.linux-amd64.tar.gz
tar xvfz mysqld_exporter-*.tar.gz
cd mysqld_exporter-*
# 下载Grafana
wget https://dl.grafana.com/oss/release/grafana-10.2.0.linux-amd64.tar.gz
tar xvfz grafana-*.tar.gz
cd grafana-*/bin
3.2 MySQL监控账号配置
需要在MySQL中创建专用监控账号:
sql复制CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'StrongPassword' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
FLUSH PRIVILEGES;
3.3 配置文件设置
创建mysql_exporter配置文件.my.cnf:
ini复制[client]
user=exporter
password=StrongPassword
配置Prometheus抓取目标(prometheus.yml):
yaml复制scrape_configs:
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104']
metrics_path: /metrics
4. 系统启动与验证
4.1 启动各组件
bash复制# 启动mysql_exporter
./mysqld_exporter --config.my-cnf=.my.cnf &
# 启动Prometheus
./prometheus --config.file=prometheus.yml &
# 启动Grafana
./grafana-server &
4.2 访问验证
- Prometheus: http://localhost:9090
- Grafana: http://localhost:3000 (默认账号admin/admin)
- mysql_exporter指标: http://localhost:9104/metrics
5. Grafana仪表板配置
5.1 添加数据源
- 登录Grafana后进入Configuration > Data Sources
- 选择Prometheus类型
- 填写URL: http://localhost:9090
- 点击Save & Test验证连接
5.2 导入MySQL仪表板
推荐使用官方仪表板模板:
- 进入https://grafana.com/grafana/dashboards/
- 搜索"MySQL"选择适合的仪表板(如ID 7362)
- 在Grafana界面点击"+" > Import
- 输入仪表板ID或上传JSON文件
5.3 关键监控指标配置
以下是一些核心监控面板的PromQL示例:
连接数监控
code复制mysql_global_status_threads_connected
mysql_global_variables_max_connections
查询性能
code复制rate(mysql_global_status_questions[1m])
mysql_global_status_slow_queries
缓冲池命中率
code复制1 - (mysql_global_status_innodb_buffer_pool_reads / mysql_global_status_innodb_buffer_pool_read_requests)
6. 告警规则配置
6.1 Prometheus告警规则
在prometheus.yml同目录下创建alert.rules文件:
yaml复制groups:
- name: mysql.rules
rules:
- alert: HighThreadsRunning
expr: mysql_global_status_threads_running > 50
for: 5m
labels:
severity: warning
annotations:
summary: "High threads running (instance {{ $labels.instance }})"
description: "MySQL threads running is high\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
6.2 Grafana告警配置
- 在仪表板编辑面板
- 选择Alert选项卡
- 设置告警条件(如当连接数>80%最大连接数时触发)
- 配置通知渠道(Email、Slack等)
7. 高级监控技巧
7.1 自定义指标采集
通过修改.my.cnf文件可以采集额外指标:
ini复制[client]
user=exporter
password=StrongPassword
[exporter]
log_slow_filter = "admin_*"
collect.info_schema.processlist = true
collect.perf_schema.eventswaits = true
7.2 多实例监控
对于多MySQL实例的场景,可以:
- 为每个实例部署独立的exporter
- 在Prometheus配置中添加多个targets
- 使用instance标签区分不同实例
yaml复制scrape_configs:
- job_name: 'mysql'
static_configs:
- targets: ['db1:9104', 'db2:9104', 'db3:9104']
metrics_path: /metrics
7.3 长期存储方案
对于历史数据分析,可以配置远程存储:
- 安装VictoriaMetrics或Thanos
- 修改Prometheus配置添加remote_write
yaml复制remote_write:
- url: http://victoriametrics:8428/api/v1/write
8. 常见问题排查
8.1 Exporter连接失败
错误现象:Prometheus无法获取MySQL指标
排查步骤:
- 检查exporter日志
- 验证MySQL账号权限
- 测试telnet到exporter端口
- 检查Prometheus抓取配置
8.2 指标缺失
可能原因:
- MySQL版本不支持某些指标
- exporter配置过滤了某些指标
- 权限不足无法查询某些表
解决方案:
- 升级exporter版本
- 检查.my.cnf配置
- 授予更多权限给监控账号
8.3 性能影响
监控本身也会消耗资源,建议:
- 限制exporter采集频率
- 减少不必要的指标采集
- 避免在高负载时段执行复杂查询
9. 最佳实践建议
-
指标采集策略:
- 生产环境采集间隔建议30s-1min
- 非核心指标可以适当延长采集间隔
- 使用collect[]参数控制采集范围
-
仪表板设计原则:
- 按功能模块组织(连接、查询、缓冲池等)
- 重要指标放在顶部
- 使用颜色区分正常/异常状态
- 添加说明性文本
-
容量规划:
- 单个MySQL实例监控数据约占用5-10MB/天
- 预留足够的Prometheus存储空间
- 设置合理的保留策略(通常15-30天)
-
安全建议:
- 监控账号使用最小权限原则
- 限制exporter的网络访问
- 加密敏感配置信息
- 定期轮换监控账号密码
