从零搭建MySQL监控系统:Prometheus与Grafana实战指南
1. 为什么需要MySQL监控系统想象一下你负责维护一个电商平台的数据库突然接到用户投诉说页面加载特别慢。这时候如果没有监控系统你可能要像无头苍蝇一样到处排查是SQL语句有问题服务器内存不足还是磁盘IO瓶颈有了PrometheusGrafana这套监控组合你就能像看汽车仪表盘一样实时掌握MySQL的各项关键指标。我在实际运维中遇到过这样一个案例某次大促前通过监控面板发现数据库连接数持续攀升提前发现了连接泄漏问题避免了活动期间的服务崩溃。这种预防性运维正是监控系统的核心价值。2. 环境准备与组件安装2.1 基础环境要求这套监控系统可以部署在任何Linux服务器上建议配置至少2核CPU/4GB内存10GB以上磁盘空间监控数据会随时间增长CentOS 7/Ubuntu 18.04操作系统需要提前安装的依赖# CentOS sudo yum install -y wget tar git # Ubuntu sudo apt-get update sudo apt-get install -y wget tar git2.2 Prometheus安装详解从官网下载最新版本当前推荐2.45.0wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz tar xvfz prometheus-*.tar.gz cd prometheus-*配置系统服务更利于管理sudo tee /etc/systemd/system/prometheus.service EOF [Unit] DescriptionPrometheus Wantsnetwork-online.target Afternetwork-online.target [Service] Userprometheus Groupprometheus ExecStart/usr/local/bin/prometheus/prometheus \ --config.file/etc/prometheus/prometheus.yml \ --storage.tsdb.path/var/lib/prometheus/data \ --web.console.templates/etc/prometheus/consoles \ --web.console.libraries/etc/prometheus/console_libraries Restartalways [Install] WantedBymulti-user.target EOF关键目录权限设置sudo mkdir -p /var/lib/prometheus sudo useradd -rs /bin/false prometheus sudo chown -R prometheus:prometheus /var/lib/prometheus2.3 Grafana安装与优化对于生产环境推荐使用企业版sudo tee /etc/yum.repos.d/grafana.repo EOF [grafana] namegrafana baseurlhttps://packages.grafana.com/enterprise/rpm repo_gpgcheck1 enabled1 gpgcheck1 gpgkeyhttps://packages.grafana.com/gpg.key sslverify1 sslcacert/etc/pki/tls/certs/ca-bundle.crt EOF sudo yum install -y grafana-enterprise安全加固建议修改默认3000端口配置HTTPS加密设置强密码策略启用LDAP/AD集成认证3. MySQL监控指标采集3.1 创建监控专用账户在MySQL中执行建议密码复杂度更高CREATE USER exporter10.0.% IDENTIFIED BY ComplexPass123! WITH MAX_USER_CONNECTIONS 3; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO exporter10.0.%; FLUSH PRIVILEGES;注意生产环境建议限制访问IP段避免使用%通配符3.2 mysqld_exporter高级配置下载并解压exporterwget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.0/mysqld_exporter-0.15.0.linux-amd64.tar.gz tar xvfz mysqld_exporter-*.tar.gz配置文件.my.cnf示例[client] host127.0.0.1 port3306 userexporter passwordComplexPass123!启动时启用更多采集器nohup ./mysqld_exporter \ --config.my-cnf.my.cnf \ --collect.global_status \ --collect.info_schema.innodb_metrics \ --collect.auto_increment.columns \ --collect.info_schema.processlist \ --collect.binlog_size \ --collect.perf_schema.tablelocks \ --collect.perf_schema.eventswaits \ --collect.perf_schema.file_events \ --web.listen-address0.0.0.0:9104 4. 数据可视化配置实战4.1 Prometheus数据源配置在Grafana中添加数据源时建议设置HTTP URL: http://prometheus-ip:9090Scrape interval: 15s与prometheus配置一致Timeout: 30s启用Use proxy模式避免跨域问题4.2 导入专业Dashboard推荐几个高质量的MySQL监控模板MySQL Overview(ID: 7362)MySQL InnoDB Metrics(ID: 7991)MySQL Performance Schema(ID: 11323)导入方法在Grafana首页点击 Import输入模板ID或上传JSON文件选择对应的Prometheus数据源4.3 自定义关键指标面板对于电商类应用建议重点关注QPS波动rate(mysql_global_status_questions[1m])慢查询数mysql_global_status_slow_queries连接池使用率mysql_global_status_threads_connected / mysql_global_variables_max_connections * 100InnoDB缓冲池命中率(1 - mysql_global_status_innodb_buffer_pool_reads / mysql_global_status_innodb_buffer_pool_read_requests) * 100示例查询面板配置SELECT $__timeGroupAlias(created_at,$__interval), avg(query_time) as 平均耗时 FROM mysql.slow_log WHERE $__timeFilter(created_at) GROUP BY 1 ORDER BY 15. 告警规则与故障排查5.1 关键告警规则示例在Prometheus的alert.rules文件中添加groups: - name: mysql-alerts rules: - alert: MySQLDown expr: mysql_up 0 for: 1m labels: severity: critical annotations: summary: MySQL实例下线 (instance {{ $labels.instance }}) - alert: HighConnections expr: mysql_global_status_threads_connected / mysql_global_variables_max_connections 0.8 for: 5m labels: severity: warning annotations: summary: 数据库连接数超过80% (instance {{ $labels.instance }}) value: {{ $value }}%5.2 告警渠道集成Grafana支持多种告警通知方式邮件通知配置SMTP服务器Slack/webhook适合团队协作PagerDuty用于on-call应急响应企业微信/钉钉国内团队推荐配置示例alertmanager.ymlroute: receiver: wechat-alert group_wait: 30s group_interval: 5m receivers: - name: wechat-alert wechat_configs: - send_resolved: true corp_id: your-corp-id to_user: all agent_id: 1000002 api_secret: your-api-secret6. 生产环境优化建议6.1 性能调优参数在prometheus.yml中调整global: scrape_interval: 30s # 采集频率 evaluation_interval: 30s external_labels: monitor: mysql-prod storage: tsdb: retention: 30d # 数据保留周期 wal_compression: true6.2 高可用方案推荐架构Prometheus集群使用Thanos或VictoriaMetrics实现长期存储和全局视图Grafana多实例通过负载均衡提供服务监控代理冗余每个MySQL实例部署独立的exporter6.3 安全防护措施为exporter配置TLS加密./mysqld_exporter \ --web.config.fileweb-config.yml \ --config.my-cnf.my.cnf网络隔离策略只允许Prometheus服务器访问exporter端口监控网络与管理网络分离使用跳板机访问监控界面7. 常见问题解决方案Q1exporter连接MySQL失败检查防火墙规则验证账户权限查看MySQL错误日志Q2Grafana面板无数据检查Prometheus Targets页面验证时间范围设置查看exporter的/metrics端点Q3监控数据延迟调整scrape_interval检查网络延迟优化PromQL查询语句性能数据突增排查流程确认是否真实流量增长检查慢查询日志分析锁等待情况查看系统资源监控这套监控系统上线后我们成功将数据库故障平均修复时间(MTTR)从原来的47分钟降低到8分钟。特别是在一次内存泄漏事故中通过监控图表快速定位到问题进程避免了服务中断。