第一阶段:MySQL 监控账号准备
为了安全,在 MySQL 中创建一个专门用于监控的账号:
CREATE USER 'exporter'@'%' IDENTIFIED BY 'YourPassword123!';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
FLUSH PRIVILEGES;
第二阶段:部署 mysqld-exporter (数据采集层)
这是最关键的一步。由于密码包含特殊字符且为了稳定,我们采用了 配置文件挂载 的方式。
-
创建配置文件
/opt/prometheus/my.cnf:[client] user=root password=AppPass123! host=127.0.0.1 port=3306 -
启动容器 (使用
--network host模式直接访问宿主机网络):docker run -d \ --name mysqld-exporter \ --network host \ -v /opt/prometheus/my.cnf:/etc/.my.cnf \ prom/mysqld-exporter \ --config.my-cnf=/etc/.my.cnf -
验证 :访问
http://192.168.211.136:9104/metrics,看到mysql_开头的文字即为成功。
第三阶段:部署 Prometheus (存储层)
-
准备配置文件
/opt/prometheus/prometheus.yml:global: scrape_interval: 15s scrape_configs: - job_name: 'mysql-monitor' static_configs: - targets: ['192.168.211.136:9104'] -
启动容器:
docker run -d \ --name prometheus \ -p 9090:9090 \ -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \ prom/prometheus -
验证 :访问
http://192.168.211.136:9090/targets,看到mysql-monitor状态为 UP。
第四阶段:部署 Grafana (展示与告警层)
-
获取邮件授权码 :在 163 邮箱设置中开启 SMTP 服务并获取 16 位授权码。
-
启动容器 (带邮件配置参数):
docker run -d \ --name grafana \ --network host \ -e "GF_SMTP_ENABLED=true" \ -e "GF_SMTP_HOST=smtp.163.com:465" \ -e "GF_SMTP_USER=15320239818@163.com" \ -e "GF_SMTP_PASSWORD=UMt7XXsHMtQ4XSRi" \ -e "GF_SMTP_FROM_ADDRESS=15320239818@163.com" \ -e "GF_SMTP_FROM_NAME=MySQL监控告警" \ -e "GF_SMTP_SKIP_VERIFY=true" \ grafana/grafana
第五阶段:Grafana 图表可视化
-
添加数据源:
-
登录
http://192.168.211.136:3000(admin/admin)。 -
Connections -> Data Sources -> Add Prometheus。
-
URL 填入:
http://192.168.211.136:9090。
-
-
导入面板:
-
Dashboards -> New -> Import。
-
输入 ID:
12442,选择 Prometheus 数据源。 -
效果:看到 QPS、连接数、缓存利用率等精美图表。
-
第六阶段:邮件告警配置 (闭环)
-
设置联系人 (Contact Point):
-
Alerting -> Contact points -> Add contact point。
-
选择 Email,填入收件地址。
-
点击 Test 确认收到测试邮件。
-
-
创建告警规则 (Alert Rule):
-
设置查询语句(如
mysql_global_status_threads_connected)。 -
设置阈值(如
IS ABOVE 10)。 -
设置持续时间(如
Pending 1m)。 -
选择邮件联系人。
-
💡 核心排错经验 (RHEL 特有)
-
防火墙策略:RHEL 必须开放 9090, 3000, 9104 端口。
sudo firewall-cmd --permanent --add-port={9090,3000,9104}/tcp sudo firewall-cmd --reload -
SELinux 限制 :如果挂载文件权限报错,可以临时使用
setenforce 0。 -
特殊字符 :环境变量中包含
!等符号时,使用配置文件挂载(.my.cnf)比直接传参更可靠。 -
授权码:第三方发信必须使用邮箱生成的专用授权码,而非登录密码。