实现高效MySQL数据库监控:mysqld_exporter+Grafana快速部署
本文将介绍如何使用 Grafana、Prometheus 和 mysqld_exporter 来构建一个高效的监控解决方案。通过这一集成,我们可以实时监控 MySQL 数据库的性能指标,并通过 Grafana 进行可视化展示。
技术栈概述
Grafana
Grafana 是一个开源的可视化工具,支持多种数据源,能够创建动态仪表板,帮助用户更好地理解和分析数据。Grafana 提供了丰富的图表类型和自定义选项,用户可以根据需要灵活配置仪表板。
• 特点:
• 支持多种数据源(如 Prometheus、InfluxDB、MySQL 等)
• 丰富的可视化组件(折线图、柱状图、饼图等)
• 强大的告警功能
• 用户友好的界面和丰富的插件生态
Prometheus
Prometheus 是一个开源的监控系统,具有强大的时间序列数据存储和查询功能。它使用拉取模型从配置的目标中收集指标数据,适合于动态环境(如微服务架构)。
• 特点:
• 多维数据模型,支持灵活的查询语言(PromQL)
• 内置的时间序列数据库
• 易于扩展,支持自定义指标
• 提供多种可视化工具(如 Grafana)
mysqld_exporter
mysqld_exporter 是 Prometheus 的一个导出器,专门用于从 MySQL 数据库中收集性能指标。它可以提供关于查询性能、连接数、缓存命中率等多种重要指标。
• 特点:
• 支持多种 MySQL 版本
• 提供丰富的指标(如连接数、查询数、慢查询等)
• 易于配置和集成
安装和配置 mysqld_exporter
Github:https://github.com/prometheus/mysqld_exporter/releases
下载和安装
我们将使用 Docker 安装 mysqld_exporter。首先,需要创建一个 MySQL 配置文件,以便 mysqld_exporter 能够连接到数据库。可以使用以下命令创建或编辑配置文件:
vi /root/my.cnf
文件内容如下:
[client]
host=${MySQLIP}
port=3306
user=root
password=root
接下来,使用以下命令启动 mysqld_exporter:
docker run -d \
--name mysqld_exporter \
-v /root/my.cnf:/.my.cnf \
-p 9104:9104 \
prom/mysqld-exporter:latest
配置 MySQL 用户权限
如果你已经使用了有权限的用户,跳过此步骤。
为了让 mysqld_exporter 能够访问 MySQL 数据库,你需要为它创建一个专用用户并授予必要的权限:
CREATE USER 'exporter'@'%' IDENTIFIED BY 'password';
GRANT SELECT ON *.* TO 'exporter'@'%';
FLUSH PRIVILEGES;
确保在 DATA_SOURCE_NAME
中使用这个新用户的凭据。这样可以提高安全性,避免使用 root 用户。
安装和配置 Prometheus
Prometheus 安装
创建一个 prometheus.yml
配置文件,内容如下:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'mysqld_exporter'
static_configs:
- targets: ['${ip}:9104']
在这个配置中,${ip}
为mysqld_exporter
所在的服务器 IP 地址
然后运行 Prometheus:
docker run -d \
--network monitoring \
--name prometheus \
-p 9090:9090 \
-v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
配置 Prometheus 监控 mysqld_exporter
在 prometheus.yml
中添加 mysqld_exporter 的配置后,Prometheus 将定期从 mysqld_exporter 拉取数据。你可以在浏览器中访问 http://localhost:9090
来查看 Prometheus 的界面。在这里,你可以使用 PromQL 进行查询,查看当前的监控数据。
安装和配置 Grafana
Grafana 安装
运行 Grafana:
docker run -d \
--network monitoring \
--name grafana \
-p 3000:3000 \
grafana/grafana
Grafana 默认在端口 3000 上运行。
配置数据源
1. 打开浏览器,访问
http://localhost:3000
。2. 默认用户名和密码均为
admin
。3. 登录后,导航到 “Configuration” -> “Data Sources”。
4. 添加一个新的数据源,选择 Prometheus,并设置 URL 为
http://prometheus:9090
。
创建仪表板
Import dashboard
导入模板 7362,地址:https://grafana.com/grafana/dashboards/7362-mysql-overview/
导入
监控效果
监控指标详解
在 Grafana 中监控 MySQL 时,可以跟踪多个重要指标,以下是一些关键指标及其说明:
指标名称 | 中文说明 |
mysql_global_status_aborted_clients | 中止的客户端连接数 |
mysql_global_status_aborted_connects | 中止的连接数 |
mysql_global_status_connections | 总连接数 |
mysql_global_status_created_tmp_disk_tables | 创建的临时磁盘表数量 |
mysql_global_status_created_tmp_tables | 创建的临时表数量 |
mysql_global_status_handler_delete | 执行删除操作的次数 |
mysql_global_status_handler_read_first | 执行读取第一个记录的次数 |
mysql_global_status_handler_read_key | 按键读取的次数 |
mysql_global_status_handler_read_next | 执行读取下一个记录的次数 |
mysql_global_status_handler_read_prev | 执行读取上一个记录的次数 |
mysql_global_status_handler_read_rnd | 随机读取的次数 |
mysql_global_status_handler_read_rnd_next | 随机读取下一个记录的次数 |
mysql_global_status_handler_update | 执行更新操作的次数 |
mysql_global_status_key_reads | 从键缓存中读取的次数 |
mysql_global_status_key_writes | 写入键缓存的次数 |
mysql_global_status_max_connections | 最大连接数 |
mysql_global_status_open_tables | 当前打开的表数量 |
mysql_global_status_opened_tables | 打开的表总数 |
mysql_global_status_queries | 执行的查询总数 |
mysql_global_status_select_full_join | 完全连接的查询次数 |
mysql_global_status_select_full_range_join | 完全范围连接的查询次数 |
mysql_global_status_select_range | 范围查询的次数 |
mysql_global_status_select_range_check | 范围检查查询的次数 |
mysql_global_status_select_scan | 扫描查询的次数 |
mysql_global_status_slow_queries | 慢查询的总数 |
mysql_global_status_table_locks_waited | 表锁等待次数 |
mysql_global_status_threads_connected | 当前连接的线程数 |
mysql_global_status_threads_running | 当前运行的线程数 |
mysql_global_status_uptime | 数据库运行时间(秒) |
mysql_global_status_innodb_buffer_pool_size | InnoDB 缓冲池大小 |
mysql_global_status_innodb_buffer_pool_pages_total | InnoDB 缓冲池总页数 |
mysql_global_status_innodb_buffer_pool_pages_free | InnoDB 缓冲池空闲页数 |
mysql_global_status_innodb_buffer_pool_pages_dirty | InnoDB 缓冲池脏页数 |
mysql_global_status_innodb_buffer_pool_reads | InnoDB 缓冲池读取次数 |
mysql_global_status_innodb_buffer_pool_read_ahead | InnoDB 缓冲池预读取次数 |
mysql_global_status_innodb_buffer_pool_read_ahead_evicted | 被驱逐的预读取页数 |
mysql_global_status_innodb_buffer_pool_wait_free | 等待空闲页的次数 |
mysql_global_status_innodb_rows_read | 读取的 InnoDB 行数 |
mysql_global_status_innodb_rows_inserted | 插入的 InnoDB 行数 |
mysql_global_status_innodb_rows_updated | 更新的 InnoDB 行数 |
mysql_global_status_innodb_rows_deleted | 删除的 InnoDB 行数 |
mysql_global_status_innodb_transactions | InnoDB 事务总数 |
mysql_global_status_innodb_lock_waits | InnoDB 锁等待次数 |
mysql_global_status_innodb_deadlocks | InnoDB 死锁次数 |
mysql_global_status_innodb_log_waits | InnoDB 日志等待次数 |
mysql_global_status_innodb_log_write_requests | InnoDB 日志写入请求次数 |
mysql_global_status_innodb_log_writes | InnoDB 日志写入次数 |
mysql_global_status_innodb_log_flushes | InnoDB 日志刷新次数 |
mysql_global_status_innodb_log_flushes_avg_time | InnoDB 日志刷新平均时间 |
mysql_global_status_innodb_log_flushes_max_time | InnoDB 日志刷新最大时间 |
欢迎关注我的公众号“编程与架构”,原创技术文章第一时间推送。