
MySQL Server 导出器
在本页
简介
以下快速入门指南提供了 MySQL 导出器的设置说明以及预配置的仪表盘、告警规则和记录规则。完成本快速入门指南中的步骤后,你将能够:
设置并配置 MySQL 导出器以收集 MySQL 指标,例如每秒查询次数 (QPS) 和 InnoDB 缓冲池大小。MySQL 导出器将以 Prometheus 风格的指标格式公开这些数据。
配置 Prometheus 抓取 MySQL 导出器指标,并可选择将其发送到 Grafana Cloud。
设置一组预配置和精选的记录规则,用于缓存常用查询。
导入 Grafana 仪表盘以可视化你的指标数据。
设置 Prometheus 告警规则以对你的指标数据进行告警。
指标使用量
默认情况下,此导出器发布大约 1000 个 Prometheus 时序。要查看此导出器默认发布的指标列表,请在此此处下载指标抓取样本。
请注意,根据配置,MySQL 导出器可能会收集和发布远超默认集合的指标。要了解有关配置 MySQL 导出器以及启用/禁用其收集器的更多信息,请参阅 MySQL 导出器GitHub 仓库。
除了切换 MySQL 导出器的设置外,你还可以通过删除不需要存储在 Prometheus 或 Grafana Cloud 中的时序来减少指标使用量。要了解如何操作,请参阅使用 Relabeling 减少 Prometheus 指标使用量(来自 Grafana Cloud 文档)。
Grafana Cloud 的 Linux Node 集成
如果你正在使用 Grafana Cloud,可以通过安装 MySQL 集成来跳过本指南中的所有步骤,该集成旨在通过几个命令和点击帮助你快速启动和运行。免费注册。
要了解如何使用 MySQL 集成获取 MySQL 指标,请参阅MySQL 集成(来自 Grafana Cloud 文档)。
在本页
MySQL 导出器快速入门
在本指南中,你将学习如何设置和配置 MySQL Server 导出器,以收集诸如每秒查询次数 (QPS) 和 InnoDB 缓冲池大小等 MySQL 指标,并将它们以 Prometheus 风格的指标格式公开。然后,你将配置 Prometheus 以抓取 MySQL 指标,并可选择将其发送到 Grafana Cloud。最后,你将设置一组预配置和精选的记录规则、Grafana 仪表盘和告警规则。在本指南结束时,你将拥有可用于可视化 MySQL Server 指标的仪表盘以及一组预配置的告警。
如果你正在使用 Grafana Cloud,MySQL 集成可以帮助你快速启动并运行。MySQL 集成将 MySQL 导出器嵌入到 Grafana Cloud Agent 中,并自动配置告警规则和仪表盘,因此你无需执行本指南中的步骤。要了解如何使用 MySQL 集成进行设置,请参阅MySQL 集成(来自 Grafana Cloud 文档)。
先决条件
在你开始之前,你应该具备以下条件:
- 一台与 MySQL Server 导出器版本兼容的机器。要查看可用版本列表,请参阅发布版本。
- 你的机器上运行着 MySQL。要了解有关安装和运行 MySQL 的更多信息,请参阅 MySQL 安装指南。
- 在你的环境中或直接在机器上运行着 Prometheus。要了解如何安装 Prometheus,请参阅安装(来自 Prometheus 文档)。
- 在你的环境中或直接在机器上运行着 Grafana。要了解如何安装 Grafana,请参阅安装 Grafana(来自 Grafana 文档)。
- (可选)一个 Grafana Cloud 账户。Grafana Cloud 托管 Grafana 和一个 Mimir-基于 Prometheus 指标端点。你仍然需要抓取指标,可以使用在你的环境中安装的 Prometheus,或者 Grafana Cloud Agent。要了解有关 Grafana Cloud 的更多信息,请参阅Grafana Cloud。
步骤 1:设置 MySQL Server 导出器
在此步骤中,你将在你的机器上设置 MySQL Server 导出器,以收集和公开 Prometheus 格式的 MySQL 指标。本指南使用带有 MySQL 8.0.23 的 Ubuntu 20.04 系统。具体步骤可能因你的操作系统和 MySQL 版本而略有不同。
首先,登录你的机器并下载相应的 MySQL 导出器二进制文件。本指南使用 linux-amd64
二进制文件,但你应该选择与你的系统操作系统和架构对应的文件:
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.12.1/mysqld_exporter-0.12.1.linux-amd64.tar.gz
将 v0.12.1.linux-amd64
替换为你想要安装的版本。本指南可能会过时,因此最好查看 MySQL 导出器发布版本页面以获取最新的稳定版本。
解压 tarball 并 cd
进入目录:
tar xvfz mysqld_exporter-*.*-amd64.tar.gz
cd mysqld_exporter-*.*-amd64
在运行 MySQL 导出器之前,首先需要创建它用于获取数据库指标的 MySQL 用户。登录到你的 MySQL 数据库,并以具有管理权限的用户身份运行以下命令:
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'enter_password_here' WITH MAX_USER_CONNECTIONS 3;
Query OK, 0 rows affected (0.03 sec)
注意:建议为导出器用户设置最大连接数限制,以避免在重负载下因监控抓取而使服务器过载。并非所有 MySQL/MariaDB 版本都支持此功能;例如,MariaDB 10.1(Ubuntu 18.04 提供)不*支持*此功能。
接下来,为这个新用户授予适当的权限来获取数据库指标:
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
Query OK, 0 rows affected (0.02 sec)
现在你已经创建了导出器 MySQL 用户,就可以测试导出器了。
设置以下环境变量:
export DATA_SOURCE_NAME='exporter:enter_password_here@(mysql_hostname:3306)/'
请务必将 exporter
替换为你上面创建的用户,将 enter_password_here
替换为你定义的密码,并将 mysql_hostname
替换为 MySQL 实例的主机名(如果你在同一台机器上,则为 localhost
)。
最后,运行导出器:
./mysqld_exporter
INFO[0000] Starting mysqld_exporter (version=0.12.1, branch=HEAD, revision=48667bf7c3b438b5e93b259f3d17b70a7c9aff96) source="mysqld_exporter.go:257"
INFO[0000] Build context (go=go1.12.7, user=root@0b3e56a7bc0a, date=20190729-12:35:58) source="mysqld_exporter.go:258"
INFO[0000] Enabled scrapers: source="mysqld_exporter.go:269"
INFO[0000] --collect.slave_status source="mysqld_exporter.go:273"
INFO[0000] --collect.global_status source="mysqld_exporter.go:273"
INFO[0000] --collect.global_variables source="mysqld_exporter.go:273"
INFO[0000] --collect.info_schema.query_response_time source="mysqld_exporter.go:273"
INFO[0000] --collect.info_schema.innodb_cmp source="mysqld_exporter.go:273"
INFO[0000] --collect.info_schema.innodb_cmpmem source="mysqld_exporter.go:273"
INFO[0000] Listening on :9104 source="mysqld_exporter.go:283"
如果你看到上面的输出,说明你成功运行了 MySQL Server 导出器。
MySQL 导出器在端口 9104
上以 Prometheus 格式发布 MySQL 指标。你可以使用 curl
进行测试。你需要打开一个新的 SSH 会话或将 MySQL 导出器进程放到后台才能使用 curl
。
curl https://:9104/metrics
. . .
process_resident_memory_bytes 1.2079104e+07
# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
# TYPE process_start_time_seconds gauge
process_start_time_seconds 1.61377616023e+09
# HELP process_virtual_memory_bytes Virtual memory size in bytes.
# TYPE process_virtual_memory_bytes gauge
process_virtual_memory_bytes 1.16355072e+08
# HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes.
# TYPE process_virtual_memory_max_bytes gauge
process_virtual_memory_max_bytes -1
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
# TYPE promhttp_metric_handler_requests_in_flight gauge
promhttp_metric_handler_requests_in_flight 1
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
# TYPE promhttp_metric_handler_requests_total counter
promhttp_metric_handler_requests_total{code="200"} 1
promhttp_metric_handler_requests_total{code="500"} 0
promhttp_metric_handler_requests_total{code="503"} 0
如果你看到上面的输出,说明你已准备好使用 Prometheus 抓取 MySQL 指标。
为了避免从命令行运行和管理 MySQL 导出器,你可以创建一个 systemd
服务。要了解如何操作,请参阅创建 Systemd 服务管理 Agent。将 Agent 二进制文件的路径替换为 MySQL 导出器的路径。
你可以使用一个 my.cnf
文件来设置 MySQL 导出器将使用的用户名和密码。此外,导出器提供了许多标志来配置抓取哪些指标以及发布到何处。要了解这些功能的更多信息,请参阅MySQL 导出器 GitHub 仓库。
步骤 2:使用 Prometheus 抓取 MySQL 导出器
现在 MySQL 导出器已在你的机器上启动并运行,你可以配置一个 Prometheus 抓取任务来收集和存储 MySQL 导出器指标。
将以下抓取任务配置添加到你的 scrape_configs
部分的 prometheus.yml
配置文件中:
- job_name: mysql
static_configs:
- targets: ['mysql_exporter_machine_IP_address:9104']
请务必将 mysql_exporter_machine_IP_address
替换为运行 MySQL 导出器的机器的 IP 地址。如果你在同一台机器上运行 Prometheus,这将是 localhost
。要了解有关配置 Prometheus 的更多信息,请参阅配置(来自 Prometheus 文档)。
如果你没有 prometheus.yml
配置文件,可以使用你喜欢的文本编辑器创建一个简单的。打开你偏好的文本编辑器并粘贴以下 Prometheus 配置:
global:
scrape_interval: 15s
scrape_configs:
- job_name: mysql
static_configs:
- targets: ['mysql_exporter_machine_IP_address:9104']
此配置告诉 Prometheus 每 15 秒抓取所有任务。唯一配置的抓取任务叫做 mysql
,并定义了一个 mysql_exporter_machine_IP_address:9104
目标。默认情况下,Prometheus 将使用 HTTP 抓取 /metrics
端点。
保存并关闭文件。然后,你可以使用以下命令运行 Prometheus 并指定该文件:
./prometheus --config.file=./prometheus.yml
将指标发送到 Grafana Cloud
要将 MySQL 导出器指标从 Prometheus 发送到 Grafana Cloud,请在你的 prometheus.yml
配置文件中配置 remote_write
参数。要了解更多信息,请参阅指标 — Prometheus(来自 Grafana Cloud 文档)。要了解有关 remote_write
参数的更多信息,请参阅remote_write
(来自 Prometheus 文档)。
步骤 3:配置记录规则
使用记录规则,你可以预计算和缓存经常查询的指标。例如,如果仪表盘面板使用计算密集型查询,如 rate()
,你可以创建一个记录规则,该规则以固定的、较小的间隔运行,并将密集型查询的结果保存在新的时序中。这避免了每次仪表盘刷新时都抓取和计算数据。要了解有关 Prometheus 记录规则的更多信息,请参阅记录规则(来自 Prometheus 文档)。
在加载本指南中的仪表盘之前,你应该先加载以下记录规则。仪表盘查询和告警规则使用记录规则来减少 Prometheus 或 Grafana Cloud 指标服务器的负载,具体取决于你在何处评估规则。
你可以在此处获取记录规则 YAML 文件。
此记录规则 YAML 文件是使用 MySQL 导出器mixin生成的。
将记录规则加载到 Prometheus 中
要将记录规则加载到 Prometheus 中,将以下内容添加到你的 prometheus.yml
配置文件中:
rule_files:
- "mysql_exporter_recording_rules.yml"
请务必将 mysql_exporter_recording_rules.yml
替换为你的 MySQL 导出器记录规则 YAML 文件路径。
将记录规则加载到 Grafana Cloud 中
要了解如何将记录规则加载到 Grafana Cloud 中,请参阅使用 cortextool 加载 Prometheus 和 Loki 规则。
步骤 4:配置仪表盘
本快速入门指南包含一个仪表盘:MySQL 概览。
要了解如何将此仪表盘导入 Grafana,请参阅导入仪表盘(来自 Grafana 文档)。
仪表盘查询依赖于上一步定义的记录规则。请务必在导入仪表盘之前导入这些规则。
你可以在此处获取仪表盘。
步骤 5:配置告警
使用 Prometheus 告警规则,你可以定义当 PromQL 表达式超出某个阈值或在一段时间内满足指定条件时触发的告警。例如,你可以定义一个 HighRequestLatency
告警,当请求延迟指标在一段时间内大于某个阈值时触发。告警条件一旦触发,告警将进入 Pending
状态。在满足由 for
parameter 定义的时间段后,告警将进入 Firing
状态。你可以使用诸如 Alertmanager 之类的工具配置触发中告警的路由和通知。Alertmanager 也内置于 Grafana Cloud 中。
你可以在此处获取告警规则 YAML 文件。
将告警规则加载到 Prometheus 中
要将告警规则加载到 Prometheus 中,将以下内容添加到你的 prometheus.yml
配置文件中:
rule_files:
- "mysql_exporter_alerting_rules.yml"
请务必将 mysql_exporter_alerting_rules.yml
替换为你的 MySQL 告警规则 YAML 文件路径。
将告警规则加载到 Grafana Cloud 中
要了解如何将告警规则加载到 Grafana Cloud 中,请参阅使用 cortextool 加载 Prometheus 和 Loki 规则。
结论
在本快速入门指南中,你在 Linux 机器上安装并运行了 MySQL 导出器。然后,你配置了 Prometheus 来抓取 MySQL 导出器公开的数据库和 MySQL 集群指标。你将记录规则和告警规则加载到 Prometheus 中,最后导入 Grafana 仪表盘以可视化你的 MySQL 指标。
如果你正在使用 Grafana Cloud,可以通过使用 Grafana Cloud Agent 安装 MySQL 集成来跳过本指南中的所有步骤。此集成将预配置的 MySQL 导出器嵌入到 Agent 中,并自动配置 Grafana 仪表盘以及 Prometheus 告警和记录规则,因此你无需手动导入它们。要了解如何设置 MySQL 集成,请参阅Grafana Cloud 集成。
仪表盘、记录规则和告警规则是使用 MySQL 导出器 Mixin 生成的。Mixins 是由主题专家精心策划和设计的可复用模板,用于仪表盘、记录规则和告警。要了解更多信息,请参阅MySQL Mixin 仓库。
在本页
在加载本指南中的仪表盘之前,你应该先加载以下记录规则。仪表盘查询使用记录规则来减少 Prometheus 或 Grafana Cloud 指标服务器的负载,具体取决于你在何处评估规则。
本快速入门指南包含以下记录规则:
记录: instance:mysql_slave_lag_seconds
- PromQL:
mysql_slave_status_seconds_behind_master - mysql_slave_status_sql_delay
- PromQL:
instance:mysql_heartbeat_lag_seconds
- PromQL:
mysql_heartbeat_now_timestamp_seconds - mysql_heartbeat_stored_timestamp_seconds
- PromQL:
job:mysql_transactions:rate5m
- PromQL:
sum without (command) (rate(mysql_global_status_commands_total{command=~"(commit|rollback)"}[5m]))
- PromQL:
groups:
- name: mysqld_rules
rules:
- expr: mysql_slave_status_seconds_behind_master - mysql_slave_status_sql_delay
record: instance:mysql_slave_lag_seconds
- expr: mysql_heartbeat_now_timestamp_seconds - mysql_heartbeat_stored_timestamp_seconds
record: instance:mysql_heartbeat_lag_seconds
- expr: sum without (command) (rate(mysql_global_status_commands_total{command=~"(commit|rollback)"}[5m]))
record: job:mysql_transactions:rate5m
此记录规则 YAML 文件是使用 MySQL 导出器mixin生成的。
在本页
注意:这些仪表盘可能依赖于上一个标签页中的记录规则。请务必在导入仪表盘之前导入这些规则。
MySQL 概览仪表盘
此仪表盘包含以下指标面板:
- 运行时长
- 当前 QPS
- InnoDB 缓冲池
- MySQL 连接数
- MySQL 客户端线程活动
- MySQL 问题数
- MySQL 线程缓存
- MySQL 临时对象
- MySQL Select 类型
- MySQL 排序
- MySQL 慢查询
- MySQL 中止连接
- MySQL 表锁
- MySQL 网络流量
- MySQL 内部内存概览
- 热门命令计数器
- MySQL Handlers
- MySQL 事务 Handlers
- 进程状态
- 小时热门进程状态
- MySQL 查询缓存内存
- MySQL 查询缓存活动
- MySQL 文件打开次数
- MySQL 打开文件数
- MySQL 表打开缓存状态
- MySQL 打开表数
- MySQL 表定义缓存
你可以使用以下仪表盘 ID 直接导入仪表盘:14057
。
你可以在此处获取仪表盘 JSON 文件。
此仪表盘是使用 MySQL 导出器mixin生成的。
在本页
本快速入门指南包含以下告警规则:
MySQLDown
在 [instance] 上的 MySQL [job] 未运行。
MySQLGaleraNotReady
在 [instance] 上的 [job] 未准备好。
MySQLGaleraOutOfSync
在 [instance] 上的 [job] 未同步。
MySQLGaleraDonorFallingBehind
在 [instance] 上的 [job] 是捐赠者 (hotbackup) 并且正在落后(队列大小 [value])。
MySQLReplicationNotRunning
从属复制(IO 或 SQL)已中断超过 2 分钟。
MySQLReplicationLag
MySQL 从属复制已落后且未恢复。
MySQLInnoDBLogWaits
innodb 日志正在以 [value] / 秒 的速率等待磁盘。
###
# Sample prometheus rules/alerts for mysqld.
#
# NOTE: Please review these carefully as thresholds and behavior may not meet
# your SLOs or labels.
#
###
groups:
- name: MySQLdAlerts
rules:
- alert: MySQLDown
annotations:
description: MySQL {{$labels.job}} on {{$labels.instance}} is not up.
summary: MySQL not up
expr: mysql_up != 1
for: 5m
labels:
severity: critical
- name: GaleraAlerts
rules:
- alert: MySQLGaleraNotReady
annotations:
description: '{{$labels.job}} on {{$labels.instance}} is not ready.'
summary: Galera cluster node not ready
expr: mysql_global_status_wsrep_ready != 1
for: 5m
labels:
severity: warning
- alert: MySQLGaleraOutOfSync
annotations:
description: '{{$labels.job}} on {{$labels.instance}} is not in sync ({{$value}} != 4).'
summary: Galera cluster node out of sync
expr: (mysql_global_status_wsrep_local_state != 4 and mysql_global_variables_wsrep_desync == 0)
for: 5m
labels:
severity: warning
- alert: MySQLGaleraDonorFallingBehind
annotations:
description: '{{$labels.job}} on {{$labels.instance}} is a donor (hotbackup) and is falling behind (queue size {{$value}}).'
summary: xtradb cluster donor node falling behind
expr: (mysql_global_status_wsrep_local_state == 2 and mysql_global_status_wsrep_local_recv_queue > 100)
for: 5m
labels:
severity: warning
- alert: MySQLReplicationNotRunning
annotations:
description: Slave replication (IO or SQL) has been down for more than 2 minutes.
summary: Slave replication is not running
expr: mysql_slave_status_slave_io_running == 0 or mysql_slave_status_slave_sql_running == 0
for: 2m
labels:
severity: critical
- alert: MySQLReplicationLag
annotations:
description: The mysql slave replication has fallen behind and is not recovering
summary: MySQL slave replication is lagging
expr: (instance:mysql_slave_lag_seconds > 30) and on(instance) (predict_linear(instance:mysql_slave_lag_seconds[5m], 60 * 2) > 0)
for: 1m
labels:
severity: critical
- alert: MySQLReplicationLag
annotations:
description: The mysql slave replication has fallen behind and is not recovering
summary: MySQL slave replication is lagging
expr: (instance:mysql_heartbeat_lag_seconds > 30) and on(instance) (predict_linear(instance:mysql_heartbeat_lag_seconds[5m], 60 * 2) > 0)
for: 1m
labels:
severity: critical
- alert: MySQLInnoDBLogWaits
annotations:
description: The innodb logs are waiting for disk at a rate of {{$value}} / second
summary: MySQL innodb log writes stalling
expr: rate(mysql_global_status_innodb_log_waits[15m]) > 10
labels:
severity: warning
此告警规则 YAML 文件是使用 MySQL 导出器mixin生成的。
在本页
Grafana Cloud 附带一套不断扩展的集成,可在数分钟内快速启动并运行可观测性技术栈。内置于 Grafana Cloud Agent 中的 MySQL 集成暴露并抓取关键的 MySQL 指标,并将它们推送到 Grafana Cloud。Agent 将使用嵌入式 MySQL 导出器抓取指标,而 Grafana Cloud 将自动配置定制的 Grafana 仪表盘和告警,用于可视化和处理这些数据。
要了解更多信息,请查看Grafana Cloud 文档。
工作原理
配置、安装、连接和维护 Prometheus 监控组件通常需要大量的领域知识。从设置到仪表盘和告警可能需要相当长的时间。作为 Grafana 的创建者以及 Prometheus 和 Cortex 的核心贡献者,我们构建了简单的集成,以抽象掉部分工作,从而快速开始。工作原理
- 注册(或登录)一个免费的 Grafana Cloud 账户。
- 选择你想要观测的目标(不断扩展的目录)。
- 运行一行命令来安装 Grafana Cloud Agent。该 Agent 嵌入并预配置了导出器以暴露默认指标,并将它们推送到 Grafana Cloud 指标后端。
- 瞧!你将看到定制的 Grafana 仪表盘,并将受益于合理的默认告警设置。
正在寻找不同的导出器或集成?查看我们不断增长的流行组件集成库,例如 MySQL、Postgres、Redis、Memcached 等。