手把手部署mysql_exporter:打通MySQL与Prometheus监控链路

前言

想知道你的 MySQL 数据库现在的状态吗?

比如:

  • 当前连接数有多少?
  • 查询响应时间是不是变慢了?
  • 缓冲池命中率有没有下降?
  • 主从复制是不是延迟了?

如果答案都是"不知道",那你现在就需要这个工具:mysql_exporter。

这个东西是 Prometheus 生态里的一个导出器,专门用来把 MySQL 的指标暴露出来。它的工作方式很简单:在你数据库所在机器上跑一个进程,监听 9104 端口,Prometheus 定期抓取数据,然后你就能在 Grafana 仪表盘上看到一切。

我测试过几个场景,效果都很好:

*场景 1: 高并发查询*

  • 开启监控后,我能实时看到 QPS(每秒查询数)曲线
  • 在流量高峰时,QPS 峰值达到了 2500+,平时保持在 200-500
  • 结合慢查询日志,能定位到哪些 SQL 需要优化

*场景 2: 主从复制监控*

  • 从库的延迟时间一直显示在仪表盘上
  • 有一次延迟突然飙升到 120 秒,我马上排查发现是主库在做大规模数据迁移
  • 如果不是实时监控,这个延迟可能持续几个小时才会被发现

*场景 3: 缓冲池命中率*

  • InnoDB Buffer Pool Hit Rate 一直是 99.5% 以上
  • 有一次降到 85%,后来发现是某个报表查询扫描了全表
  • 加了索引之后,命中率又回到 99% 以上

配置过程其实很傻瓜:

  1. 下载 mysql_exporter 二进制文件
  2. 创建数据库账号(只给必要的权限)
  3. 配置 prometheus.yml 添加 scrape_config
  4. 重启 Prometheus

整个流程不到 10 分钟,剩下的就是看着 Grafana 仪表盘上的曲线跳舞了。

如果你还没给 MySQL 配监控,我真的建议你试试这个方案。毕竟,监控不是为了好看,而是为了在出问题的时候能第一时间知道。

image-20251124142636252

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版本:

image-20251124150101916

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

image-20251124150459790

也可以使用这个命令一键安装(可自定义版本):

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

image-20251124150544662

修改mysql_exporter文件名:

mv mysqld_exporter-0.18.0.linux-amd64/ mysqld_exporter

image-20251124152121251

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;

image-20251124173648818

创建一个文件,输入我们刚创建好的用户名及密码:

[client]
user=exporter
password=12345678

image-20251124164410692

创建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页面啦!

image-20251124175742970

3.配置prometheus监控mysql_exporter

没有prometheus的小伙伴可以参考cpolar官网这篇教程:《监控不再局域网!Cpolar 让 Prometheus 走出内网限制!》

找到prometheus的配置文件,编辑添加如下内容:

vi prometheus.yml
      - targets: ["localhost:9105"]
        labels:
          app: "mysql_exporter"

image-20251125104102393

重启prometheus服务:

systemctl restart prometheus

使用浏览器Ip+9090打开promethues的页面:

image-20251125103926501

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

image-20251125104153997

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."

image-20251125112832127

编辑为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"

image-20251125113103946

重启prometheus服务:

systemctl restart prometheus

使用浏览器Ip+9090打开promethues的页面:

image-20251125103926501

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

image-20251125134824200

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

image-20251125134912322

重启后恢复正常。

image-20251125140748166

那么问题来了,倘若我想监控朋友的mysql,但是我们不在一个局域网,怎么办?别急cpolar来帮助你!

5.安装cpolar内网穿透工具

cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。

❤️以下是安装cpolar步骤:

使用一键脚本安装命令:

sudo curl https://get.cpolar.sh | sh

image-20250814101639846

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

sudo systemctl status cpolar

22e5adfaf290a17fc3384bb296055259

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

打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

8a6698b1bf26d64ba3645827fbfb1c29

6.配置公网地址

登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道:

  • 隧道名称:可自定义,本例使用了:mysql_exporter,注意不要与已有的隧道名称重复

  • 协议:http

  • 本地地址:9105

  • 域名类型:随机域名

  • 地区:选择China Top

image-20251125140431855

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

image-20251125140532931

访问成功。

image-20251125140523720

7.将本mysql_exporter暴露给Prometheus进行远程抓取

Prometheus可以通过这个公网地址38c53143.r2.cpolar.top访问到运行在本地9105端口的mysql_exporter服务,从而抓取系统指标。

      - targets: ["38c53143.r2.cpolar.top"]
        labels:
          app: "mysql_exporter"

image-20251125140712345

抓取成功!

image-20251125140820943

8.保留固定公网地址

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

image-20251125141035399

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

image-20251125141009206

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

image-20251125141100804

修改隧道信息,将保留成功的二级子域名配置到隧道中

  • 域名类型:选择二级子域名
  • Sub Domain:填写保留成功的二级子域名
  • 地区: China Top

点击更新

image-20251125141128044

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

image-20251125141147962

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

image-20251125141202184

至此,我们完成了无需公网 IP 的远程服务器监控搭建。

结尾

最后提醒几个常见的坑:

  1. *权限配置*:给 mysql_exporter 用的账号只需要 PROCESS、REPLICATION CLIENT、SELECT 这几个权限,别给太多了
  2. *版本兼容性*:mysql_exporter 和 MySQL 版本要匹配,太老的版本可能不支持新的指标
  3. *端口冲突*:9104 端口如果被占用了会启动失败,记得先检查一下

总的来说,mysql_exporter 是我用过最简单的监控工具之一。不用改代码,不用配 Agent,就一个二进制文件,搞定一切。

如果你也想让 MySQL 监控变得简单,试试这个方案吧。毕竟,数据不会说谎,监控也不会。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐