MySQL别等出故障才查:先把连接数、慢查询和宕机告警接进Prometheus

前言
很多MySQL问题,在真正影响业务之前,其实已经有迹象了。连接数持续升高、慢查询突然变多、复制延迟拉大、实例短暂不可用,这些状态如果只靠人工登录数据库查看,很容易被忽略。
日志能帮我们复盘问题,但不适合做持续监控。对于日常运维来说,更理想的方式是把MySQL的运行指标接入统一监控系统,让Prometheus定期抓取,再根据规则判断是否需要告警。
mysql_exporter就是MySQL和Prometheus之间的桥梁。它会以Prometheus能够识别的格式暴露数据库指标,包括实例状态、连接情况、性能计数、InnoDB相关数据、慢查询和复制状态等,让数据库不再是监控体系里的盲区。
这篇教程会以CentOS 7环境为例,完成mysql_exporter下载、解压、监控用户创建、配置文件编写、systemd服务配置和本地访问验证。随后再把它加入Prometheus抓取配置,并通过告警规则测试MySQL宕机、连接数过高、慢查询和复制异常等场景。
如果监控目标和Prometheus不在同一个局域网,还会遇到远程抓取问题。本文最后会通过 cpolar 将本地9105端口映射到公网,并配置固定二级子域名,让异地Prometheus也能稳定抓取mysql_exporter指标。

1.Centos7安装mysql_exporter实时监控mysql数据
在CentOS 7环境中,仅靠MySQL自身难以实现对运行状态的全面可观测性。通过部署mysql_exporter,可将关键性能指标实时暴露给Prometheus,轻松构建高效的数据库监控体系。
本文将手把手指导你在CentOS 7环境中安装并配置mysql_exporter,快速打通MySQL与Prometheus的监控链路,实现数据库指标的实时采集与可视化。
若还没有安装mysql的小伙伴可以参考cpolar官网这篇教程:《手把手教你:Centos7下MySQL的安装与初始配置》
在prometheus的官网下载对应的mysql_exporter的linux版本:

下载完成后上传到/app目录下:

也可以使用这个命令一键安装(可自定义版本):
wget
https://github.com/prometheus/mysqld_exporter/releases/download/v0.18.0/mysqld_exporter-0.18.0.linux-amd64.tar.gz
解压mysql_exporter压缩文件:
tar -zxvf mysqld_exporter-0.18.0.linux-amd64.tar.gz

修改mysql_exporter文件名:
mv mysqld_exporter-0.18.0.linux-amd64/ mysqld_exporter

2.启动mysql_exporter
创建mysql用户与权限,在MySQL数据库中创建一个专门用于监控的用户,并赋予其足够的权限来查询所需的信息:
GRANT REPLICATION CLIENT, PROCESS ON *.* TO 'mysqld_exporter'@'localhost' identified by '12345678';
GRANT SELECT ON performance_schema.* TO 'mysqld_exporter'@'localhost';
flush privileges;

创建一个文件,输入我们刚创建好的用户名及密码:
[client]
user=exporter
password=12345678

创建mysql_exporter服务:
[Unit]
Description=exporter
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/app/mysqld_exporter/mysqld_exporter --config.my-cnf="/app/mysqld_exporter/localhost_db.cnf" --web.listen-address=":9105"
Restart=on-failure
[Install]
WantedBy=multi-user.target

也可以直接手动启动:
sudo -u prometheus /app/mysql_exporter/mysqld_exporter --config.my-cnf="/app/mysql_exporter/localhost_db.cnf" --web.listen-address=":9105"
接下来我们通过使用浏览器,用IP+端口就可以访问我们安装好的mysql_exporter页面啦!

3.配置prometheus监控mysql_exporter
没有prometheus的小伙伴可以参考cpolar官网这篇教程:《监控不再局域网!Cpolar 让 Prometheus 走出内网限制!》
找到prometheus的配置文件,编辑添加如下内容:
vi prometheus.yml
- targets: ["localhost:9105"]
labels:
app: "mysql_exporter"

重启prometheus服务:
systemctl restart prometheus
使用浏览器Ip+9090打开promethues的页面:

我们可以看到成功的检测到了mysql_exporter服务啦!

4.使用alertmanager配置mysql_expoter告警
没有alertmanager的小伙伴可以参考这篇文章:告别宕机!零基础搭建服务器监控告警系统!小白也能学会!
配置mysql告警。我这里举两个例子:
groups:
- name: mysql-alerts
rules:
# 1. MySQL 实例宕机或 exporter 无法采集
- alert: MySQLDown
expr: mysql_up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "MySQL instance down"
description: "MySQL instance {{ $labels.instance }} has been down for more than 1 minute."
# 2. 主从复制中断(仅适用于有从库的场景)
- alert: MySQLReplicationBroken
expr: mysql_slave_status_seconds_behind_master > 300
for: 2m
labels:
severity: warning
annotations:
summary: "MySQL replication lag"
description: "MySQL replication on {{ $labels.instance }} is lagging by {{ $value }} seconds."
# 3. 主从 IO/SQL 线程停止
- alert: MySQLReplicationIOThreadDown
expr: mysql_slave_status_master_server_id > 0 and mysql_slave_status_slave_io_running == 0
for: 1m
labels:
severity: critical
annotations:
summary: "MySQL replication IO thread stopped"
description: "Slave IO thread is not running on {{ $labels.instance }}."
- alert: MySQLReplicationSQLThreadDown
expr: mysql_slave_status_master_server_id > 0 and mysql_slave_status_slave_sql_running == 0
for: 1m
labels:
severity: critical
annotations:
summary: "MySQL replication SQL thread stopped"
description: "Slave SQL thread is not running on {{ $labels.instance }}."
# 4. 连接数使用率过高(超过 80%)
- alert: MySQLTooManyConnections
expr: (mysql_global_status_threads_connected / mysql_global_variables_max_connections) * 100 > 80
for: 2m
labels:
severity: warning
annotations:
summary: "High MySQL connection usage"
description: "{{ $labels.instance }}: MySQL connection usage is {{ $value | printf \"%.2f\" }}% of max_connections."
# 5. 慢查询数量突增(过去5分钟慢查询 > 10 条)
- alert: MySQLHighSlowQueries
expr: rate(mysql_global_status_slow_queries[5m]) > 0.1 # ≈ 每分钟 > 6 条
for: 5m
labels:
severity: warning
annotations:
summary: "High rate of slow queries on MySQL"
description: "{{ $labels.instance }}: Slow query rate is {{ $value | printf \"%.2f\" }} per second."

编辑为4.yml,接下来配置prometheus告警:
进入prometheus配置文件:
找到prometheus的配置文件,编辑添加如下内容:
vi prometheus.yml
rule_files:
- "/app/prometheus/1.yml"
- "/app/prometheus/2.yml"
- "/app/prometheus/3.yml"
- "/app/prometheus/4.yml"

重启prometheus服务:
systemctl restart prometheus
使用浏览器Ip+9090打开promethues的页面:

可以看到,我们设置好的告警就出来啦!

这时我们mysql是没有启动的,所以告警了。

重启后恢复正常。

那么问题来了,倘若我想监控朋友的mysql,但是我们不在一个局域网,怎么办?别急cpolar来帮助你!
5.安装cpolar内网穿透工具
cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。
❤️以下是安装cpolar步骤:
使用一键脚本安装命令:
sudo curl https://get.cpolar.sh | sh

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)
sudo systemctl status cpolar

Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:
打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

6.配置公网地址
登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道:
-
隧道名称:可自定义,本例使用了:mysql_exporter,注意不要与已有的隧道名称重复
-
协议:http
-
本地地址:9105
-
域名类型:随机域名
-
地区:选择China Top

创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用地址访问。

访问成功。

7.将本mysql_exporter暴露给Prometheus进行远程抓取
Prometheus可以通过这个公网地址38c53143.r2.cpolar.top访问到运行在本地9105端口的mysql_exporter服务,从而抓取系统指标。
- targets: ["38c53143.r2.cpolar.top"]
labels:
app: "mysql_exporter"

抓取成功!

8.保留固定公网地址
使用cpolar为其配置二级子域名,该地址为固定地址,不会随机变化。

点击左侧的预留,选择保留二级子域名,地区选择china Top,然后设置一个二级子域名名称,我这里演示使用的是mysqll,大家可以自定义。填写备注信息,点击保留。

登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道mysql_exporter,点击右侧的编辑。

修改隧道信息,将保留成功的二级子域名配置到隧道中
- 域名类型:选择二级子域名
- Sub Domain:填写保留成功的二级子域名
- 地区: China Top
点击更新

更新完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称。

最后,我们使用固定的公网地址在任意设备的浏览器中访问,可以看到成功访问本地部署的页面,这样一个永久不会变化的二级子域名公网网址即设置好了。

至此,我们完成了无需公网 IP 的远程服务器监控搭建。
结尾
完成配置后,mysql_exporter就可以持续把MySQL运行指标暴露出来,Prometheus则负责定期抓取这些数据。这样一来,数据库状态不再只能靠临时登录查看,而是可以进入统一的监控视图。
接入告警规则后,监控链路会更完整。MySQL实例不可用、连接数过高、慢查询增长、复制延迟或复制线程异常,都可以通过Prometheus规则提前发现,再交给Alertmanager做后续通知。
通过 cpolar 暴露mysql_exporter端口后,即使Prometheus和MySQL不在同一个局域网,也能完成远程抓取。随机域名适合临时测试,固定二级子域名更适合长期监控,避免抓取地址频繁变化。
需要注意的是,mysql_exporter暴露的是数据库运行指标,不建议毫无控制地公开访问。监控用户应遵循最小权限原则,配置文件中的数据库账号密码也要妥善保护,避免出现在公开仓库或截图中。
mysql_exporter负责采集MySQL指标,Prometheus负责存储、查询和告警,cpolar负责补上跨网络抓取通道。当这几部分组合起来以后,MySQL监控就从“出事后再查”变成了“提前看见趋势,及时发现异常”。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)