事前准备
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/ mysql
和HOME=/opt/mysql/etc/ mysqladmin ping
都应该是直接出结果,而不是用输入账号和密码,如图:
注意!这个.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
文件所在的路径,后面的mysql
和mysqladmin
都要用绝对路径,同时加上sudo
,这样zabbix才能正确的调用它。
来到zabbix-server
端使用zabbix-get
去试试结果:
然后就是在zabbix网页端将目标机器添加Template DB MySQL
,至此,使用zabbix自带的mysql监控模板监控mysql数据库就结束了,效果如下:
监控连接数
上面那个模板是不带有监控连接数的,要是单纯的去使用netstat获取当前链接值可能会反应较慢,那么就是用mysql自带的查连接数的命令:show status like '%connect%';
,执行效果如下:
简单说下这几个值的含义:
- Connections:试图连接到(不管是否成功)MYSQL服务器的连接总数
- Locked_connects:锁住的链接数
- Max_used_connections:服务器启动后已经同时使用过的连接最大数量(并发)
- Max_used_connections_time:出现Max_used_connections时的时间
- Aborted_connects:尝试连接到MySQL服务器失败的次数
- Threads_connected:当前的连接数
那么知道了含义,我们就可以对症下药了,这里我们监控两个数值Locked_connects
和Threads_connected
,那么就把下面的语句添加到userparameter_mysql.conf
里:
1
2
3UserParameter=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;
效果如下:
参考资料
https://github.com/erasin/notes/blob/master/linux/mysql/monitor.md (其他mysql状态监控语句)
http://www.cnblogs.com/kerrycode/p/9206787.html