5 分钟实现 MySQL 监控:用 mysql_exporter 把数据库指标全喂给 Prometheus

张开发
2026/4/14 23:21:26 15 分钟阅读

分享文章

5 分钟实现 MySQL 监控:用 mysql_exporter 把数据库指标全喂给 Prometheus
手把手部署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% 以上配置过程其实很傻瓜下载 mysql_exporter 二进制文件创建数据库账号只给必要的权限配置 prometheus.yml 添加 scrape_config重启 Prometheus整个流程不到 10 分钟剩下的就是看着 Grafana 仪表盘上的曲线跳舞了。如果你还没给 MySQL 配监控我真的建议你试试这个方案。毕竟监控不是为了好看而是为了在出问题的时候能第一时间知道。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目录下也可以使用这个命令一键安装可自定义版本wgethttps://github.com/prometheus/mysqld_exporter/releases/download/v0.18.0/mysqld_exporter-0.18.0.linux-amd64.tar.gz解压mysql_exporter压缩文件tar-zxvfmysqld_exporter-0.18.0.linux-amd64.tar.gz修改mysql_exporter文件名mvmysqld_exporter-0.18.0.linux-amd64/ mysqld_exporter2.启动mysql_exporter创建mysql用户与权限在MySQL数据库中创建一个专门用于监控的用户并赋予其足够的权限来查询所需的信息GRANT REPLICATION CLIENT, PROCESS ON *.* TOmysqld_exporterlocalhostidentified by12345678;GRANT SELECT ON performance_schema.* TOmysqld_exporterlocalhost;flush privileges;创建一个文件输入我们刚创建好的用户名及密码[client]userexporterpassword12345678创建mysql_exporter服务[Unit]DescriptionexporterAfternetwork.target[Service]TypesimpleUserprometheusExecStart/app/mysqld_exporter/mysqld_exporter --config.my-cnf/app/mysqld_exporter/localhost_db.cnf--web.listen-address:9105Restarton-failure[Install]WantedBymulti-user.target也可以直接手动启动sudo-uprometheus /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的配置文件编辑添加如下内容viprometheus.yml- targets:[localhost:9105]labels: app:mysql_exporter重启prometheus服务:systemctl restart prometheus使用浏览器Ip9090打开promethues的页面我们可以看到成功的检测到了mysql_exporter服务啦4.使用alertmanager配置mysql_expoter告警没有alertmanager的小伙伴可以参考这篇文章告别宕机零基础搭建服务器监控告警系统小白也能学会配置mysql告警。我这里举两个例子groups: - name: mysql-alerts rules:# 1. MySQL 实例宕机或 exporter 无法采集- alert: MySQLDown expr: mysql_up0for: 1m labels: severity: critical annotations: summary:MySQL instance downdescription:MySQL instance {{$labels.instance }} has been down for more than 1 minute.# 2. 主从复制中断仅适用于有从库的场景- alert: MySQLReplicationBroken expr: mysql_slave_status_seconds_behind_master300for: 2m labels: severity: warning annotations: summary:MySQL replication lagdescription:MySQL replication on {{$labels.instance }} is lagging by {{$value}} seconds.# 3. 主从 IO/SQL 线程停止- alert: MySQLReplicationIOThreadDown expr: mysql_slave_status_master_server_id0and mysql_slave_status_slave_io_running0for: 1m labels: severity: critical annotations: summary:MySQL replication IO thread stoppeddescription:Slave IO thread is not running on {{$labels.instance }}.- alert: MySQLReplicationSQLThreadDown expr: mysql_slave_status_master_server_id0and mysql_slave_status_slave_sql_running0for: 1m labels: severity: critical annotations: summary:MySQL replication SQL thread stoppeddescription:Slave SQL thread is not running on {{$labels.instance }}.# 4. 连接数使用率过高超过 80%- alert: MySQLTooManyConnections expr:(mysql_global_status_threads_connected / mysql_global_variables_max_connections)*10080for: 2m labels: severity: warning annotations: summary:High MySQL connection usagedescription:{{$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 MySQLdescription:{{$labels.instance }}: Slow query rate is {{$value| printf\%.2f\}} per second.编辑为4.yml接下来配置prometheus告警进入prometheus配置文件:找到prometheus的配置文件编辑添加如下内容viprometheus.ymlrule_files: -/app/prometheus/1.yml-/app/prometheus/2.yml-/app/prometheus/3.yml-/app/prometheus/4.yml重启prometheus服务:systemctl restart prometheus使用浏览器Ip9090打开promethues的页面可以看到我们设置好的告警就出来啦这时我们mysql是没有启动的所以告警了。重启后恢复正常。那么问题来了倘若我想监控朋友的mysql但是我们不在一个局域网怎么办别急cpolar来帮助你5.安装cpolar内网穿透工具cpolar 可以将你本地电脑中的服务如 SSH、Web、数据库映射到公网。即使你在家里或外出时也可以通过公网地址连接回本地运行的开发环境。❤️以下是安装cpolar步骤使用一键脚本安装命令sudocurlhttps://get.cpolar.sh|sh安装完成后执行下方命令查看cpolar服务状态如图所示即为正常启动sudosystemctl status cpolarCpolar安装和成功启动服务后在浏览器上输入虚拟机主机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 用的账号只需要 PROCESS、REPLICATION CLIENT、SELECT 这几个权限别给太多了*版本兼容性*mysql_exporter 和 MySQL 版本要匹配太老的版本可能不支持新的指标*端口冲突*9104 端口如果被占用了会启动失败记得先检查一下总的来说mysql_exporter 是我用过最简单的监控工具之一。不用改代码不用配 Agent就一个二进制文件搞定一切。如果你也想让 MySQL 监控变得简单试试这个方案吧。毕竟数据不会说谎监控也不会。

更多文章