MySQL 数据库监控接入

更新时间:
复制 MD 格式

本文介绍如何将自建 MySQL / MariaDB 接入云监控 2.0。接入组件基于 aio-exporter 的 MySQL(mysqld)适配采集指标,覆盖连接、QPS、InnoDB 缓冲池、主从复制与慢查询等观测场景,支持 ACK 集群(CS)与 ECS(VPC) 两种部署环境。接入后自动生成 MySQL 实例实体、内置大盘与告警规则。

支持的中间件条件

接入前请确认目标实例满足以下条件,否则可能出现采集不到数据或指标缺失。

条件项

要求

数据库版本

MySQL ≥ 5.6、MariaDB ≥ 10.3(E2E 验证 MySQL 8.0)。采集项按版本分级门控(5.1—8.0),版本越低可用采集项越少:perf_schema 相关需 5.6+,sys_user_summary、innodb_sys_tablespaces 需 5.7+,Group Replication Applier Worker 需 8.0

部署形态

自建 MySQL / MariaDB / Percona。云托管实例(如阿里云 RDS MySQL)在满足账号与网络条件时同样可接入,接入时把「云厂商 / 部署来源」选为对应云厂商即可

监控账号

需专用只读账号,具备 PROCESS、REPLICATION CLIENT、SELECT ON *.* 权限。不建议直接使用 root

连接方式

以 user:password@tcp(host:port)/ 形式连接,默认不启用 TLS。若实例开启了 require_secure_transport(强制加密连接),当前接入方式无法连接

网络连通

Exporter 需能直连数据库端口(默认 3306)。CS 环境要求目标 MySQL 可在所选 ACK 集群网络内连通;ECS(VPC) 环境要求托管探针交换机网段可访问目标 ECS。安全组、白名单需放行对应出口地址

采集开销

默认开启 global_status、global_variables、slave_status、innodb_metrics 四项,开销较低。可选追加的 processlist、表级统计、performance_schema 类采集项在大实例上开销明显,请按需开启

前提条件

  • 已开通可观测监控Prometheus版。

  • 接入 CS 环境:目标 ACK 集群已接入云监控 2.0,且集群状态为运行中;目标 MySQL 服务可在该集群网络内连通。

  • 接入 ECS(VPC) 环境:已选定目标 MySQL 所在 ECS,并确保托管探针交换机网段可访问该 ECS。

费用说明

  • 根据产生的指标数据量,在 Prometheus 产品中计费。无其他费用。

接入方法

步骤一:创建监控账号

在目标数据库上执行以下 SQL,创建专用监控账号并授权(MAX_USER_CONNECTIONS 限制监控账号占用的连接数,避免影响业务):

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

权限

用途

PROCESS

读取进程列表与全局状态

REPLICATION CLIENT

读取主从复制状态

SELECT

读取 information_schema / performance_schema 等元数据

步骤二:选择接入环境

本插件支持 CS 与 ECS(VPC) 两种接入环境,工作原理不同,请按 MySQL 实际部署位置选择:

CS(容器服务)

  • 将 Exporter 安装到用户指定的目标 ACK 集群,并复用该集群已有的采集器进行指标采集。

  • 观测对象为 ACK 集群。

  • 网络要求:目标 MySQL 服务可在该集群网络内连通即可(例如集群内 Service,或集群能访问到的 VPC 内网地址)。

ECS(VPC)

  • 选择目标 MySQL 服务部署的 ECS 机器,系统根据该 ECS 的 VPC 信息部署全托管采集器。

  • 不会在 ECS 上安装任何进程。

  • 观测对象为 ECS 实例。

  • 网络要求:托管探针所在交换机网段需允许访问目标 ECS(安全组、ACL 等需放行)。

环境

Exporter 部署位置

是否在业务机上装进程

观测对象

网络通达要求

CS

用户指定的 ACK 集群

否(部署在集群内,不占用业务 Pod 宿主)

ACK 集群

MySQL 可在该集群网络内连通

ECS(VPC)

系统按 VPC 部署的全托管采集器

否,不在 ECS 上安装任何进程

ECS 实例

托管探针交换机网段可访问目标 ECS

步骤三:接入配置

  1. 登录云监控2.0控制台,选择目标工作空间后,在左侧导航栏单击 接入中心 ,单击 MySQL 开始接入。

  2. 选择接入环境(CS 或 ECS(VPC)),并在下拉列表中选择 观测对象 。

  3. 接入配置,配置完成后单击 确定 :

    配置项

    是否必填

    说明

    MySQL 服务地址

    是

    CS 环境填写集群内访问地址,如 mysql-server.<namespace>;ECS(VPC) 环境填写内网或公网访问地址

    MySQL 服务端口

    是

    默认 3306

    云厂商 / 部署来源

    否

    写入指标标签 provider 并参与实体发现,自建选择「自建」(self-hosted/mysql),云托管选择对应云厂商

    网络连通性测试

    —

    仅 CS 环境提供,用于验证 Exporter 与数据库之间的网络连通性

    MySQL 账号

    是

    步骤一创建的监控账号,默认 exporter

    MySQL 密码

    是

    监控账号对应的密码

    Metric 采集间隔(秒)

    是

    默认 15,取值范围 1—60

    额外采集项

    否

    在默认四项之外追加采集项,可多选。processlist、表级统计与 performance_schema 类开销较大,建议按需开启

    自定义标签

    否

    注入到指标上的额外标签,便于按业务维度筛选

    使用公网镜像地址

    否

    默认关闭走 VPC 内网镜像仓库;无法访问内网镜像仓库时开启

  4. 接入成功后,可在 实体探索 查看接入的实体及相关可观测数据。

数据使用说明

实体说明

接入后,云监控每 3 分钟从 mysql_up 指标的标签中发现一次 MySQL 实例,并生成中间件实体:

维度

说明

域(domain)

middleware

实体类型

middleware.mysql

实体过滤条件

.entity with(domain='middleware', type='middleware.mysql')

观测对象(绑定实体)

CS 环境为 acs.ack.cluster;ECS(VPC) 环境为 acs.ecs.instance

实体字段来自采集标签,与安装次数无关:

字段

说明

instance_id

实例标识,取自 target_uri 标签,格式为 host:port

provider

部署来源,如 self-hosted/mysql、alibaba-cloud/rds

port

数据库端口

region_id

地域

env_type

部署环境类型(CS / ECS)

cluster_id

所属集群标识

可在 实体探索 或 中间件洞察 应用中按上述字段检索实例。

内置大盘

大盘名称

查看入口

说明

MySQL 概览(实例概览)

实体详情页 实例概览 页签

UModel 大盘,随实例上下文自动绑定 target_uri、provider 变量

MySQL 概览 / MySQL Overview

Grafana 大盘列表

Grafana 大盘,提供中英文两套

核心指标

以下为实体数据集 middleware.metric.mysql 的完整指标清单(共 57 个),可在实体详情、大盘与告警中直接使用:

指标名

类型

单位

显示名

说明

mysql_up

gauge

-

MySQL 存活

MySQL/MariaDB 实例是否可达且采集成功。1 表示存活,0 表示不可用。

mysql_uptime

gauge

秒

运行时间

MySQL 服务进程自启动以来运行的秒数。

mysql_qps

counter

次/秒

每秒查询数

客户端执行语句的每秒查询数(Questions,不含 COM_PING / COM_STATISTICS 等)。

mysql_queries_s

counter

次/秒

每秒查询总数

每秒执行的语句总数,包含存储程序内部语句(Queries)。

mysql_threads_connected

gauge

-

已连接线程数

当前已连接到服务器的客户端线程数。

mysql_threads_running

gauge

-

运行中线程数

当前正在执行语句的非空闲线程数。

mysql_slow_queries_s

counter

次/秒

每秒慢查询数

执行时间超过 long_query_time 的慢查询速率(每秒)。

mysql_buffer_pool_size

gauge

字节

InnoDB 缓冲池大小

已配置的 InnoDB 缓冲池大小(字节,innodb_buffer_pool_size)。

mysql_connection_usage

gauge

%

连接使用率

当前已连接线程数占 max_connections 的百分比。

mysql_max_used

gauge

-

最大已用连接数

自上次 FLUSH STATUS 或服务重启以来同时连接数的历史峰值。

mysql_max_connections

gauge

-

最大连接数

允许的最大并发客户端连接数(max_connections)。

mysql_cached

gauge

-

缓存线程数

当前线程缓存中空闲、可复用的线程数。

mysql_created_s

counter

次/秒

每秒新建线程数

为处理连接而新建线程的速率(偏高时可能表示 thread_cache_size 偏小)。

mysql_aborted_connects

counter

-

中止连接次数

连接失败次数的速率(如认证失败、主机被拒绝等)。

mysql_aborted_clients

counter

-

中止客户端数

客户端未正常关闭连接导致的中止连接速率。

mysql_connection_errors

counter

-

连接错误数

按错误类型汇总的连接错误速率(如 max_connections、accept、internal 等)。

mysql_top_command_counters

counter

-

Top 命令计数

按命令类型统计的 Top 10 COM_* 命令执行速率。

mysql_handlers

counter

-

Handler 请求

按 Handler 类型统计的 Top 10 存储引擎 Handler 请求速率(如 read_next、write、update)。

mysql_full_join

counter

-

全表 JOIN

对第一张表做全表扫描的 JOIN 速率(Select_full_join,通常表示缺少索引)。

mysql_full_range_join

counter

-

全范围 JOIN

对参考表使用范围搜索的 JOIN 速率(Select_full_range_join)。

mysql_range

counter

-

范围查询

在第一张表上使用范围扫描的 JOIN 速率(Select_range)。

mysql_range_check

counter

-

范围检查查询

每行后检查键使用情况的 JOIN 速率(Select_range_check,通常对性能不友好)。

mysql_scan

counter

-

全表扫描

对第一张表做全表扫描的查询速率(Select_scan)。

mysql_sort_rows

counter

-

排序行数

参与排序的行数速率(Sort_rows)。

mysql_sort_range

counter

-

范围排序

使用范围的排序速率(Sort_range)。

mysql_sort_merge_passes

counter

-

排序归并次数

排序归并趟数速率;偏高时可能需要增大 sort_buffer_size。

mysql_sort_scan

counter

-

扫描排序

通过扫描表完成的排序速率(Sort_scan)。

mysql_tmp_tables

counter

-

临时表创建数

内存中创建内部临时表的速率(Created_tmp_tables)。

mysql_tmp_disk_tables

counter

-

磁盘临时表创建数

在磁盘上创建内部临时表的速率(Created_tmp_disk_tables);相对内存临时表占比偏高时需调优。

mysql_tmp_files

counter

-

临时文件创建数

服务器创建临时文件的速率(Created_tmp_files)。

mysql_immediate

counter

-

立即表锁数

立即获得表锁的速率(Table_locks_immediate)。

mysql_waited

counter

-

等待表锁数

需要等待的表锁速率(Table_locks_waited);偏高表示锁竞争。

mysql_received

counter

字节

接收流量

每秒从所有客户端接收的字节数。

mysql_sent

counter

字节

发送流量

每秒发送给所有客户端的字节数。

mysql_data

gauge

-

缓冲池页数

InnoDB 缓冲池中的页数量(按页状态区分时有相应维度)。

mysql_dirty

gauge

-

缓冲池脏页数

InnoDB 缓冲池中当前待刷盘的脏页数量。

mysql_innodb_row_operations

counter

次/秒

InnoDB 行操作

按操作类型汇总的 InnoDB 行操作速率(read/insert/update/delete)。

mysql_read

counter

-

缓冲页读取

按页类型汇总的 InnoDB 缓冲页读取速率。

mysql_written

counter

-

缓冲页写入

按页类型汇总的 InnoDB 缓冲页写入速率。

mysql_log_waits

counter

-

InnoDB 日志等待

等待 InnoDB redo 日志缓冲区空间的速率(Innodb_log_waits);偏高时可能需要增大 innodb_log_buffer_size。

mysql_open_files

gauge

-

打开文件数

服务器当前已打开的文件数量。

mysql_open_files_limit

gauge

-

打开文件上限

服务器允许打开的文件描述符上限(open_files_limit)。

mysql_opened_files_s

counter

次/秒

每秒打开文件数

服务器打开文件的速率;持续偏高可能表示表/文件缓存不足。

mysql_open_tables

gauge

-

打开表数

当前表缓存中已打开的表数量。

mysql_table_open_cache

gauge

-

表打开缓存

已配置的表打开缓存大小(table_open_cache)。

mysql_opened_tables_s

counter

次/秒

每秒打开表数

打开表的速率;相对已打开表数偏高时可能需要增大 table_open_cache。

mysql_cache_hits

counter

-

表缓存命中

表打开缓存命中速率(表已在缓存中)。

mysql_cache_misses

counter

-

表缓存未命中

表打开缓存未命中速率(需重新打开表)。

mysql_process_states

gauge

-

进程状态分布

按线程状态汇总的 PROCESSLIST 线程数。

mysql_user

gauge

-

按用户分布连接

按 MySQL 用户汇总的 PROCESSLIST 线程数。

mysql_cmd

gauge

-

按命令分布连接

按当前命令汇总的 PROCESSLIST 线程数(如 Sleep、Query)。

mysql_io_running

gauge

-

副本 IO 线程状态

副本 I/O 线程是否在运行(1/Yes)。适用于副本实例。

mysql_sql_running

gauge

-

副本 SQL 线程状态

副本 SQL 线程是否在运行(1/Yes)。适用于副本实例。

mysql_seconds_behind_master

gauge

秒

主从延迟秒数

相对主库的复制延迟秒数(Seconds_Behind_Master/Seconds_Behind_Source)。

mysql_relay_log_space

gauge

-

中继日志空间

副本上中继日志(relay log)的总大小(字节)。

mysql_collector_success_duration

gauge

-

Collector 采集成功

各 mysqld_exporter Collector 采集是否成功(1 成功,0 失败)。

mysql_duration

gauge

秒

Collector 采集耗时

各 mysqld_exporter Collector 最近一次采集耗时(秒)。

除上述 MetricSet 聚合指标外,Exporter 采集的原始指标(mysql_*、mysql_global_status_*、mysql_slave_status_* 等)均写入 Prometheus 存储,可直接用 PromQL 查询。

常用查询示例

# 实例 QPS
sum by (target_uri) (rate(mysql_global_status_questions[5m]))

# 连接使用率(%)
100 * mysql_global_status_threads_connected / clamp_min(mysql_global_variables_max_connections, 1)

# 每秒慢查询数
sum by (target_uri) (rate(mysql_global_status_slow_queries[5m]))

# InnoDB 缓冲池命中率(%)
100 * (1 - rate(mysql_global_status_innodb_buffer_pool_reads[5m])
        / clamp_min(rate(mysql_global_status_innodb_buffer_pool_read_requests[5m]), 1))

# 主从复制延迟(秒)
mysql_slave_status_seconds_behind_master

告警模板

接入后以下告警规则自动生效,无需手动配置。CS 与 ECS(VPC) 两个环境的规则一致。告警级别 P1 对应 critical(严重),P2 对应 warning(警告)。

告警名称

级别

PromQL 表达式

持续时间

说明

MySQLDown

P1(严重)

mysql_up != 1

5m

实例不可用

MySQLReplicationNotRunning

P1(严重)

mysql_slave_status_slave_io_running == 0 or mysql_slave_status_slave_sql_running == 0

2m

复制 IO 或 SQL 线程停止

MySQLReplicationLag

P1(严重)

(instance:mysql_slave_lag_seconds > 30) and on(instance) (predict_linear(instance:mysql_slave_lag_seconds[5m], 60 * 2) > 0)

1m

复制延迟持续扩大且未恢复

MySQLHeartbeatLag

P1(严重)

(instance:mysql_heartbeat_lag_seconds > 30) and on(instance) (predict_linear(instance:mysql_heartbeat_lag_seconds[5m], 60 * 2) > 0)

1m

心跳延迟持续扩大且未恢复

MySQLNotReady

P2(警告)

mysql_global_status_wsrep_ready != 1

5m

Galera 集群节点未就绪

MySQLOutOfSync

P2(警告)

(mysql_global_status_wsrep_local_state != 4 and mysql_global_variables_wsrep_desync == 0)

5m

Galera 集群节点不同步

MySQLDonorFallingBehind

P2(警告)

(mysql_global_status_wsrep_local_state == 2 and mysql_global_status_wsrep_local_recv_queue > 100)

5m

捐赠节点落后,接收队列积压

MySQLInnoDBLogWaits

P2(警告)

rate(mysql_global_status_innodb_log_waits[15m]) > 10

—

InnoDB 日志写入等待磁盘

MySQLNotReady、MySQLOutOfSync、MySQLDonorFallingBehind 依赖 Galera(wsrep)相关指标,仅在 Galera / PXC 集群上生效。

存储策略说明

接入 MySQL 后,云监控会创建对应的存储实例用于存储可观测数据。

数据类型

默认存储位置

备注

指标

Prometheus 实例:RegionShare:{{workspaceName}}:{{regionId}}

关联数据集 middleware.metric.mysql,按 instance_id='<host>:<port>' 过滤

卸载或修改接入策略

如果期望取消或修改 MySQL 的接入,可以在 接入中心 的 接入管理 页,找到对应的接入策略,进行 编辑 或 删除 。删除接入策略后,Exporter 与采集配置一并移除,已写入的历史指标按存储的生命周期策略保留。