跟zabbix自动发现监控mongo数据库的思路差很少,若是公司的mysql都是使用3306端口或者同一端口的话,可直接建立模板,连接到各个服务器便可。若是公司的mysql的比较多或者端口不一致,仍是得自动发现并监控比较方便点,先看下效果图(主要仍是实现增删改查的监控):python
一样的,上述图也是经过zabbix的筛选功能汇在一块儿的。mysql
具体的自动发现规则配置以下:sql
探索规则配置完后,一样的在zabbix agent端添加以下配置而后重启zabbix agentd。shell
UserParameter=mysql.discover,python /usr/local/zabbix/discover_mysql.py数据库
其中/usr/local/zabbix/discover_mysql.py是用来自动发现端口的脚本,脚本内容以下:json
#coding:utf-8 import json import commands (status, output) = commands.getstatusoutput('''sudo netstat -tlnp|grep 'mysqld'|awk '{print $4}'|awk -F':' '{print $(NF)}'|sort -u''') if output: outputs = output.split('\n') ports = [] for port in outputs: ports += [{'{#MYSQLPORT}': port}] print json.dumps({'data':ports},sort_keys=True,indent=4) else: print 'discovery error'
使用netstat发现正在监控的端口。netstat通常zabbix没法执行,因此得在zabbix agentd端用visudo添加以下配置:bash
zabbix ALL= NOPASSWD: /bin/netstat
Defaults:zabbix !requiretty服务器
探索完端口后,zabbix server就须要以端口为参数向zabbix agent端获取数据,其中项目原型配置以下:ide
其中mysql.status又要从新写一份获取mysql数据的代码了,先把配置发一下吧,zabbix agentd端配置以下:ui
UserParameter=mysql.status[*],sh /usr/local/zabbix/check_mysql.sh -u xxxx -p xxxx -P $1 -k $2 2>/dev/null
获取mysql数据的/usr/local/zabbix/check_mysql.sh shell脚本以下,其中-u表示用户名,-p表示密码,-k表示获取mysql的状态值(这边举例获取的是Com_update等值),2>/dev/null是把mysql密码明文的提示给去除:
#!/bin/sh while getopts "u:p:P:k:" opt do case $opt in u ) user=$OPTARG;; p ) password=$OPTARG;; P ) port=$OPTARG;; k ) key=$OPTARG;; ? ) echo 'parameter is wrong!' exit 1;; esac done if [ ! "${user}" ] || [ ! "${password}" ] || [ ! "${port}" ];then echo "parameter is null" exit 1 fi mysql -u ${user} -p${password} -h 127.0.0.1 -P${port} -e "show global status"|grep "${key}[[:space:]]"|awk '{print $2}'
经过上面的配置,基本上是能够自动发现mysql的端口并监控mysql了,通常监控mysql咱们都会建立一个比较小权限的账号,脚本里只用到show global status:
grant usage on *.* to ‘xxxx’@'127.0.0.1' identified by 'xxxx';
Zabbix实战教程:https://edu.51cto.com/sd/36433