告别重复造轮子: 抄官方的作业完成工作任务

前言

笔者在工作中维护着一个内部系统, 业务量不大, 但存放的都是内部的敏感数据, 也就一直没有部署到云平台. 同时因为是对内的数据库, 对高可用性没有严苛的要求, 只是考虑到数据的完整性, 便顺带做了一个主从同步. 从节点不参与业务, 纯粹是作为主节点的数据备份, 防止丢失.

前阵子看了一眼这个无人问津的从节点, 才发现主从同步已经停止了小半年, 所幸主节点一直都正常运行, 不然笔者的年终奖都要打个折了(笑).

笑完之后, 便想着还是得把主从同步的状态监控一下.

制定方案

系统以及程序版本

项目 版本
Zabbix Server 5.0.6
Zabbix Agent 5.0.6
MySQL Server 5.7.29-log MySQL Community Server (GPL)
CentOS 7.6.1810

需求分析

如果只是为了监控从节点的同步状态, 那只需要监控show slave status中的两个字段就可以了:

1
2
3
4
5
6
mysql> show slave status \G
*************************** 1. row ***************************
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...

草案

表面上看, 要想以最省事的方式完成这个需求, 比把大象塞进冰箱稍微复杂一点, 大致的步骤如下:

  1. 写一个shell脚本, 通过mysql cli获得字符串返回
  2. 修改zabbix agent的配置文件, 通过UserParameter创建新的zabbix key, 再关联上这个shell
  3. 在zabbix web中创建相应的监控item, 定期执行这个key
  4. 根据item的返回, 设置一个触发器, 当目标字段的返回值不是Yes, 即告警.

扩展

显然, 上面是一个可行的方案, 对笔者来说, 甚至是驾轻就熟. 但如果我们要加入更多的考虑:

  1. 后面可能还要再监控其他的性能指标
  2. 这个方案能不能方便地复用在其他服务器上
  3. 移植的时候, 必然会陷入调参的烦恼中, 最起码IP地址, 端口, 用户名都会不一样.
  4. 所以我要制定一个变量字典, 把常用参数作为变量去引用
  5. 我还要梳理出需要关注的监控项
  6. 那监控可视化也得做一个吧
  7. bla bla bla

再引出灵魂拷问:

当我增加需求的时候, 必须要不断地循环上面的步骤吗?

到底要迭代多少次才能打磨出一个让自己满意的方案?

想想都觉得累, 我要找一个大而全的方案.

模板(Template)

大而全, 那自然就是监控模板了, 说到监控模板, 我为什么不看看有没有现成的方案:

Template DB MySQL by Zabbix agent

monitoring-mysql-with-zabbix

我就知道, 一定有.

实施步骤

基础前提

当要完成这个需求的时候, 笔者自然默认Zabbix Agent, 以及MySQL环境和相应的mysql, 和mysqladmin都已经完成调试了, 就不赘述了.

MySQL创建用户

为了安全, 我们需要创建一个权限刚好够用的账号:

1
2
CREATE USER 'zbx_monitor'@'%' IDENTIFIED BY '<password>';
GRANT REPLICATION CLIENT,PROCESS,SHOW DATABASES,SHOW VIEW ON *.* TO 'zbx_monitor'@'%';

为Zabbix Agent创建MySQL客户端配置文件

默认情况下, Zabbix的HOME是/var/lib/zabbix, 也可以通过通过查看进程状态确认:

1
2
3
4
5
6
7
8
9
10
11
[root@rbtnode1 ~]# ps -ef | grep -i zabbix
root 21414 18984 0 11:55 pts/0 00:00:00 grep --color=auto -i zabbix
zabbix 29921 1 0 Feb17 ? 00:00:00 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
zabbix 29922 29921 0 Feb17 ? 00:01:12 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
zabbix 29923 29921 0 Feb17 ? 00:01:24 /usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
zabbix 29924 29921 0 Feb17 ? 00:01:24 /usr/sbin/zabbix_agentd: listener #2 [waiting for connection]
zabbix 29925 29921 0 Feb17 ? 00:01:26 /usr/sbin/zabbix_agentd: listener #3 [waiting for connection]
zabbix 29926 29921 0 Feb17 ? 00:00:17 /usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]
[root@rbtnode1 ~]# cat /proc/29921/environ
LANG=en_US.utf8PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binHOME=/var/lib/zabbixLOGNAME=zabbixUSER=zabbixSHELL=/sbin/nologinCONFFILE=/etc/zabbix/zabbix_agentd.conf
[root@rbtnode1 ~]#

创建/var/lib/zabbix/.my.cnf, 当zabbix调用mysql客户端的时候, 默认使用这个文件获取连接参数. 文件内容:

1
2
3
[client]
user='zbx_monitor'
password='<password>'

在Zabbix Web导入MySQL监控模板

首先确认是否存在旧版本的MySQL监控模板, 如果有, 则删除.

如果你的旧版本监控模板已经在使用中, 那你就不用看我的文章了.

在Zabbix的官方git中下载正确版本的MySQL监控模板, 并通过ZabbixWeb导入, 下载链接: template_db_mysql_agent.xml

template

为Zabbix Agent添加UserParameter

下载template_db_mysql.conf, 并在Zabbix Agent的配置文件中完成include即可. 在笔者的环境中, 操作结果如下:

1
2
3
4
5
6
7
8
9
10
[root@rbtnode1 zabbix_agentd.d]# pwd
/etc/zabbix/zabbix_agentd.d
[root@rbtnode1 zabbix_agentd.d]# cat template_db_mysql.conf
UserParameter=mysql.ping[*], mysqladmin -h"$1" -P"$2" ping
UserParameter=mysql.get_status_variables[*], mysql -h"$1" -P"$2" -sNX -e "show global status"
UserParameter=mysql.version[*], mysqladmin -s -h"$1" -P"$2" version
UserParameter=mysql.db.discovery[*], mysql -h"$1" -P"$2" -sN -e "show databases"
UserParameter=mysql.dbsize[*], mysql -h"$1" -P"$2" -sN -e "SELECT COALESCE(SUM(DATA_LENGTH + INDEX_LENGTH),0) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='$3'"
UserParameter=mysql.replication.discovery[*], mysql -h"$1" -P"$2" -sNX -e "show slave status"
UserParameter=mysql.slave_status[*], mysql -h"$1" -P"$2" -sNX -e "show slave status"

添加监控模板所需要的宏变量

按照README.md的要求, 设置如下:

macros

为Host绑定这个新创建的Template

如题

测试验收

完成上面的设置后, 重启zabbix agent, 在zabbix server中可以向agent发起测试:

1
2
[root@zabbix-server ~]# zabbix_get -s 192.168.255.104 -p 10050 -k mysql.ping[192.168.255.104,3306]
mysqld is alive

业务逻辑

如果仔细观察这个官方提供的Template, 不难看出当中大量使用了自动发现以及MasterItem的功能, 再通过Macros完成个性化设置, 整个方案为用户提供了极大的移植便利.

而且, 整个监控过程只依赖了mysql客户端, 并没有额外的第三方工具或者是脚本操作, 所有数据的获取都是通过mysql或者是mysqladmin完成.

大部分的监控数据都通过自动发现以及MasterItem依赖完成, 在自动发现的同时, 也会把需要关注的指标设置上触发器, 而触发器的告警阈值则是通过Macros完成设置.

连一些必要的监控图都会自动创建好.

screen

具体关于Template, Discovery, ItemPrototype, MasterItem, DependentItem这些功能, 在官方文档都有详细解释:

Configure a template

Dependent Item

反过来说, 如果想深入理解Zabbix这些复杂功能, 按照本文的思路配置一个MySQL的监控模板, 把Zabbix Web中各项设置和实际作用联系起来, 自然就能透彻理解了.

后记

本来写了一些关于为什么我这么喜欢参考官方文档的话, 但写完之后发现, 抄官方的作业其实本来就是正常操作, 似乎也没什么好说的. (笑)

也知道随着云原生概念的流行, 生产环境都会倾向部署到云平台上, 也不需要自己另外搭建监控了. 但对于一些特殊的场景, 自建监控应该还是有一点点价值.

最近荣升奶爸, 生活和工作也越来越忙, 只好匆匆水一篇.

2023年第一次更新.