为了账号安全,请及时绑定邮箱和手机立即绑定

zabbix监控mysql的Discovery模板

标签:
MySQL

环境: centos6.6 zabbix-2.4.5  mysql-5.6.24

    zabbix没有自带对mysql的监控模板,网上许多模板也都是固定的监听某端口,不够灵活,如果mysql的端口很多记不清楚的话,我们就应该以lld(low level discovery)方式监控mysql。

步骤:

一、客户端

1、监控内容的json化

在客户端里,需要把监控的内容json化展示,然后服务端可以通过正则来过滤出结果。下面在是监控mysql的json展示:

wKiom1XV3yyTX-TJAACeP5dZVV8556.jpg

脚本内容如下:

#Fucation:mysql low-level discovery

#Script_name mysql_low_discovery.sh

mysql() {

            port=($(sudo ss -tnlp | grep mysql | awk -F "[ :]+" '{print $4}'))

            printf '{\n'

            printf '\t"data":[\n'

               for key in ${!port[@]}

                   do

                       if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];then

              socket=$(ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $8}'|cut -d ' ' -f 1)

                          printf '\t {\n'

                          printf "\t\t\t\"{#MYSQLPORT}\":\"${port[${key}]}\"},\n"

                     else [[ "${key}" -eq "((${#port[@]}-1))" ]]

              socket=$(ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $8}'|cut -d ' ' -f 1)

                          printf '\t {\n'

                          printf "\t\t\t\"{#MYSQLPORT}\":\"${port[${key}]}\"}\n"

                       fi

               done

                          printf '\t ]\n'

                          printf '}\n'

}

$1

如果想让脚本可以用zabbix的身份获取数据,还要做以下四步操作:

chown zabbix.zabbix mysql_low_discovery.sh

chmod +x mysql_low_discovery.sh

echo "zabbix ALL=(root) NOPASSWD:/usr/sbin/ss" >> /etc/sudoers

sed -i 's/^Defaults.*.requiretty/#Defaults    requiretty/'  /etc/sudoers

最后把脚本放到一个zabbix用户允许访问的目录, 定义UserParameter的时候路径保持一致就可以了。

2.自定义键值

在客户端修改配置文件zabbix_agentd.conf,添加以下内容:

UserParameter=zabbix_low_discovery[*],/bin/bash /usr/local/zabbix-2.4.5/script/mysql_low_discovery.sh $1

UserParameter=mysql_stats[*],/usr/local/mysql/bin/mysql --login-path=local -P$1 -e "show global status"| grep "\<$2\>"| cut -f2

这里遇到一个坑要提前说一下,对于mysql5.6以上的版本来讲,直接使用mysql -uxxx -pxxx -e "show global status"等直接输入密码的命令会有警告:

Warning: Using a password on the command line interface can be insecure.

这条警告会直接导致zabbix服务器端不能识别mysql_stats[*]的值,解决方法是使用mysql自带的mysql_config_editor 工具:

mysql_config_editor set --login-path=local --host=127.0.0.1 --user=username --password        回车会提示输入密码

然后我们在脚本中就可以使用:

mysql --login-path=local  -P$1 -e "statement"

代替

mysql -u username -p password -P$1 -e "statement"

这种填坑方法在实验环境可行,线上我试了一下,权限问题始终绕不过去,所以我最终采用了另外一种定义键值的办法:

UserParameter=zabbix_low_discovery[*],/bin/bash /usr/local/zabbix/libexec/mysql_low_discovery.sh $1

UserParameter=mysql_stats[*],/usr/local/zabbix/libexec/mysql.sh $1 $2

cat mysql.sh

#!/bin/bash

export MYSQL_PWD=XXX

/usr/local/mysql/bin/mysql -uXXX -h127.0.0.1 -P$1 -N -e "show global status where Variable_name='$2'" |awk '{print $2}'

这种方式也可以屏蔽警告信息,让zabbix_server端可以获取正确的数据。

3.Mysql授权查询功能的账号

grant select on *.* to USERNAME@'127.0.0.1' identified by "PASSWORD";

flush privleges;

4.重启zabbix客户端

killall zabbix_agentd

/usr/local/zabbix/sbin/zabbix_agentd

5.测试

先测试脚本和命令:

wKiom1XV4UPgK_E3AAE_hw00udw978.jpg

再测试客户端能不能获取键值:

wKioL1XV41KAHQIjAAGYf_sgiX0490.jpg

最后测试服务器端能不能获取键值:

wKiom1XV4USA_UtvAAFXHf1Wy3U171.jpg

注意:无论是python脚本或者shell脚本,zabbix接收的数据格式一定是JSON格式的,而且形式必须为:

{

    "data":[

     {

            "{#键}":"值"}

     ]

}

二、服务端

1.创建模板

wKiom1XV4eqwtfszAANDqtvsnSk710.jpg

2.设置发现规则

wKioL1XV4_qSGS8FAAPtHD34S3I707.jpg

3.设置正则

wKioL1XV4_rSBKDPAAOSWCrXk1Y843.jpg

4.创建发现项

wKiom1XV4evTPX5mAATju_cC-Os390.jpg

5.创建发现项的触发器

wKioL1XV4_rQw20_AAP9w1OYEW4406.jpg

6.给需要的项绘图

wKiom1XV4evBd9ubAAVHcoOFmcw565.jpg

7.将模板链接到mysql服务器

wKioL1XV4_rAQ-AwAAO7ftDqzGY164.jpg

8.注意事项

(1)发现规则设置更新时长为1小时

为什么设置3600秒?原因是如果设置时间过短,比如你设置60s,一个是服务器的压力大,一个是如果你检测的端口突然当掉了,还没有来的急报警,主机通过json来获取不到这个信息,就认为没有这个端口,模板里会自动关闭这个监控项的内容(默认保留30天,然后自动删除),这样报警功能就基本没有了,所以还是发现的间隔时间长一些比较好。

(2)设置正则

设置正则是为了将mysql的监听端口范围给固定,免得出现错误,也可以不设置正则,这个时候需要在设置发现规则的时候把正则那一项给清空。

wKiom1XV4eyz8gcDAAGyMepJfvk801.jpg

(3)创建发现项(Item prototypes)要注意

Name:要见名知意,不能随心所欲

Type:设置为Zabbix agent,意为主动提交数据

Key:一定是mysql_stats[{#MYSQLPORT},$2],第一个参数是端口,第二个参数是你具体想要查询的项,我的模板里有47项,这些项目在mysql -uxxx -pxxx -e "show global status"里已经列出来了,可以自己查看。

最后:

    附件模板奉上

附件:http://down.51cto.com/data/2366053

©著作权归作者所有:来自51CTO博客作者下善若火的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消