MySQL Server Exporter:Prometheus 监控 MySQL/MariaDB 指南

MySQL Server Exporter:Prometheus 监控 MySQL/MariaDB 指南

原文https://github.com/prometheus/mysqld_exporter

说明:安装方式和配置参数以官方文档为准。源码细节请参考 GitHub 仓库。


项目简介

Prometheus 官方维护的 MySQL Server Exporter,用来采集 MySQL 和 MariaDB 的指标。

支持的数据库版本

  • MySQL >= 5.6
  • MariaDB >= 10.3

前置:创建数据库监控用户

MySQL 里创建一个专用账号,权限越小越好:

sql 复制代码
CREATE USER 'exporter'@'localhost' IDENTIFIED BY '你的密码' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';

MAX_USER_CONNECTIONS 3 限制连接数,防止 exporter 频繁采集把数据库连接池打满。PROCESS 权限用来查 SHOW PROCESSLISTREPLICATION CLIENT 用来查主从状态。


配置连接信息

配置连接的方式有这么几种:

方式一:.my.cnf 文件(推荐)

创建 .my.cnf 文件,放到 exporter 同目录或指定路径:

ini 复制代码
[client]
host = 127.0.0.1
port = 3306
user = exporter
password = 你的密码

方式二:命令行参数

bash 复制代码
--mysqld.address="127.0.0.1:3306"
--mysqld.username="exporter"

密码通过环境变量传入(避免在命令行明文显示):

bash 复制代码
export MYSQLD_EXPORTER_PASSWORD="你的密码"
./mysqld_exporter

方式三:多目标配置

多个 MySQL 实例共用一个 exporter 时,用 .my.cnf 的多节配置:

ini 复制代码
[client]
user = exporter
password = pwd1

[client.server1]
user = exporter
password = pwd2

[client.server2]
user = exporter
password = pwd3

安装方式

二进制文件

bash 复制代码
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz
tar xvf mysqld_exporter-0.15.1.linux-amd64.tar.gz
cd mysqld_exporter-0.15.1.linux-amd64
# 把 .my.cnf 放到当前目录
./mysqld_exporter

默认监听 9104 端口。

Docker 运行

bash 复制代码
docker run -d \
  -p 9104:9104 \
  -v /path/to/.my.cnf:/.my.cnf \
  prom/mysqld-exporter

单目标 vs 多目标模式

单目标

exporter 直接连本地或指定的 MySQL 实例,在 /metrics 暴露指标。适合每台 MySQL 服务器部署一个 exporter 的场景。

多目标

一个 exporter 代理多个 MySQL 实例,通过 /probe 端点按需采集。配置方式:

yaml 复制代码
# prometheus.yml
scrape_configs:
  - job_name: 'mysql'
    metrics_path: /probe
    params:
      auth_module: [client.server1]
    static_configs:
      - targets:
        - db1:3306
        - db2:3306
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: exporter服务器IP:9104

支持的收集器

默认启用的收集器:

收集器 说明
collect.global_status MySQL 全局状态(SHOW GLOBAL STATUS
collect.global_variables MySQL 全局变量(SHOW GLOBAL VARIABLES
collect.slave_status 主从复制状态

可通过参数开启更多收集器:

bash 复制代码
# 启用自增列监控
--collect.auto_increment.columns

# 启用表结构信息采集
--collect.info_schema.tables

# 启用 InnoDB 指标(默认就开了一部分)
--collect.innodb_metrics

# 启用用户统计
--collect.info_schema.userstats

# 启用 performance_schema
--collect.perf_schema.eventsstatements

收集的核心指标

指标 含义
mysql_up MySQL 是否在线(1=正常,0=宕机)
mysql_global_status_connections 累计连接数
mysql_global_status_threads_connected 当前连接数
mysql_global_variables_max_connections 最大连接数配置值
mysql_global_status_innodb_buffer_pool_pages_data InnoDB 缓冲池数据页数
mysql_slave_status_seconds_behind_master 主从复制延迟(秒)
mysql_global_status_uptime MySQL 运行时长

SSL/TLS 连接

如果 MySQL 启用了 SSL,在 .my.cnf 里加:

ini 复制代码
ssl-ca=/path/to/ca.pem
ssl-key=/path/to/client-key.pem
ssl-cert=/path/to/client-cert.pem

常用 PromQL

promql 复制代码
# MySQL 是否在线
mysql_up

# 连接使用率
mysql_global_status_threads_connected / mysql_global_variables_max_connections * 100

# 复制延迟
mysql_slave_status_seconds_behind_master

# InnoDB 缓存命中率
(mysql_global_status_innodb_buffer_pool_read_requests - mysql_global_status_innodb_buffer_pool_reads) / mysql_global_status_innodb_buffer_pool_read_requests * 100

# QPS(每秒查询数)
rate(mysql_global_status_questions[5m])
相关推荐
这个DBA有点耶2 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
这个DBA有点耶1 天前
SQL改写进阶:标量子查询的“隐形代价”与消除实战
数据库·mysql·架构
smallyoung1 天前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·mysql·postgresql
数据技术说1 天前
MySQL 迁移实战——如何实现真正的"零改造"平滑切换
mysql
唐青枫5 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
小满8785 天前
5.Mysql事务隔离级别与锁机制
mysql
元Y亨H6 天前
技术笔记:MySQL 字符集排序规则与大小写敏感性问题解决方案
mysql
这个DBA有点耶7 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵7 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
SamDeepThinking7 天前
一条UPDATE语句在MySQL 8.0中到底加了几把锁?
后端·mysql·程序员