MySQL性能监控实战:5分钟容器化部署Prometheus+Grafana+mysqld_exporter

为什么需要专业级的MySQL监控?

当数据库查询突然变慢,业务系统出现卡顿,作为运维人员或DBA的你,是否经历过这样的困境:面对性能问题束手无策,只能被动等待用户投诉?传统的监控工具往往只能提供基础的运行状态指标,而现代分布式系统需要的是全维度、实时、可追溯的性能洞察。

想象一下这样的场景:凌晨3点,电商系统大促期间,数据库CPU突然飙升至90%。如果没有完善的监控体系,你可能需要:

  1. 手动登录服务器检查进程
  2. 逐条执行SHOW STATUS命令
  3. 尝试复现问题并猜测可能的原因

而有了Prometheus+Grafana这套监控组合,你可以在问题发生的第一时间:

  • 通过手机查看实时监控图表
  • 快速定位是连接数暴增、慢查询堆积还是索引失效
  • 根据历史数据对比分析异常模式
  • 在用户感知前完成故障处理

容器化部署的优势

相比传统安装方式,使用Docker部署监控系统具有以下不可替代的优势:

环境一致性:消除"在我机器上能运行"的问题,确保开发、测试、生产环境完全一致

快速部署:5分钟内完成全套监控系统的搭建,无需处理复杂的依赖关系

资源隔离:每个组件运行在独立容器中,避免端口冲突和资源竞争

易于维护:通过docker-compose实现一键启停和版本升级

五分钟快速部署指南

1. 准备工作

确保你的系统已安装Docker和docker-compose。以下是一个最小化的docker-compose.yml模板:

version: '3'

services:
  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
  
  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    volumes:
      - grafana-storage:/var/lib/grafana
    depends_on:
      - prometheus

  mysql-exporter:
    image: prom/mysqld-exporter:latest
    environment:
      - DATA_SOURCE_NAME=exporter:Exporter1234!@tcp(mysql-host:3306)/
    ports:
      - "9104:9104"

2. MySQL权限配置

为监控系统创建专用账户(避免使用root账户):

CREATE USER 'exporter'@'%' IDENTIFIED BY 'Exporter1234!' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
FLUSH PRIVILEGES;

安全提示:生产环境请将'%'替换为具体的监控服务器IP,并定期轮换密码

3. Prometheus配置

创建prometheus.yml配置文件,添加mysql-exporter的监控目标:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'mysql'
    static_configs:
      - targets: ['mysql-exporter:9104']
        labels:
          instance: 'production-mysql'

关键参数说明:

参数说明推荐值
scrape_interval数据采集间隔15-60s
evaluation_interval告警规则评估间隔15-60s
labels实例标签按环境区分

4. 启动所有服务

执行以下命令启动监控系统:

docker-compose up -d

验证服务状态:

docker-compose ps

预期输出应显示三个服务状态为"Up"。

Grafana可视化配置

1. 初始登录

访问 http://你的服务器IP:3000,使用默认凭证登录:

  • 用户名:admin
  • 密码:admin

首次登录后会提示修改密码。

2. 添加数据源

  1. 左侧菜单选择"Configuration" > "Data Sources"
  2. 点击"Add data source"
  3. 选择Prometheus
  4. URL填写 http://prometheus:9090
  5. 点击"Save & Test"

3. 导入MySQL监控模板

Grafana社区提供了丰富的预置仪表盘,推荐使用以下两个模板:

  1. MySQL Overview:ID 7362
  2. MySQL Performance:ID 11323

导入步骤:

  1. 左侧菜单选择"Create" > "Import"
  2. 输入模板ID
  3. 选择刚添加的Prometheus数据源
  4. 点击"Import"

关键监控指标解析

一个完善的MySQL监控系统应包含以下核心指标:

连接指标

  • mysql_global_status_threads_connected:当前连接数
  • mysql_global_variables_max_connections:最大允许连接数
  • mysql_global_status_aborted_connects:失败的连接尝试

查询性能

  • mysql_global_status_questions:查询总数
  • mysql_global_status_slow_queries:慢查询数量
  • mysql_global_status_select_full_join:全表连接查询

缓冲区和缓存

  • mysql_global_status_innodb_buffer_pool_read_requests:InnoDB缓冲池读请求
  • mysql_global_status_innodb_buffer_pool_reads:从磁盘读取的次数

复制状态(主从架构)

  • mysql_global_status_slave_io_running:IO线程状态
  • mysql_global_status_slave_sql_running:SQL线程状态
  • mysql_global_status_seconds_behind_master:复制延迟秒数

告警规则配置

在Prometheus中配置基础告警规则(alert.rules.yml):

groups:
- name: mysql-alerts
  rules:
  - alert: HighConnections
    expr: mysql_global_status_threads_connected / mysql_global_variables_max_connections > 0.8
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High connection usage on {{ $labels.instance }}"
      description: "MySQL connections are at {{ $value }}% of maximum"

  - alert: SlowQueryIncrease
    expr: rate(mysql_global_status_slow_queries[5m]) > 5
    for: 10m
    labels:
      severity: critical
    annotations:
      summary: "Slow query increase on {{ $labels.instance }}"
      description: "Detected {{ $value }} slow queries per second"

性能优化实战技巧

1. 连接池优化

当监控显示连接数接近上限时:

-- 临时增加最大连接数
SET GLOBAL max_connections = 500;

-- 长期方案:优化连接池配置
-- 在应用配置中调整:
-- HikariCP: maximumPoolSize
-- Druid: maxActive

2. 慢查询分析

定位问题SQL:

-- 启用慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1; -- 超过1秒视为慢查询

-- 使用pt-query-digest分析日志
pt-query-digest /var/lib/mysql/mysql-slow.log

3. 索引优化

通过监控发现全表扫描:

-- 查找缺失索引的表
SELECT * FROM sys.schema_tables_with_full_table_scans;

-- 使用EXPLAIN分析查询计划
EXPLAIN SELECT * FROM orders WHERE user_id = 100;

常见问题排查

1. Exporter无法连接MySQL

检查步骤:

  1. 验证网络连通性:telnet mysql-host 3306
  2. 检查账户权限:SHOW GRANTS FOR 'exporter'@'%'
  3. 查看Exporter日志:docker logs <container_id>

2. Prometheus无数据

诊断方法:

  1. 直接访问Exporter端点:curl http://localhost:9104/metrics
  2. 检查Prometheus目标状态:http://localhost:9090/targets
  3. 验证时间戳:确保服务器时间同步

3. Grafana图表显示"No Data"

解决方案:

  1. 检查时间范围设置(右上角)
  2. 验证PromQL查询语法
  3. 确认数据源配置正确

安全加固建议

  1. 网络隔离:将监控组件部署在内网,通过VPN访问
  2. 访问控制:
    # Nginx基础认证配置
    location /grafana/ {
      auth_basic "Restricted";
      auth_basic_user_file /etc/nginx/.htpasswd;
      proxy_pass http://grafana:3000/;
    }
    
  3. 数据加密:为Grafana启用HTTPS
  4. 定期审计:检查监控系统的访问日志和用户权限

性能监控的进阶应用

1. 业务指标监控

将业务指标与数据库性能关联:

-- 订单创建速率
SELECT COUNT(*) AS orders_per_sec FROM orders 
WHERE created_at >= NOW() - INTERVAL 1 SECOND;

2. 容量规划

基于历史数据预测资源需求:

# 预测磁盘空间增长
predict_linear(mysql_global_status_innodb_data_length[7d], 86400 * 30)

3. 多实例监控

统一监控多个MySQL实例:

# prometheus.yml配置示例
- job_name: 'mysql-cluster'
  static_configs:
    - targets: ['mysql1:9104', 'mysql2:9104', 'mysql3:9104']
  metrics_path: '/metrics'
  relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: mysql-exporter:9104

容器化部署的优化技巧

1. 资源限制

在docker-compose中为每个服务设置资源限制:

services:
  prometheus:
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 2G

2. 数据持久化

确保监控数据不会因容器重启丢失:

volumes:
  prometheus-data:
    driver: local
  grafana-storage:
    driver: local

3. 健康检查

添加容器健康检查:

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:9090/-/healthy"]
  interval: 30s
  timeout: 10s
  retries: 3

这套监控方案已经在多个生产环境稳定运行,处理过TB级数据库的监控需求。实际使用中发现,合理的告警阈值设置和定期的性能基线评估,能够预防80%的数据库性能问题。

更多推荐