MySQL监控
对于监控系统,基础功能的强弱确实非常关键,但是如何在不同的场景落地实践,则更为关键。在《监控实践》章节,搜罗各类监控实践经验,会以不同的组件分门别类,您如果对某个组件有好的实践经验,欢迎提 PR,把您的文章链接附到对应的组件目录下。
- 使用 Categraf 监控 MySQL 的入门教程
- 根据夜莺模板中心的引导,建设 MySQL 监控
- 如何发现及处理 MySQL 主从延迟问题
- MySQL 监控原理讲解
- 使用 Exporter 监控 MySQL
- 解决 MySQL 的 max_prepared_stmt_count 问题
除了 MySQL 的性能数据的监控,我们也可以自定义 SQL 来监控 MySQL 中的数据(通过 Categraf 的 mysql 插件即可做到),这通常会有两个用途:
- 扩展性能监控指标,默认的性能监控数据不够用的话,可以通过这种方式来扩展
- 监控业务数据,这个场景就极为广泛了,比如监控订单数据、用户数据等。这个场景容易被大家忽略,但有时有奇效。
MySQL 监控概述
MySQL、Redis、MongoDB 等各类数据库的监控数据采集,原理类似,就是为 Categraf 创建一个 DB 账号,Categraf 用此账号连到数据库实例上,执行一些命令获取监控数据,比如连到 MySQL 上执行 show global status、show global variables 等命令。
创建 DB 账号
为了安全起见,建议为 Categraf 创建一个只读权限的 DB 账号:
CREATE USER 'categraf'@'127.0.0.1' IDENTIFIED BY 'XXXXXXXX' WITH MAX_USER_CONNECTIONS 3; |
当然,测试期间也可以使用 root 账号,但是生产环境不建议使用 root 账号。
快速入门
Categraf 内置各类监控插件,也内置了 MySQL 的监控插件,其配置文件在 Categraf 的 conf/input.mysql/mysql.toml,下面是一个极简配置内容:
[[instances]] |
然后通过 Categraf 的 --test 命令可以测试配置是否正确:
./categraf --test --inputs mysql |
输出如下:
ulric@ulric-flashcat categraf % ./categraf --test --inputs mysql |
篇幅所限,上面只贴了 3 个指标,实际会采集更多指标。
然后重启 Categraf:
systemctl restart categraf |
上例是假设您使用 systemd 托管 categraf,如果您使用 supervisor 等其他进程管理工具,请自行搞定。或者不重启 categraf,只是给 categraf 发送一个 SIGHUP 信号,categraf 会自动 reload 配置。
kill -HUP `pidof categraf` |
最后,在夜莺里导入仪表盘就可以看到 MySQL 的监控数据了。如下是截取的夜莺 7.7.1 版本。

可以打开这个仪表盘:“MySQL 仪表盘(使用 address 筛选,用于中心端 Categraf 采集远端多个 mysql 实例的场景)”,看到的效果如下:

MySQL 监控的两种模式
使用 Categraf 监控 MySQL,有两种模式:
- 模式一:MySQL 使用本机的 Categraf 采集监控数据。比如你有 10 台机器,每个机器上都有一个 MySQL 实例,那就部署 10 个 Categraf,每个 Categraf 采集自己所在机器的 MySQL 实例。
- 模式二:只部署一个 Categraf 专门用来采集 MySQL,即便你有 10 个 MySQL 实例,仍然使用一个 Categraf 来采集。比如云上的 RDS,就只能使用这种模式。
两个模式各有优劣。
模式一,Categraf 采集本机的 MySQL,网络请求走回环网卡,性能更好,网络链路更稳定。这种模式下,MySQL 的地址大概率都是配置的 127.0.0.1:3306,如果你有 10 套 MySQL,通过 address 标签就无法区分这些 MySQL 的监控数据了。因为 address 都是一样的,都是 127.0.0.1:3306。这种模式,在仪表盘中,可以使用机器名作为筛选过滤条件,即大盘里要看哪个机器的 MySQL 数据,就选哪个机器的机器名。“MySQL 仪表盘,适用于 Categraf 采集本机 MySQL 的场景” 这个仪表盘就是应对这种场景的。这种模式无法监控云上的 RDS。因为云上的 RDS 所在的机器普通用户登录不了,自然无法部署 Categraf。
另外,模式一这种模式,由于无法使用 address 标签来区分不同的 MySQL 实例,我们还可以给每个 MySQL 实例附一个标签,比如 labels = { instance="n9e-mysql-01" },这样一来,这个 MySQL 的所有监控数据都会附加这个 instance="n9e-mysql-01" 标签,这样在仪表盘中就可以使用 instance 标签来筛选过滤了。您可以使用这个仪表盘: “MySQL 仪表盘(使用 instance 筛选,需要采集时自行打上 instance 标签)”。如何给实例附加标签?在 Categraf 的配置文件中,给 [[instances]] 配置段加上 labels = { instance="n9e-mysql-01" } 即可:
[[instances]] |
模式二,用一个 Categraf 采集所有 MySQL 实例,可以应对云上 RDS 的场景,Categraf 的配置样例如下:
[[instances]] |
上例是监控了两个 MySQL 实例,所以配置了两个 [[instances]] 配置段。这个配置文件是 toml 格式,在 toml 中双中括号表示数组。想要监控多个 MySQL 实例,就复制多份 [[instances]] 配置段就可以了。
这个模式下,不同实例的 address 显然是不同的,所以可以不用附加额外的 instance 标签。在仪表盘中,可以使用 address 标签来筛选过滤。
使用自定义 SQL 监控 MySQL
Categraf 的 MySQL 插件,会执行一些 SQL 来获取 MySQL 的性能指标数据。但有时您可能觉得不够用,想要自定义一些 SQL 来采集监控数据,尤其是一些业务监控数据。此时,您可以自定义 SQL,配置到 Categraf 的 MySQL 插件中。比如我想监控夜莺的数据库中的用户总量,把用户总量作为监控数据采集并上报,配置方式如下:
[[instances]] |
上面配置了一条自定义 SQL:select 'n9e' as service, count(*) as total from n9e_v6.users。这个 SQL 的查询结果如下:
+---------+-------+ |
任何一个 SQL 语句,返回的内容都是这么一个二维表格。表格里有很多列,有的列是数值,希望作为监控指标,有的列是字符串,希望作为指标的标签,那我们就需要通过配置告知 Categraf,应该如何解析这个二维表格。所以,就有了上例中的 mesurement、metric_fields、label_fields 这些配置项。这些配置项的作用如下:
mesurement:哪个列作为监控指标名称前缀metric_fields:数组,哪些列作为监控指标的值label_fields:数组,哪些列作为监控指标的标签field_to_append:哪个列作为监控指标名称的后缀,上例中没用到timeout:超时时间request:SQL 语句
如果想定义多个自定义 SQL,就把上面的内容复制多份就可以了,比如:
[[instances]] |
MySQL 插件配置详解
下面我们把 Categraf 的 MySQL 插件的所有配置贴到下面,并逐一解释。
# 定义mysql采集周期,单位是秒 |
如何监控 MySQL 集群
MySQL 集群通常是一主多从,显然主节点有自己的连接数、TPS 指标,从节点也有自己的连接数、TPS 等指标,所以,我们要同时监控主从节点,即把主从节点的连接地址都配置到 Categraf 的 MySQL 插件中。比如:
[[instances]] |
如上例,由于这里的主从节点是有关系的,都是属于某个集群的,那我们就给他们都打上一个 cluster 标签,用来和其他集群区分开。
总结
本文详细描述了 MySQL 监控插件的配置,当然,上面的工作完成,也只是采集了监控指标,具体各个指标是什么含义,解释起来篇幅就长了,就不在这里展开了。希望上面的内容可以帮到您。