当Zabbix和Percona两者相遇,会擦出不少的开源火花来,众人拾柴火焰高,最终受益的还是大部分运维人员。
我很早就用过Percona提供的MySQL监控模板,但是却没有刨根问底,只是简单使用而已,自从定制了Orabbix之后,我还是信心满满,MySQL的数据字典相对要少很多,监控起来可能想必Oracle要少很多,不过关于Percona的这个插件,我还是带着好奇之心,内部是否有很多独门秘籍,我想好好学学那些监控项对应的SQL,好好弥补我对于MySQL监控的一些空缺,所以简单分析这个模板就排上了日程。
首先是Percona monitoring Plugins for Zabbix这个插件,可以参考官网。https://www.percona.com/doc/percona-monitoring-plugins/1.1/zabbix/index.html里面已经列出了很详细的步骤,我就不再赘述了,我的目标是简单理解这些监控的出处和原理。
因为这个插件是客户端的,所以选择了一台服务器在客户端查看。到达了相应的安装目录下,假设为:/home/app/zabbix/zabbix_agentd.conf.d/
可以看到配置文件userparameter_percona_mysql.conf的内容,类似下面的形式
如此来看监控项还是丰富啊,而且后面对应的参数很简介。这样的监控项总共有多少,大概是160多个。我想我算是找到了一个宝藏了,这么多的脚本可着实能好好潜心学习一番。
等等,我看了看脚本,发现有些不大对劲啊,怎么调用的都是同一个脚本。/home/app/zabbix/script/get_mysql_stats_wrapper.sh
好吧,一个就一个脚本,肯定脚本很大,也不影响代码阅读。
再次查看这个脚本,发现我又想错了。
这个脚本是大小是1333,大概就是1k的样子,这么大点能放多少代码,肯定远远不够啊。带着好奇心进入这个脚本。
原来这个脚本中不是实际的详细逻辑,这个脚本会生成一个所谓的cache文件,里面调用的脚本是一个php脚本ss_get_mysql_stats.php
大体的调用方式如下:
CMD="sudo /usr/local/php/bin/php -q $DIR/ss_get_mysql_stats.php --host $HOST --items gg"
把生成的数据都放入/tmp/localhost-mysql_cacti_stats.txt
这个cache文件是什么东东,就是调用后生成的数据信息。内容类似下面的样子:
#cat /tmp/localhost-mysql_cacti_stats.txt
gg:19526110683 gh:2588 gi:330457818 gj:288709876 gk:-1 gl:-1 gm:-1 gn:-1 go:0 gp:0 gq:131064 gr:130907
就是把上面监控项的值按照参数来分组,比如参数gg,值为19526110683。
对应的就是监控项:
UserParameter=MySQL.Key-read-requests,/home/app/zabbix/script/get_mysql_stats_wrapper.sh gg
而如果现学现用,就直接调用模板里引用的那个php脚本,也能得到参数gg对应的值。
# sudo /usr/local/php/bin/php -q /home/app/zabbix/script/ss_get_mysql_stats.php --host localhost --items gg
gg:19526142091
这个参数值代表什么含义呢,继续在里面找找。查看代码,可以看到gg对应的是Key_read_requests,和监控项里的定义是一致的。
更为关键的是,我在脚本里找了半天相关的SQL语句,竟然一个都没有,这是什么情况。
继续往下看,发现原来是取的show status输出的结果,里面定义了不少的数组去存放和映射。
明白了套路,那里面引用了哪些命令呢,大概是这样的一些命令,而且难能可贵的是里面都给出了一些解释。
当然这个时候就会发现这个脚本的内容量很丰富了,里面定义了大量的函数。有些通过字面意思就能明白大体要做的操作了。
大师的脚本可以反复揣摩,其中值得学习的一个地方就是步骤很清晰,从注释就可以学习不少。
当然要抓住重点,那就是从main开始看起,有方向性。
把代码中的注释直接拿出来,对于理解也是大有裨益,这就是好脚本的一个特点。
可能因为里面有很多数组的处理,作者更钟爱于php,所以直接使用php来封装了,当然直接用shell封装也是可行的。这个应该就是基于个人喜好了。
通过这个简单的分析可以看到,这个脚本是基于一些看似简单的命令来得到一个MySQL的状态信息,而且从代码里也可以看到它也会对数据做一些二次处理,比如做一些数值统计。
看起来还是很繁琐的一个工作,在脚本里可以很清晰看出结构关系来。值得好好揣摩学习。
当然脚本运行的数据在Zabbix端也有一个映射。比如unflushed-log这个监控项,就需要这样配置一番。