说明:
在工作中碰到mysql服务down掉后,zabbix不报警。在zabbix看mysql的item都不兼容,后面有!,提示cannot convert from string to numberics还是什么的。
这mysql监控模版在zabbix 2.x倒是能正常使用,放在3.x就没有正常报警。
分析:
zabbix通过{Template App MySQL:mysql.ping.last(0)}=0这个trigger来判断mysql是否存活。 而trigger则是通过mysql.ping这个自定义key,具体mysql命令mysqladmin ping | grep -c alive来判断。可以通过查看cat /usr/local/zabbix/etc/zabbix_agentd.conf.d/mysql_status.conf查看 UserParameter=mysql.ping,HOME=/usr/local/zabbix/etc /usr/bin/mysqladmin ping | grep -c alive
mysql正常情况下,输入密码后就直接输出1
# /usr/bin/mysqladmin ping -uroot -p |grep -c alive Enter password: 1
mysql down情况下,可以看到除了输出0外,还输出/usr/bin/mysqladmin: connect to server at ‘localhost’ failed等这些报错信息
# /usr/bin/mysqladmin ping -uroot -p |grep -c alive Enter password: /usr/bin/mysqladmin: connect to server at 'localhost' failed error: 'Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)' Check that mysqld is running and that the socket: '/var/lib/mysql/mysql.sock' exists! 0
结果:
这就导致mysql down时,zabbix通过mysqladmin ping来获取mysql,mysql把一些报错信息也发回给zabbix,导致zabbixs接收到的并不是纯数字,而是报错的字符串+0,导致zabbix trigger无法识别。
解决:
解决思路就是把mysql的错误日志重定向下
# vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/mysql_status.conf 将 UserParameter=mysql.ping,HOME=/usr/local/zabbix/etc /usr/bin/mysqladmin ping | grep -c alive 修改为如下,将错误输入重定向到 2>/dev/null UserParameter=mysql.ping,HOME=/usr/local/zabbix/etc /usr/bin/mysqladmin ping 2>/dev/null | grep -c alive
附录:
看网上有很多通过将myql.ping改成telnet,这种其实不太好,有可能会碰到telnet没有安装的情况。正常监控某项服务就尽量只使用那服务自带的命令,这样通用性是最好的。