MySQL 运维与监控:Prometheus + Grafana 实战
各位朋友,大家好!今天我们来聊聊MySQL运维中至关重要的一环:性能监控。监控MySQL性能指标,及时发现瓶颈并解决问题,是保障数据库稳定高效运行的关键。而Prometheus和Grafana,正是监控领域的黄金搭档。Prometheus负责数据的采集、存储和查询,Grafana负责数据的可视化展示。
本次讲座将围绕以下几个方面展开:
- 监控架构概述:了解Prometheus + Grafana监控MySQL的基本架构和原理。
- MySQL Exporter配置:掌握MySQL Exporter的安装、配置和使用,它是Prometheus采集MySQL指标的桥梁。
- Prometheus配置:学习如何配置Prometheus以抓取MySQL Exporter暴露的指标。
- Grafana配置:学习如何在Grafana中配置数据源,创建仪表盘,并可视化MySQL性能指标。
- 常用监控指标详解:深入了解MySQL常用的监控指标,并学会如何利用这些指标进行性能分析。
- 告警配置:配置告警规则,及时发现并处理潜在的性能问题。
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存储的指标数据,然后以各种图表、表格等形式进行可视化展示。
工作流程如下:
- MySQL Exporter连接到MySQL服务器,周期性地执行SQL查询,收集各种性能指标。
- MySQL Exporter将收集到的指标数据,以HTTP接口的形式暴露出来。
- Prometheus根据配置文件,定期从MySQL Exporter的HTTP接口拉取指标数据。
- Prometheus将拉取到的指标数据存储在自己的时间序列数据库中。
- Grafana通过配置数据源,连接到Prometheus。
- 用户在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数据库。这可以通过环境变量或者配置文件来完成。推荐使用配置文件,更易于管理。
-
创建配置文件
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.*
权限即可。
-
创建MySQL用户并授权:
CREATE USER 'exporter'@'%' IDENTIFIED BY 'your_exporter_password'; GRANT PROCESS, REPLICATION CLIENT, SELECT ON performance_schema.* TO 'exporter'@'%'; FLUSH PRIVILEGES;
-
运行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
:指定配置文件的路径。
-
验证MySQL Exporter是否正常工作:
打开浏览器,访问
http://localhost:9104/metrics
(假设MySQL Exporter运行在本地,端口为9104)。如果看到一堆以mysql_
开头的指标数据,说明MySQL Exporter已经正常工作。
3. Prometheus 配置
Prometheus需要配置才能从MySQL Exporter抓取指标数据。
-
编辑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地址和端口。
-
运行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
:指定配置文件的路径。
-
验证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的性能指标。
-
运行Grafana:
docker run -d --name grafana -p 3000:3000 grafana/grafana:latest
说明:
-p 3000:3000
:将Grafana的3000端口映射到宿主机的3000端口。
-
登录Grafana:
打开浏览器,访问
http://localhost:3000
。默认用户名和密码都是admin
。登录后,会提示修改密码。 -
配置数据源:
- 点击左侧导航栏的
Configuration
->Data sources
。 - 点击
Add data source
。 - 选择
Prometheus
。 - 在
HTTP
->URL
中,输入Prometheus的地址http://prometheus:9090
(如果Grafana和Prometheus运行在同一个Docker网络中,可以使用容器名称作为主机名。否则,需要使用Prometheus的IP地址)。 - 点击
Save & Test
。如果显示Data source is working
,说明数据源配置成功。
- 点击左侧导航栏的
-
创建仪表盘:
- 点击左侧导航栏的
+
->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 的告警,然后根据配置的规则,发送告警通知。
-
配置Prometheus告警规则:
在
prometheus.yml
文件中,添加rule_files
配置项,指定告警规则文件的路径。rule_files: - /path/to/your/alert.rules.yml
-
创建告警规则文件
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
:告警的注释,包含告警的摘要和描述。
-
配置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,将告警发送到不同的地方。- 可以配置邮件、企业微信、钉钉等多种告警方式。
-
-
测试告警:
可以通过手动调整MySQL服务器的负载,或者修改Prometheus告警规则,触发告警。
总结: 监控是保障数据库稳定运行的基石
今天我们学习了如何使用Prometheus和Grafana监控MySQL性能指标。通过合理的配置和使用,可以及时发现并解决潜在的性能问题,保障数据库的稳定高效运行。当然,这只是监控的开始,需要不断学习和实践,才能更好地掌握监控技术,提升运维能力。
希望本次讲座对大家有所帮助!