从手动安装到批量交付:mysqld_exporter脚本化部署实践
前言
mysqld_exporter是Prometheus监控MySQL时常用的指标采集组件。它负责连接数据库,读取连接数、线程状态、查询吞吐、缓存命中、主从复制和性能模式等运行数据,再通过HTTP接口转换为Prometheus能够抓取的指标。单独安装一个mysqld_exporter并不算复杂,但当监控对象从一台数据库增加到十几台甚至更多服务器后,重复部署很快就会成为实际运维中的负担。
传统安装过程通常包含下载对应版本的二进制包、创建运行目录、建立专用系统用户、配置MySQL监控账号、写入数据库连接凭证、设置文件权限、编写systemd服务以及配置开机自启。每一步都可以手动完成,但不同人员、不同服务器和不同时间执行后,很容易出现安装路径不一致、端口冲突、权限遗漏或服务参数不同等问题。单台服务器上的小差异看起来影响不大,进入批量监控后却会增加排查和维护成本。
Shell脚本更适合把这类固定流程整理成可重复执行的部署方案。版本号、安装目录、监听端口、服务名称和运行用户可以集中定义,依赖安装、文件下载、账号创建、权限配置和服务启动则按照既定顺序自动完成。新增加MySQL节点时,不再需要重新对照文档逐项操作,只要调整必要参数后执行脚本,就能获得结构一致的mysqld_exporter环境。脚本还可以纳入Git管理,便于记录配置变更,并与Ansible、SSH批量执行或现有发布流程继续组合。
这种自动化方式比较适合数据库节点较多、测试环境经常重建,以及需要统一交付监控组件的场景。开发环境中可以快速恢复一套可用的Exporter,生产环境中则可以统一监听端口、运行账号和systemd服务配置。脚本的价值并不只是减少几条命令,而是把部署经验固化下来,避免同一套组件在不同机器上出现不同配置。
自动化脚本同时需要注意凭证管理。原始脚本为了演示方便,将MySQL管理员密码和监控账号密码直接写入变量,这种方式适合封闭测试环境,不适合直接用于正式服务器。实际使用时可以改为执行脚本时交互输入、从环境变量读取,或者借助专门的密钥管理工具保存。mysqld_exporter只需要读取监控指标,应创建独立数据库账号并授予必要的最小权限,避免长期使用root账号连接数据库。
mysqld_exporter启动后,还需要由Prometheus定期访问其指标接口。两者处于同一局域网时,直接配置服务器IP和9105端口即可;当Prometheus运行在公网服务器、云环境或另一处网络中,内网地址就无法直接作为抓取目标。通过cpolar映射mysqld_exporter的HTTP指标端口,可以让远端Prometheus访问内网指标服务,而不必直接开放MySQL的3306端口。这样既保留了数据库本身的内网边界,也为分布式监控和异地节点采集提供了更灵活的连接方式。
1.为什么选择shell脚本一键安装?
选择Shell脚本一键安装mysqld_exporter,主要是为了提升部署效率、保证配置一致性并降低人为操作错误风险。
在生产环境中,往往需要在多台服务器上快速部署监控组件,手动执行下载、解压、创建用户、配置MySQL权限、编写systemd服务等步骤不仅繁琐,还容易因环境差异导致配置遗漏或权限问题。
通过Shell脚本自动化整个流程,可以实现“一次编写,处处运行”,确保所有节点的安装路径、用户权限、监听端口和认证信息完全统一,同时支持以非root用户(如prometheus)安全运行,并自动配置开机自启,极大简化了Prometheus监控体系的落地与维护成本。
部署高效快捷
一条命令即可完成下载、配置、授权、启动全过程,大幅缩短部署时间。
配置标准化
所有服务器使用相同的路径、用户、端口和权限策略,避免“环境漂移”问题。
减少人为错误
自动创建MySQL监控用户并授予权限,避免手动操作导致的拼写错误或权限遗漏。
安全合规
自动以专用非登录用户(如prometheus)运行服务,并设置配置文件权限为600,防止密码泄露。
自动开机自启
集成systemd服务管理,确保系统重启后监控组件自动恢复运行。
便于批量运维
可结合Ansible、SaltStack或直接通过SSH批量执行,适用于大规模集群统一部署。
可版本化与复用
脚本可纳入Git管理,实现变更追踪、回滚和跨项目复用,提升DevOps能力。
2.编写shell脚本
部署MySQL Exporter(mysqld_exporter)的步骤,简单明了如下:
创建专用监控用户
在MySQL中创建一个仅用于监控的用户(如mysqld_exporter),并授予必要权限:REPLICATION CLIENT PROCESS SELECT on performance_schema.*
下载并解压 mysqld_exporter
从 Prometheus 官方 GitHub 下载对应版本的二进制包,解压到指定目录(如/app/mysqld_exporter)。
配置数据库连接凭证
创建一个配置文件(如localhost_db.cnf),写入监控用户的用户名和密码,格式为标准 MySQL 客户端配置(含 **[client]**段),并设置权限为600,确保安全。
创建systemd服务
编写systemd服务文件,以非root用户(如prometheus)运行mysqld_exporter,指定配置文件路径和监听端口(默认 :9105),并启用开机自启。
启动并验证服务
启动服务,检查状态是否正常,并通过浏览器或curl,确认指标可访问。
按照这个部署步骤,我已经把脚本写出来啦,需要的小伙伴仅供参考~(我安装的版本是0.18.0)
#!/bin/bash# 一键安装 mysqld_exporter for CentOS 7# 使用固定 MySQL root密码自动建用户# 监控用户: mysqld_exporter / Sjixin520!set-eVERSION="v0.18.0"INSTALL_DIR="/app/mysqld_exporter"PORT="9105"MYSQL_ROOT_USER="root"MYSQL_ROOT_PASS="Sjixin52!"EXPORTER_USER="mysqld_exporter"EXPORTER_PASS="Sjixin52!"RED='\033[0;31m'GREEN='\033[0;32m'NC='\033[0m'log(){echo-e"${GREEN}[INFO]${NC}$1";}error(){echo-e"${RED}[ERROR]${NC}$1">&2;exit1;}if["$EUID"-ne0];thenerror"请以 root 用户运行此脚本!"fi# 安装依赖log"安装必要工具..."yuminstall-ywgettar&>/dev/null# 下载mysqld_exporterURL="https://github.com/prometheus/mysqld_exporter/releases/download/${VERSION}/mysqld_exporter-${VERSION#v}.linux-amd64.tar.gz"log"正在下载mysqld_exporter${VERSION}..."wget-O/tmp/mysqld_exporter.tar.gz"$URL"||error"下载失败"# 解压到/app/mysqld_exportermkdir-p"$INSTALL_DIR"tar-zxvf/tmp/mysqld_exporter.tar.gz-C"$INSTALL_DIR"--strip-components=1chown-Rroot:root"$INSTALL_DIR"# 确保prometheus用户存在if!id"prometheus"&>/dev/null;thenlog"创建prometheus系统用户..."useradd--system--shell/sbin/nologin --no-create-home prometheusfi# 自动创建MySQL监控用户log"正在连接MySQL并创建监控用户 '$EXPORTER_USER' ..."# 测试root登录是否成功if!mysql -u"$MYSQL_ROOT_USER"-p"$MYSQL_ROOT_PASS"-e"SELECT 1;">/dev/null2>&1;thenerror"无法使用root / Sjixin52! 登录MySQL,请确认MySQL正在运行且密码正确"fi# 创建exporter用户mysql -u"$MYSQL_ROOT_USER"-p"$MYSQL_ROOT_PASS"<<SQL CREATE USER IF NOT EXISTS '$EXPORTER_USER'@'localhost' IDENTIFIED BY '$EXPORTER_PASS'; GRANT REPLICATION CLIENT, PROCESS ON *.* TO '$EXPORTER_USER'@'localhost'; GRANT SELECT ON performance_schema.* TO '$EXPORTER_USER'@'localhost'; FLUSH PRIVILEGES; SQLlog"MySQL监控用户创建成功!"# 创建.my.cnf文件cat>"$INSTALL_DIR/localhost_db.cnf"<<EOF [client] user=$EXPORTER_USERpassword=$EXPORTER_PASShost=localhost EOFchmod600"$INSTALL_DIR/localhost_db.cnf"chownprometheus:prometheus"$INSTALL_DIR/localhost_db.cnf"# 创建systemd服务cat>/etc/systemd/system/mysqld_exporter.service<<EOF [Unit] Description=MySQL Exporter After=network.target [Service] Type=simple User=prometheus ExecStart=$INSTALL_DIR/mysqld_exporter\\--config.my-cnf=$INSTALL_DIR/localhost_db.cnf\\--web.listen-address=:9105 Restart=on-failure RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target EOF# 启动服务log"启动 mysqld_exporter 服务..."systemctl daemon-reload systemctlenable--nowmysqld_exporter log"✅ 安装完成!"log"指标地址: http://$(hostname-I|awk'{print $1}'):${PORT}/metrics"log"服务状态: systemctl status mysqld_exporter"3.使用脚本部署mysql_exporter
编辑一个mysql_exporter.sh文件:
vimysql_exporter.sh#!/bin/bash# 一键安装 mysqld_exporter for CentOS 7# 使用固定 MySQL root密码自动建用户# 监控用户: mysqld_exporter / Sjixin520!set-eVERSION="v0.18.0"INSTALL_DIR="/app/mysqld_exporter"PORT="9105"MYSQL_ROOT_USER="root"MYSQL_ROOT_PASS="Sjixin52!"EXPORTER_USER="mysqld_exporter"EXPORTER_PASS="Sjixin52!"RED='\033[0;31m'GREEN='\033[0;32m'NC='\033[0m'log(){echo-e"${GREEN}[INFO]${NC}$1";}error(){echo-e"${RED}[ERROR]${NC}$1">&2;exit1;}if["$EUID"-ne0];thenerror"请以 root 用户运行此脚本!"fi# 安装依赖log"安装必要工具..."yuminstall-ywgettar&>/dev/null# 下载mysqld_exporterURL="https://github.com/prometheus/mysqld_exporter/releases/download/${VERSION}/mysqld_exporter-${VERSION#v}.linux-amd64.tar.gz"log"正在下载mysqld_exporter${VERSION}..."wget-O/tmp/mysqld_exporter.tar.gz"$URL"||error"下载失败"# 解压到/app/mysqld_exportermkdir-p"$INSTALL_DIR"tar-zxvf/tmp/mysqld_exporter.tar.gz-C"$INSTALL_DIR"--strip-components=1chown-Rroot:root"$INSTALL_DIR"# 确保prometheus用户存在if!id"prometheus"&>/dev/null;thenlog"创建prometheus系统用户..."useradd--system--shell/sbin/nologin --no-create-home prometheusfi# 自动创建MySQL监控用户log"正在连接MySQL并创建监控用户 '$EXPORTER_USER' ..."# 测试root登录是否成功if!mysql -u"$MYSQL_ROOT_USER"-p"$MYSQL_ROOT_PASS"-e"SELECT 1;">/dev/null2>&1;thenerror"无法使用root / Sjixin52! 登录MySQL,请确认MySQL正在运行且密码正确"fi# 创建exporter用户mysql -u"$MYSQL_ROOT_USER"-p"$MYSQL_ROOT_PASS"<<SQL CREATE USER IF NOT EXISTS '$EXPORTER_USER'@'localhost' IDENTIFIED BY '$EXPORTER_PASS'; GRANT REPLICATION CLIENT, PROCESS ON *.* TO '$EXPORTER_USER'@'localhost'; GRANT SELECT ON performance_schema.* TO '$EXPORTER_USER'@'localhost'; FLUSH PRIVILEGES; SQLlog"MySQL监控用户创建成功!"# 创建.my.cnf文件cat>"$INSTALL_DIR/localhost_db.cnf"<<EOF [client] user=$EXPORTER_USERpassword=$EXPORTER_PASShost=localhost EOFchmod600"$INSTALL_DIR/localhost_db.cnf"chownprometheus:prometheus"$INSTALL_DIR/localhost_db.cnf"# 创建systemd服务cat>/etc/systemd/system/mysqld_exporter.service<<EOF [Unit] Description=MySQL Exporter After=network.target [Service] Type=simple User=prometheus ExecStart=$INSTALL_DIR/mysqld_exporter\\--config.my-cnf=$INSTALL_DIR/localhost_db.cnf\\--web.listen-address=:9105 Restart=on-failure RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target EOF# 启动服务log"启动 mysqld_exporter 服务..."systemctl daemon-reload systemctlenable--nowmysqld_exporter log"✅ 安装完成!"log"指标地址: http://$(hostname-I|awk'{print $1}'):${PORT}/metrics"log"服务状态: systemctl status mysqld_exporter"添加完成后,执行该文件:
shmysql_exporter.sh执行过程还是很顺利的,我们来一下终极验证,查看mysqld_exporter服务是否启动成功:
systemctl status mysqld_exporter我们自动脚本就编写成功啦!
这样,无论你有上百台机器都不怕啦~
众所周知,mysql_exporter是搭配prometheus来使用的,接下来,跟我一起搭配prometheus来使用吧~
4.prometheus监控mysql_exporter
找到prometheus的配置文件,编辑添加如下内容(由于我是在另一台机器上安装的prometheus,所以写了mysql_exporter的Ip地址,正常写localhost就可以):
viprometheus.yml- targets:["192.168.42.146:9105"]labels: app:"mysql_exporter"使用浏览器ip+9090打开promethues的页面:
我们可以看到prometheus已经抓取到192.168.42.146里面的mysql_exporter服务啦!
那么,现在我有一个疑问:**当MySQL Exporter与Prometheus部署在同一个局域网内时,监控自然畅通无阻;但如果它们不在同一网络环境——比如 Prometheus在公网服务器,而MySQL数据库位于内网或本地开发环境中,无法被外网直接访问,这时该怎么办?**别担心!cpolar正是解决这类跨网络监控难题的利器。通过cpolar的内网穿透能力,我们可以安全、稳定地将内网中运行的mysqld_exporter(默认监听:9105)暴露到公网,生成一个临时或固定的公网地址。Prometheus只需将该地址配置为抓取目标,即可像访问本地服务一样采集内网MySQL的性能指标,全程无需修改防火墙策略、无需公网IP,也无需暴露数据库本身。更重要的是,cpolar支持HTTPS加密、身份认证和隧道保活,确保监控数据传输的安全性与可靠性。无论是远程调试、混合云架构,还是边缘设备监控,cpolar都能轻松打通网络壁垒,让Prometheus的“眼睛”看得更远、更广。所以,无论你的数据库藏得多深,只要有一条出网通道,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
创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用地址访问。
Prometheus可以通过这个公网地址38c53143.r2.cpolar.top访问到运行在本地9105端口的mysql_exporter服务,从而抓取系统指标。
- targets:["38c53143.r2.cpolar.top"]labels: app:"mysql_exporter"抓取成功!
7.保留固定公网地址
使用cpolar为其配置二级子域名,该地址为固定地址,不会随机变化。
点击左侧的预留,选择保留二级子域名,地区选择china Top,然后设置一个二级子域名名称,我这里演示使用的是mysqll,大家可以自定义。填写备注信息,点击保留。
登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道mysql_exporter,点击右侧的编辑。
修改隧道信息,将保留成功的二级子域名配置到隧道中
- 域名类型:选择二级子域名
- Sub Domain:填写保留成功的二级子域名
- 地区: China Top
点击更新
更新完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称。
最后,我们使用固定的公网地址在任意设备的浏览器中访问,可以看到成功访问本地部署的页面,这样一个永久不会变化的二级子域名公网网址即设置好了。
结尾
Shell脚本把mysqld_exporter原本分散的安装步骤整理成了一套可以重复执行的标准流程。依赖安装、程序下载、监控账号创建、连接配置、文件权限和systemd服务注册都由脚本统一处理,能够减少人工操作差异,也更适合新增节点、环境重建和批量交付。
接入Prometheus后,mysqld_exporter负责暴露MySQL运行指标,Prometheus负责定时抓取和保存数据。当采集端与数据库节点不在同一网络时,cpolar可以只映射Exporter的指标端口,让远端监控系统获取数据,而不必直接暴露数据库服务。正式环境中仍需避免在脚本中保存明文密码,并为监控账号设置最小权限。自动化部署解决的是效率和一致性,凭证保护与访问控制则决定这套监控方案能否长期稳定使用。
