使用ZABBIX自带模板去监控Mysql

事前准备

Zabbix-agent:3.0.8,安装路径是/etc/zabbix/
Mysql:5.7.10,安装路径是/opt/mysql/
配置/etc/sudoers让zabbix用户可以使用sudo,如下:

1
2
3
4
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
zabbix ALL=(ALL) NOPASSWD:ALL
Defaults:zabbix !requiretty

配置.my.cnf

众所周知,Zabbix官方提供了自带监控Mysql的模板,但是这个模板并不能直接使用。所以我们需要有如下的改动:

首先,先在mysql目录下的etc文件夹里先创建一个.my.cnf文件,全路径是/opt/mysql/etc/.my.cnf,这个文件是zabbix要求的用于存放连接mysql数据库的账户信息的隐藏文件,这样可以避免在命令行里输入密码。整个.my.cnf文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
[mysql]                     #mysql程序要使用的账户信息
host=localhost
user=用户名
password="密码" #此处的密码强烈建议加上引号
socket=/tmp/mysql.sock #确认mysql的sock文件路径

[mysqladmin] #mysqladmin程序要使用的账户信息
host=localhost
user=用户名
password="密码"
socket=/tmp/mysql.sock

这里建议在mysql里插入一个叫zabbix的用户,密码自己设定,然后在.my.cnf里就是用这个用户即可。此时,在命令行直接输入HOME=/opt/mysql/etc/ mysqlHOME=/opt/mysql/etc/ mysqladmin ping都应该是直接出结果,而不是用输入账号和密码,如图:
akb48

注意!这个.my.cnf的权限是644,用户和用户组是root,如果权限过大,那么启动mysql时就会报错:Warning: World-writable config file '/opt/mysql/etc/.my.cnf' is ignored

修改userparameter_mysql.conf

然后在zabbix-agent配置文件的文件夹/etc/zabbix/zabbix_agentd.d/里,会发现一个叫userparameter_mysql.conf的文件,把里面的内容改成如下样子:

1
2
3
4
5
6
7
# For all the following commands HOME should be set to the directory that has .my.cnf file with password information.

# Flexible parameter to grab global variables. On the frontend side, use keys like mysql.status[Com_insert].
# Key syntax is mysql.status[variable].
UserParameter=mysql.status[*],echo "show global status where Variable_name='$1';" | sudo HOME=/opt/mysql/etc /opt/mysql/bin/mysql -N | awk '{print $$2}'
UserParameter=mysql.ping,sudo HOME=/opt/mysql/etc/ /opt/mysql/bin/mysqladmin ping | grep -c alive
UserParameter=mysql.version,/opt/mysql/bin/mysql -V

这个文件第一行注释的内容就是说明HOME路径就是.my.cnf文件所在的路径,后面的mysqlmysqladmin都要用绝对路径,同时加上sudo,这样zabbix才能正确的调用它。

来到zabbix-server端使用zabbix-get去试试结果:
akb48

然后就是在zabbix网页端将目标机器添加Template DB MySQL,至此,使用zabbix自带的mysql监控模板监控mysql数据库就结束了,效果如下:
akb48

监控连接数

上面那个模板是不带有监控连接数的,要是单纯的去使用netstat获取当前链接值可能会反应较慢,那么就是用mysql自带的查连接数的命令:show status like '%connect%';,执行效果如下:
akb48

简单说下这几个值的含义:

  1. Connections:试图连接到(不管是否成功)MYSQL服务器的连接总数
  2. Locked_connects:锁住的链接数
  3. Max_used_connections:服务器启动后已经同时使用过的连接最大数量(并发)
  4. Max_used_connections_time:出现Max_used_connections时的时间
  5. Aborted_connects:尝试连接到MySQL服务器失败的次数
  6. Threads_connected:当前的连接数

那么知道了含义,我们就可以对症下药了,这里我们监控两个数值Locked_connectsThreads_connected,那么就把下面的语句添加到userparameter_mysql.conf里:

1
2
3
UserParameter=mysql.connections,echo "show status like '%Threads_connected%';" | sudo HOME=/opt/mysql/etc /opt/mysql/bin/mysql -N | awk '{print $2}'
UserParameter=mysql.lockconnections,echo "show status like '%Locked_connects%';" | sudo HOME=/opt/mysql/etc /opt/mysql/bin/mysql -N | awk '{print $2}'
UserParameter=mysql.rowofalarm,echo "select count(*) from alarm.adm_log_alarm;" | sudo HOME=/opt/mysql/etc /opt/mysql/bin/mysql -N | awk '{print $1}' #这个是检测alarm.adm_log_alarm的数据行数

重启zabbix-agent,配置对应的items和trigger即可。

额外补充一下,查看mysql数据库对应每个IP的详细链接情况的语句是:

1
select substring_index(host,':',1) as ip , count(*) from information_schema.processlist group by ip;

效果如下:
akb48

参考资料

https://github.com/erasin/notes/blob/master/linux/mysql/monitor.md (其他mysql状态监控语句)
http://www.cnblogs.com/kerrycode/p/9206787.html

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------