MySQL Server Exporter
前边聊了那么多,今天来看看数据库的监控采集。数据库有很多种,今天主要来看 关系型数据库,会在未来三天把关系型数据库的 3 个主流发行版都过一下,主要是 MySQL 、MSSQL、PostgreSQL。今天我们先来看 MySQL 。
MySQL 这个名字的由来是作者 Monty 的女儿叫 My,然后在后边加了个 SQL,这个 SQL 还是结构化查询语言(Structured Query Language)的意思。
针对 MySQL 的监控 Prometheus 官方提供了一个 MySQL Server Exporter ,他的官方仓库地址是 https://github.com/prometheus/mysqld_exporter ,当前最新版本是 v0.13.0 ,发布于 2021 年 5 月 18 日。
MySQL Server Exporter 支持 MySQL 5.6 版本以上,包含 5.6 ,支持 MariaDB 10.2 版本及以上。当 MySQL 或者 MariaDB 版本小于 5.6 的时候,有部分采集模块会不支持,采集到的指标会变少。
安装运行
想要使用 MySQL Server Exporter 采集指标,需要先在 MySQL 实例中创建监控账号,并且授权。可以使用如下语句来实现。
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'XXXXXXXX' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
在创建监控账号的时候请一定要为这个用户设置一个最大连接数的限制,防止频繁获取监控指标导致服务器资源使用率升高,机器过载。
创建好的监控账号和密码可以通过环境变量传递给 MySQL Server Exporter ,也可以通过配置文件传递。
环境变量传递使用如下方法:
export DATA_SOURCE_NAME='user:password@(hostname:3306)/'
./mysqld_exporter <flags>
配置文件的话一般是 ~/.my.cnf ,需要说明的是这个 my.cnf 不是数据库的配置文件 my.cnf ,这两个文件在不同的为准,内容也不一样,是各自的程序启动配置文件。
./mysqld_exporter <flags>
MySQLd Exporter 的 my.cnf 文件内容如下:
[client]
host=localhost
port=3306
user=exporter
password=xxx
关于采集多个 MySQL 实例,有这样一个 Pull Request https://github.com/prometheus/mysqld_exporter/pull/504 ,代码已经提交了,但是还没合并。
打开采集指标类的命令行参数格式是这样的,打开采集使用这种参数 --collect.auto_increment.columns
,如果要关闭需要在前面加上 no-
的前缀,比如 --no-collect.auto_increment.columns
,这种参数格式是在 v0.10.0 以后使用的。在之前版本需要通过这样的参数来打开或者关闭 -collect.auto_increment.columns=[true|false]
。
MySQL Server Exporter 支持非常多的指标采集类型,详细的指标类型描述可以参考 Collector Flags 。
常用的启动参数如下,使用这些参数可以将
- config.my-cnf Path to .my.cnf file to read MySQL credentials from. (default: ~/.my.cnf)
- log.level Logging verbosity (default: info)
- exporter.lock_wait_timeout Set a lock_wait_timeout (in seconds) on the connection to avoid long metadata locking. (default: 2)
- exporter.log_slow_filter Add a log_slow_filter to avoid slow query logging of scrapes. NOTE: Not supported by Oracle MySQL.
- web.config.file Path to a web configuration file
- web.listen-address Address to listen on for web interface and telemetry.
- web.telemetry-path Path under which to expose metrics. version Print the version information.
MySQLd Exporter 也支持容器部署,供参考的启动命令是
docker network create my-mysql-network
docker pull prom/mysqld-exporter:v0.13.0
docker run -d \
-p 9104:9104 \
--network my-mysql-network \
-e DATA_SOURCE_NAME="user:password@(hostname:3306)/" \
prom/mysqld-exporter:v0.13.0
TLS 和 Basic Authentication
MySQLd Exporter 是支持 TLS 和 Basic Authentication 的。
在使用 TLS 和 Basic Authentication 的时候,需要通过 Web 配置文件来传递参数,使用 --web.config.file
参数来指定 Web 配置文件,Web 配置文件的格式可以参考 Web configuration。
数据库心跳
当使用 collect.heartbeat
参数打开心跳监控数据收集以后,MySQLd Exporter 将通过心跳机制测量复制延迟。Pt-heartbeat 是受支持的参考心跳实现。
过滤开启的监控项。
MySQLd Exporter 开启默认采集项以后会暴露所有的指标,这样可以在对比不同系统指标的时候防止出现指标错误或者不一致的情况。
对于高级使用,可以向 MySQLd Exporter 传递一个可选的收集器列表来筛选指标。collect[]参数可能被多次使用。在Prometheus配置中,你可以在擦伤配置下使用这个语法。
params:
collect[]:
- foo
- bar
这对于让不同的Prometheus服务器收集目标的特定指标非常有用。
小结
建议使用 MySQLd Exporter 的时候做好标准化部署和自动发现,这样可以提高运维效率,要不就变成配置小王子了。
另外一些 Grafana Dashboard 和 Prometheus 的告警规则可以参考 https://github.com/prometheus/mysqld_exporter/tree/main/mysqld-mixin 。