1. 项目背景与核心价值
MySQL数据库监控是运维工作中不可或缺的一环。作为从业十年的运维工程师,我见过太多因为监控缺失导致的线上事故。mysql_export作为Prometheus生态下的MySQL监控方案,相比传统监控工具具有三大不可替代的优势:
- 指标采集粒度精细到每秒级,能捕捉瞬时性能波动
- 原生支持Prometheus+Grafana监控栈,无需额外适配
- 关键指标覆盖全面,包括连接数、查询性能、复制状态等核心维度
最近在为金融客户部署生产环境时,我再次验证了这套方案的可靠性。下面分享从零开始的高可用部署方案,包含经过生产验证的配置参数。
2. 环境准备与依赖安装
2.1 基础环境要求
推荐使用以下环境组合(经长期生产验证):
- Linux发行版:Ubuntu 20.04 LTS或CentOS 7.9
- MySQL版本:5.7.32+ 或 8.0.23+
- Prometheus版本:2.30.0+
- 硬件配置:至少2核CPU/4GB内存(实测可监控20+MySQL实例)
特别注意:避免使用MySQL 8.0.20-8.0.22版本,这些版本存在监控指标缺失的已知问题。
2.2 权限配置最佳实践
创建专用监控账户时,建议采用最小权限原则:
CREATE USER 'exporter'@'10.%.%.%' IDENTIFIED BY 'ComplexP@ssw0rd' WITH MAX_USER_CONNECTIONS 3; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'10.%.%.%'; FLUSH PRIVILEGES;关键点说明:
- 限制源IP段(10.%.%.%)增强安全性
- MAX_USER_CONNECTIONS防止监控连接耗尽资源
- 不要授予SUPER权限,避免安全风险
3. 部署mysql_export核心组件
3.1 二进制安装与验证
下载预编译版本(推荐v0.14.0+):
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.14.0/mysqld_exporter-0.14.0.linux-amd64.tar.gz tar xvf mysqld_exporter-*.tar.gz cd mysqld_exporter-*启动测试(开发环境):
./mysqld_exporter \ --config.my-cnf=".my.cnf" \ --web.listen-address=":9104" \ --collect.global_status \ --collect.info_schema.innodb_metrics健康检查命令:
curl http://localhost:9104/metrics | grep mysql_up3.2 生产级systemd配置
创建/etc/systemd/system/mysql_exporter.service:
[Unit] Description=MySQL Prometheus Exporter After=network.target [Service] User=mysqlmon Group=mysqlmon Environment="DATA_SOURCE_NAME=exporter:ComplexP@ssw0rd@(localhost:3306)/" ExecStart=/usr/local/bin/mysqld_exporter \ --config.my-cnf=/etc/.my.cnf \ --web.listen-address=0.0.0.0:9104 \ --collect.auto_increment.columns \ --collect.binlog_size \ --collect.engine_innodb_status \ --collect.info_schema.processlist \ --collect.perf_schema.eventswaits Restart=always RestartSec=3 [Install] WantedBy=multi-user.target关键参数解析:
- 专用系统账户(mysqlmon)运行提升安全性
- Restart策略确保服务高可用
- 精选的collect参数平衡性能与监控需求
4. Prometheus集成配置
4.1 抓取配置优化
在prometheus.yml中添加:
scrape_configs: - job_name: 'mysql' scrape_interval: 15s metrics_path: /metrics static_configs: - targets: ['mysql01:9104','mysql02:9104'] relabel_configs: - source_labels: [__address__] target_label: instance - source_labels: [__meta_mysql_role] regex: (.*) target_label: role4.2 告警规则推荐
alert.rules.yml示例:
groups: - name: MySQL Alerts rules: - alert: MySQLDown expr: mysql_up == 0 for: 1m labels: severity: critical annotations: summary: "MySQL instance down ({{ $labels.instance }})" - alert: HighThreadsRunning expr: mysql_global_status_threads_running > 100 for: 5m labels: severity: warning annotations: summary: "High threads running ({{ $value }})"5. 性能优化与问题排查
5.1 资源占用控制
通过以下参数限制资源使用:
--collect.info_schema.tables.databases="" # 不采集所有库表信息 --collect.perf_schema.file_events=false # 禁用文件事件监控 --collect.perf_schema.eventsstatements.digest_text_limit=120 # 限制SQL摘要长度5.2 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 连接超时 | 防火墙拦截 | 检查9104端口连通性 |
| 指标缺失 | 权限不足 | 验证SELECT PROCESS权限 |
| 高CPU占用 | 采集太频繁 | 调整scrape_interval至30s+ |
| 内存泄漏 | 旧版本bug | 升级至0.13.0+版本 |
6. 高级监控场景实现
6.1 主从复制监控
启用额外采集参数:
--collect.repl_status \ --collect.repl_slave_status \ --collect.repl_master_status关键监控指标:
- mysql_slave_status_sql_thread_running
- mysql_slave_status_seconds_behind_master
- mysql_slave_status_master_server_id
6.2 自定义查询扩展
通过配置my.cnf添加自定义指标:
[client] user=exporter password=ComplexP@ssw0rd [exporter] query.long_running_query=SELECT COUNT(*) AS count FROM information_schema.processlist WHERE TIME > 60在Grafana中通过mysql_custom_query_long_running_query_count引用该指标
7. 安全加固措施
网络层防护:
- 限制9104端口仅对Prometheus服务器开放
- 启用TLS加密(--web.config.file参数)
认证加固:
--web.config.file=web-config.ymlweb-config.yml示例:
tls_server_config: cert_file: /path/to/cert.pem key_file: /path/to/key.pem basic_auth_users: prometheus: "$2y$10$hashedpassword"审计日志:
--log.level=debug 2>&1 | logger -t mysql_exporter
这套方案在我们生产环境稳定运行3年,日均处理超过200亿个监控指标。最关键的经验是:定期检查指标采集耗时(mysql_exporter_scrape_duration_seconds),当该值超过scrape_interval的50%时就需要优化采集参数了。