MySQL运维与监控之:如何使用`Prometheus`和`Grafana`监控`MySQL`性能指标。

MySQL 运维与监控:Prometheus + Grafana 实战

各位朋友,大家好!今天我们来聊聊MySQL运维中至关重要的一环:性能监控。监控MySQL性能指标,及时发现瓶颈并解决问题,是保障数据库稳定高效运行的关键。而Prometheus和Grafana,正是监控领域的黄金搭档。Prometheus负责数据的采集、存储和查询,Grafana负责数据的可视化展示。

本次讲座将围绕以下几个方面展开:

  1. 监控架构概述:了解Prometheus + Grafana监控MySQL的基本架构和原理。
  2. MySQL Exporter配置:掌握MySQL Exporter的安装、配置和使用,它是Prometheus采集MySQL指标的桥梁。
  3. Prometheus配置:学习如何配置Prometheus以抓取MySQL Exporter暴露的指标。
  4. Grafana配置:学习如何在Grafana中配置数据源,创建仪表盘,并可视化MySQL性能指标。
  5. 常用监控指标详解:深入了解MySQL常用的监控指标,并学会如何利用这些指标进行性能分析。
  6. 告警配置:配置告警规则,及时发现并处理潜在的性能问题。

1. 监控架构概述

Prometheus + Grafana 监控MySQL的架构,可以用下图简单表示:

+---------------------+    +---------------------+    +---------------------+
|       MySQL         |--->|   MySQL Exporter    |--->|     Prometheus      |--->|      Grafana      |
+---------------------+    +---------------------+    +---------------------+    +---------------------+
  (待监控的数据库)        (指标暴露组件)          (数据采集/存储/查询)      (数据可视化)
  • MySQL:这是我们需要监控的目标,即MySQL数据库服务器。
  • MySQL Exporter:这是一个独立的应用程序,它连接到MySQL服务器,获取各种性能指标,然后以Prometheus可以理解的格式(Metrics)暴露出来。
  • Prometheus:Prometheus定期从MySQL Exporter拉取(scrape)这些指标数据,并存储在自己的时间序列数据库中。Prometheus还提供强大的查询语言(PromQL),用于查询和分析这些数据。
  • Grafana:Grafana连接到Prometheus,使用PromQL查询Prometheus存储的指标数据,然后以各种图表、表格等形式进行可视化展示。

工作流程如下:

  1. MySQL Exporter连接到MySQL服务器,周期性地执行SQL查询,收集各种性能指标。
  2. MySQL Exporter将收集到的指标数据,以HTTP接口的形式暴露出来。
  3. Prometheus根据配置文件,定期从MySQL Exporter的HTTP接口拉取指标数据。
  4. Prometheus将拉取到的指标数据存储在自己的时间序列数据库中。
  5. Grafana通过配置数据源,连接到Prometheus。
  6. 用户在Grafana中创建仪表盘,使用PromQL查询Prometheus中的数据,并将查询结果以各种图表形式展示出来。

2. MySQL Exporter 配置

MySQL Exporter是连接MySQL和Prometheus的桥梁。它的作用是连接到MySQL,获取性能指标,然后以Prometheus可以抓取的方式暴露出来。

安装MySQL Exporter:

可以直接下载预编译好的二进制文件,也可以使用Docker镜像。这里我们以Docker镜像为例:

docker pull prom/mysqld-exporter:latest

配置MySQL Exporter:

MySQL Exporter需要知道如何连接到MySQL数据库。这可以通过环境变量或者配置文件来完成。推荐使用配置文件,更易于管理。

  1. 创建配置文件mysqld_exporter.cnf:

    [client]
    user     = exporter
    password = your_exporter_password
    host     = 127.0.0.1
    port     = 3306

    注意:

    • 需要创建一个专门用于监控的MySQL用户,并授予其必要的权限。
    • exporter用户只需要PROCESS, REPLICATION CLIENT, SELECT ON performance_schema.*权限即可。
  2. 创建MySQL用户并授权:

    CREATE USER 'exporter'@'%' IDENTIFIED BY 'your_exporter_password';
    GRANT PROCESS, REPLICATION CLIENT, SELECT ON performance_schema.* TO 'exporter'@'%';
    FLUSH PRIVILEGES;
  3. 运行MySQL Exporter Docker容器:

    docker run -d 
      --name mysqld-exporter 
      --network="host"  #使用host网络模式,简化网络配置
      -v /path/to/your/mysqld_exporter.cnf:/etc/mysqld_exporter.cnf 
      prom/mysqld-exporter:latest 
      --config.my-cnf=/etc/mysqld_exporter.cnf

    说明:

    • --network="host": 使用host网络模式,exporter可以直接访问宿主机的MySQL服务。 如果MySQL服务不在本机,需要指定MySQL服务器的IP地址和端口,并且确保exporter可以访问到。
    • -v /path/to/your/mysqld_exporter.cnf:/etc/mysqld_exporter.cnf:将配置文件挂载到容器中。
    • --config.my-cnf=/etc/mysqld_exporter.cnf:指定配置文件的路径。
  4. 验证MySQL Exporter是否正常工作:

    打开浏览器,访问http://localhost:9104/metrics (假设MySQL Exporter运行在本地,端口为9104)。如果看到一堆以mysql_开头的指标数据,说明MySQL Exporter已经正常工作。

3. Prometheus 配置

Prometheus需要配置才能从MySQL Exporter抓取指标数据。

  1. 编辑Prometheus配置文件 prometheus.yml:

    global:
      scrape_interval:     15s
      evaluation_interval: 15s
    
    scrape_configs:
      - job_name: 'mysql'
        static_configs:
          - targets: ['localhost:9104'] # MySQL Exporter的地址和端口

    说明:

    • scrape_interval:Prometheus抓取数据的频率。
    • job_name:Job的名称,可以自定义。
    • targets:指定要抓取的目标,这里是MySQL Exporter的地址和端口。 如果MySQL Exporter运行在不同的机器上,需要修改为对应的IP地址和端口。
  2. 运行Prometheus:

    可以使用Docker镜像或者直接下载二进制文件运行。这里以Docker镜像为例:

    docker run -d 
      --name prometheus 
      -p 9090:9090 
      -v /path/to/your/prometheus.yml:/etc/prometheus/prometheus.yml 
      prom/prometheus:latest 
      --config.file=/etc/prometheus/prometheus.yml

    说明:

    • -p 9090:9090:将Prometheus的9090端口映射到宿主机的9090端口。
    • -v /path/to/your/prometheus.yml:/etc/prometheus/prometheus.yml:将Prometheus配置文件挂载到容器中。
    • --config.file=/etc/prometheus/prometheus.yml:指定配置文件的路径。
  3. 验证Prometheus是否正常工作:

    打开浏览器,访问http://localhost:9090。在Prometheus的Web界面中,点击Status -> Targets,可以看到MySQL Exporter的状态。如果状态为UP,说明Prometheus已经成功抓取到MySQL Exporter的指标数据。 如果没有显示UP,检查prometheus.yml中的targets配置是否正确,以及MySQL Exporter是否正常运行。

4. Grafana 配置

Grafana负责数据的可视化展示。我们需要配置Grafana的数据源,连接到Prometheus,然后创建仪表盘,展示MySQL的性能指标。

  1. 运行Grafana:

    docker run -d 
      --name grafana 
      -p 3000:3000 
      grafana/grafana:latest

    说明:

    • -p 3000:3000:将Grafana的3000端口映射到宿主机的3000端口。
  2. 登录Grafana:

    打开浏览器,访问http://localhost:3000。默认用户名和密码都是admin。登录后,会提示修改密码。

  3. 配置数据源:

    • 点击左侧导航栏的Configuration -> Data sources
    • 点击Add data source
    • 选择Prometheus
    • HTTP -> URL中,输入Prometheus的地址http://prometheus:9090 (如果Grafana和Prometheus运行在同一个Docker网络中,可以使用容器名称作为主机名。否则,需要使用Prometheus的IP地址)。
    • 点击Save & Test。如果显示Data source is working,说明数据源配置成功。
  4. 创建仪表盘:

    • 点击左侧导航栏的+ -> Dashboard
    • 点击Add new panel
    • Query选项卡中,选择之前配置的Prometheus数据源。
    • PromQL输入框中,输入PromQL查询语句,例如mysql_global_status_uptime
    • Visualization选项卡中,选择合适的图表类型,例如Graph
    • 点击Apply

    重复以上步骤,添加更多的面板,展示不同的MySQL性能指标。

5. 常用监控指标详解

MySQL Exporter暴露了大量的性能指标。这里列出一些常用的指标,并解释它们的含义和用途。

指标名称 描述 用途
mysql_global_status_uptime MySQL服务器的运行时间(秒)。 衡量服务器的稳定性。如果uptime经常重置,说明服务器经常重启,需要排查原因。
mysql_global_status_threads_connected 当前连接到MySQL服务器的客户端线程数。 监控并发连接数。如果连接数过高,可能导致服务器性能下降。需要优化SQL语句,减少连接数,或者增加服务器资源。
mysql_global_status_questions_total 服务器接收到的查询总数。 衡量服务器的负载。可以结合uptime计算每秒查询数(QPS)。
mysql_global_status_slow_queries 执行时间超过long_query_time的查询数量。 监控慢查询。慢查询是导致服务器性能下降的主要原因之一。需要分析慢查询日志,优化SQL语句,或者增加索引。
mysql_global_status_bytes_received 服务器接收到的字节数。 监控网络流量。
mysql_global_status_bytes_sent 服务器发送的字节数。 监控网络流量。
mysql_global_status_innodb_rows_read InnoDB存储引擎读取的行数。 衡量InnoDB存储引擎的读取负载。
mysql_global_status_innodb_rows_written InnoDB存储引擎写入的行数。 衡量InnoDB存储引擎的写入负载。
mysql_global_status_innodb_buffer_pool_pages_total InnoDB buffer pool的总页数。 监控InnoDB buffer pool的容量。
mysql_global_status_innodb_buffer_pool_pages_free InnoDB buffer pool中空闲的页数。 监控InnoDB buffer pool的利用率。如果空闲页数过少,说明buffer pool不足,需要增加innodb_buffer_pool_size
mysql_global_status_innodb_buffer_pool_read_requests 从InnoDB buffer pool读取数据的请求数。 衡量InnoDB buffer pool的读取负载。
mysql_global_status_innodb_buffer_pool_reads 从磁盘读取数据的请求数(buffer pool miss)。 衡量InnoDB buffer pool的命中率。如果mysql_global_status_innodb_buffer_pool_reads / mysql_global_status_innodb_buffer_pool_read_requests 比例较高,说明buffer pool命中率较低,需要增加innodb_buffer_pool_size
mysql_slave_status_seconds_behind_master 主从复制延迟的时间(秒)。 监控主从复制延迟。如果延迟过高,可能导致数据不一致。需要优化主从复制配置,或者增加服务器资源。

PromQL 示例:

  • 查询MySQL的CPU使用率(需要安装Node Exporter):

    (1 - avg(irate(node_cpu_seconds_total{instance="your_mysql_server_ip:9100",mode="idle"}[5m]))) * 100
  • 计算每秒查询数 (QPS):

    rate(mysql_global_status_questions_total[1m])
  • 计算InnoDB buffer pool的命中率:

    1 - (rate(mysql_global_status_innodb_buffer_pool_reads[1m]) / rate(mysql_global_status_innodb_buffer_pool_read_requests[1m]))

6. 告警配置

监控的最终目的是及时发现问题并解决问题。配置告警规则,可以在指标超出预设阈值时,自动发送告警通知。

Prometheus Alertmanager 是一个处理告警的组件。它接收来自 Prometheus 的告警,然后根据配置的规则,发送告警通知。

  1. 配置Prometheus告警规则:

    prometheus.yml 文件中,添加 rule_files 配置项,指定告警规则文件的路径。

    rule_files:
      - /path/to/your/alert.rules.yml
  2. 创建告警规则文件 alert.rules.yml:

    groups:
    - name: mysql_alerts
      rules:
      - alert: MySQLHighCPUUsage
        expr: (1 - avg(irate(node_cpu_seconds_total{instance="your_mysql_server_ip:9100",mode="idle"}[5m]))) * 100 > 80
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "MySQL CPU 使用率过高"
          description: "MySQL CPU 使用率超过 80%,请检查。"
    
      - alert: MySQLSlowQueries
        expr: rate(mysql_global_status_slow_queries[5m]) > 10
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "MySQL 慢查询过多"
          description: "MySQL 慢查询数量超过 10/分钟,请检查慢查询日志。"
    
      - alert: MySQLReplicationLag
        expr: mysql_slave_status_seconds_behind_master > 300
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "MySQL 主从复制延迟过高"
          description: "MySQL 主从复制延迟超过 300 秒,请检查。"
    

    说明:

    • alert:告警的名称。
    • expr:告警触发的条件,使用PromQL表达式。
    • for:告警持续的时间。只有当告警条件持续满足一段时间后,才会触发告警。
    • labels:告警的标签,可以用于告警路由。
    • annotations:告警的注释,包含告警的摘要和描述。
  3. 配置Alertmanager:

    • 下载Alertmanager:

      wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
      tar -xzf alertmanager-0.26.0.linux-amd64.tar.gz
      cd alertmanager-0.26.0.linux-amd64
    • 创建 Alertmanager 配置文件 alertmanager.yml

      global:
        resolve_timeout: 5m
      
      route:
        group_by: ['alertname']
        group_wait: 30s
        group_interval: 5m
        repeat_interval: 12h
        receiver: 'web.hook'
      
      receivers:
      - name: 'web.hook'
        webhook_configs:
        - url: 'http://your_alert_receiver_endpoint' # 修改为你的告警接收端点,例如企业微信群机器人,邮件服务器等
    • 启动Alertmanager:

      ./alertmanager --config.file=alertmanager.yml
    • 在Prometheus配置文件 prometheus.yml 中,配置 Alertmanager 的地址:

      alerting:
        alertmanagers:
        - static_configs:
          - targets:
            - localhost:9093 # Alertmanager的地址

      重启 Prometheus 使配置生效。

    说明:

    • global:全局配置。
    • route:路由配置,定义如何处理告警。
      • group_by:按照哪些标签分组告警。
      • group_wait:等待多久才发送告警。
      • group_interval:多久发送一次分组告警。
      • repeat_interval:多久重复发送告警。
      • receiver:指定告警接收器。
    • receivers:告警接收器配置,定义如何发送告警。
      • name:接收器的名称。
      • webhook_configs:Webhook配置,指定告警接收端点的URL。可以配置多个Webhook,将告警发送到不同的地方。
      • 可以配置邮件、企业微信、钉钉等多种告警方式。
  4. 测试告警:

    可以通过手动调整MySQL服务器的负载,或者修改Prometheus告警规则,触发告警。

总结: 监控是保障数据库稳定运行的基石

今天我们学习了如何使用Prometheus和Grafana监控MySQL性能指标。通过合理的配置和使用,可以及时发现并解决潜在的性能问题,保障数据库的稳定高效运行。当然,这只是监控的开始,需要不断学习和实践,才能更好地掌握监控技术,提升运维能力。

希望本次讲座对大家有所帮助!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注