Prometheus监控MySQL
Prometheus监控MySQL并实现数据库性能告警,核心就是让Prometheus通过mysqld_exporter采集MySQL指标,再基于PromQL编写告警规则。
整套流程可以在一台Linux服务器上完成,最终你能在Grafana看到实时图表,并在连接数、慢查询等指标异常时收到告警通知。
先准备好监控环境
开始前,请确认以下条件已经满足:
- 一台运行MySQL的Linux服务器(MySQL 5.7或8.0,社区版即可)。
- 一个可登录MySQL并拥有PROCESS、REPLICATION CLIENT、SELECT权限的账号。
- 服务器上已安装Prometheus和Grafana(若未安装,可先单独部署)。
- 服务器能访问外网下载安装包,或已提前下载好mysqld_exporter。
特别提醒:不要使用root账号连接exporter,建议创建专用监控账号,降低安全风险。
部署mysqld_exporter采集数据
mysqld_exporter是Prometheus官方提供的MySQL指标导出器,负责连接MySQL并暴露metrics接口。
- 下载并解压(以v0.15.0为例,请以官方最新版本为准):
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
mv mysqld_exporter-0.15.0.linux-amd64 /usr/local/mysqld_exporter
- 在MySQL中创建监控账号:
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'YourStrongPassword' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
FLUSH PRIVILEGES;
- 创建配置文件
/etc/.mysqld_exporter.cnf,写入账号信息:
[client]
user=exporter
password=YourStrongPassword
然后设置文件权限为600:chmod 600 /etc/.mysqld_exporter.cnf。
- 创建systemd服务文件
/etc/systemd/system/mysqld_exporter.service:
[Unit]
Description=mysqld_exporter
After=network.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/mysqld_exporter/mysqld_exporter --config.my-cnf=/etc/.mysqld_exporter.cnf
Restart=on-failure
[Install]
WantedBy=multi-user.target
如果系统没有prometheus用户,可先执行useradd --no-create-home --shell /bin/false prometheus。
- 启动并设置开机自启:
systemctl daemon-reload
systemctl start mysqld_exporter
systemctl enable mysqld_exporter
- 验证采集是否正常:
curl http://localhost:9104/metrics | grep mysql_up
如果返回mysql_up 1,说明exporter已成功连接MySQL。
配置Prometheus抓取与告警规则
现在让Prometheus定期从exporter拉取指标,并定义数据库性能告警。
- 编辑
prometheus.yml,在scrape_configs下添加job:
scrape_configs:
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104']
- 创建告警规则文件
mysql_alerts.yml,示例如下:
groups:
- name: mysql_alerts
rules:
- alert: MySQLDown
expr: mysql_up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "MySQL实例 {{ $labels.instance }} 不可用"
- alert: MySQLTooManyConnections
expr: mysql_global_status_threads_connected / mysql_global_variables_max_connections > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "MySQL连接数超过80%"
- alert: MySQLSlowQueries
expr: rate(mysql_global_status_slow_queries[5m]) > 0.1
for: 5m
labels:
severity: warning
annotations:
summary: "MySQL慢查询速率过高"
- 在
prometheus.yml中引用规则文件:
rule_files:
- "mysql_alerts.yml"
- 重启Prometheus使配置生效:
systemctl restart prometheus
- 检查规则是否加载成功:访问Prometheus Web UI的
/rules页面,能看到上述告警规则即为正常。
避坑指南与常见报错
部署过程中容易遇到几个典型问题,提前注意可以少走弯路:
- 权限不足:监控账号必须拥有
PROCESS、REPLICATION CLIENT、SELECT权限,否则exporter日志会报Access denied。 - 配置文件权限:
.mysqld_exporter.cnf必须设置为600,且运行exporter的用户需有读取权限,否则启动失败。 - 端口冲突:默认端口9104若被占用,可在启动参数中添加
--web.listen-address=:9105更换端口。 - 指标缺失:部分MySQL版本默认关闭
performance_schema,导致某些指标无法采集,建议在my.cnf中开启。 - 告警不触发:检查Prometheus的
for时长和告警规则表达式,确保PromQL返回结果符合预期。
验证监控与告警效果
完成配置后,按以下步骤确认整套监控生效:
- 在Prometheus Web UI的
/targets页面,确认mysql job状态为UP。 - 在
/graph页面输入mysql_global_status_threads_connected,能查看到曲线图。 - 手动模拟故障:停止MySQL服务,等待1分钟后在Prometheus的
/alerts页面应看到MySQLDown告警变为Pending或Firing。 - 如需接收通知,可在Prometheus中配置Alertmanager,将告警发送到邮件或Webhook。
建议:生产环境务必配置Alertmanager,否则告警只停留在Prometheus界面,无法及时通知到人。
常见疑问
Q:mysqld_exporter需要和MySQL在同一台机器吗?
不一定。exporter可以远程连接MySQL,只需在配置文件中指定正确的主机地址和端口即可,但要确保网络连通和账号允许远程登录。
Q:告警规则中的阈值怎么定?
阈值没有统一标准,建议先观察业务正常运行时的指标基线,再设置略高于基线的值。例如连接数阈值可设为最大连接数的80%。
Q:除了连接数和慢查询,还有哪些关键告警指标?
可以关注mysql_global_status_innodb_row_lock_waits(锁等待)、mysql_global_status_aborted_connects(连接失败)等,根据业务特点选择。
按照以上步骤,你就能用Prometheus监控MySQL并实现数据库性能告警。
如果遇到exporter启动报错,优先检查MySQL账号权限和配置文件路径;
如果告警不触发,重点核对PromQL表达式和for时长。