agent上起了多了 mysql实例,占用不一样的端口,agent 仅在初始情况下,塞入脚本和 键配置,而后重启。 之后维护的时候(mysql端口变更),要作到 不能 动agent,力争 只在 web端 或者server端作修改 就能自动监控到对应端口。 |
用到的主要工具: 宏(分为模板宏,主机宏,自动发现宏)mysql
主机宏格式:$MACRO (直接就能够 填 值) 自动发现宏:#MACRO (须要配合 建立的 key 取值)
大致架构linux
1.agent主机 -- agent 主机建立 宏变量 $MYSQLPORT ,宏变量的值为 Discovery rules的 自动发现脚本参数
2.模板 -- 模板里建立自动发现规则,靠的是自动发现脚本,获得自动发现宏变量。
3.监控项-- 在Discovery rules 里建立监控项,监控项名称和key值里都有自动发现宏变量,会自动生成相关端口的监控项
4.客户端 脚本和键建立,来支持整个架构运行web
搭建步骤sql
1.建立模板架构
由于这个模板是 克隆 的默认 mysql监控模板,能够忽略 items,triggers。 监控项都在 Discovery rules 里。app
2.为模板添加 自动发现宏(自动发现宏声明的途径就是下图的脚本,脚本里只有生成固定的格式,zabbix就会认定他是 自动发现宏)socket
上图 里的 mysql.discovery 就是获取 自动发现宏的 脚本,脚本是放在 agent端。工具
后面的 $MYSQLPORT 为此脚本执行时带的参数,$MYSQLPORT 是主机宏。性能
discovery rule 右边的 filters 是过滤规则的意思,比方你 只想取脚本里的 某某 自动发现宏,就能够在里面设置。 这里就只有一个自动发现宏,全部不作 配置。3d
3.建立监控项(监控项和监控的脚本都是要改的,由于自动发现功能,至少脚本会多了一个参数)
4.建立 主机宏
点开主机,添加主机宏,宏名称是 自动发现脚本里的 参数, 宏的值就是 此 主机上须要监控的端口。
这样就实现了 只要改动主机宏的 值,就能够改变主机宏的监控项。
脚本展现
1.discovery_mysql.sh 自动发现端口脚本 (网上抄的脚本作了修改)
res=`echo $1| sed "s/_/\n/g"`; port=($res) printf '{\n' printf '\t"data":[\n' for key in ${!port[@]} do if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]]; then printf '\t {\n' printf "\t\t\t\"{#MYSQLPORT}\":\"${port[${key}]}\"},\n" else [[ "${key}" -eq "((${#port[@]}-1))" ]] printf '\t {\n' printf "\t\t\t\"{#MYSQLPORT}\":\"${port[${key}]}\"}\n" fi done printf '\t ]\n' printf '}\n'
执行实例: 以_ 为分隔符,格式化输出 自动发现宏
./discovery_mysql.sh 3306_3307_3308
{ "data":[ { "{#MYSQLPORT}":"3306"}, { "{#MYSQLPORT}":"3307"}, { "{#MYSQLPORT}":"3308"} ] }
2.mysql_filestype.sh 监控mysql的一些挂载盘
var=$1 MYSQL_PORT=$2 MYSQL_NAME=`ps -ef |grep '/mysql/app/bin/mysqld'| grep "$MYSQL_PORT" |grep -v grep | awk -F" " '{print $11}' |awk -F"/" '{print $2}'` ; MYSQL_SOCk_DIR="/$MYSQL_NAME/" ; df -h "${MYSQL_SOCk_DIR}${var}" |grep -v Filesystem |awk -F" " '{print $5}' | awk -F"%" '{print $1}' ;
3.mysql_ping.sh 监控mysql状态
MYSQL_PORT=$1; [ "${MYSQL_USER}" = '' ] && MYSQL_USER=xxx [ "${MYSQL_PASSWORD}" = '' ] && MYSQL_PASSWORD=xxxxx mysqladmin=/mysql/app/bin/mysqladmin ; MYSQL_SOCk_DIR=`ps -ef |grep 'mysql'| grep "${MYSQL_PORT}" |grep -v 'grep' | awk -F" " '{print $16}'` ; ${mysqladmin} -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_SOCk_DIR} ping 2> /dev/null |grep 'alive'|wc -l ;
注意: 这边链接实例 都是 mysql -u -p -S /xxx/mysql.sock
可是后来发现部分客户端老是没法正确显示值,并且就是这条 语句报错, 感受是环境变量的问题
因此拿 --socket=/xxx/mysql.sock 来代替 -S/xxx/mysql.sock 。 这里的变量${MYSQL_SOCk_DIR} 就是--socket=/xxx/mysql.sock 。
4.mysql_repl.sh mysql主从状态监控
var=$1 MYSQL_PORT=$2 MYSQL_SOCk_DIR=`ps -ef |grep 'mysql'| grep "${MYSQL_PORT}" |grep -v 'grep' | awk -F" " '{print $16}'` ; mysql=/mysql/app/bin/mysql [ "${MYSQL_USER}" = '' ] && MYSQL_USER=xxx [ "${MYSQL_PASSWORD}" = '' ] && MYSQL_PASSWORD=xxxx ${mysql} -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_SOCk_DIR} -e "show slave status\G;" 2> /dev/null |grep "\b${var}\b"|awk -F" " '{print $2}' ;
主从状态 有几个端口的值是 空的, 这个得 具体问题具体设置
5.mysql_status2 mysql性能之类的监控
mysql=/mysql/app/bin/mysql var=$1 MYSQL_PORT=$2 [ "${MYSQL_USER}" = '' ] && MYSQL_USER=xxx [ "${MYSQL_PASSWORD}" = '' ] && MYSQL_PASSWORD=xxxxx MYSQL_SOCk_DIR=`ps -ef |grep 'mysql'| grep "${MYSQL_PORT}" |grep -v 'grep' | awk -F" " '{print $16}'` ; ${mysql} -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_SOCk_DIR} -e "show global status;" 2> /dev/null |grep -v Variable_name|grep "\b${var}\b"|awk '{print $2}' ;
发现有些监控项 或由于数字过长而没法显示,待解决
6.mysql_version.sh mysql版本监控
MYSQL_PORT=$1; MYSQL_SOCk_DIR=`ps -ef |grep 'mysql'| grep "${MYSQL_PORT}" |grep -v 'grep' | awk -F" " '{print $16}'` ; mysql=/mysql/app/bin/mysql ; [ "${MYSQL_USER}" = '' ] && MYSQL_USER=xxx [ "${MYSQL_PASSWORD}" = '' ] && MYSQL_PASSWORD=xxxx ${mysql} -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_SOCk_DIR} -e "select version();" 2> /dev/null |awk 'END {print}'
7.mysql_status_many.conf 生成可用键 配置文件
UserParameter=mysql.discovery[*],/patrol/zabbix/bin/duoshili_discovery/discovery_mysql.sh $1 UserParameter=mysql.status_many[*],/patrol/zabbix/bin/duoshili_discovery/mysql_status2 $1 $2 UserParameter=mysql.ping_many[*],/patrol/zabbix/bin/duoshili_discovery/mysql_ping.sh $1 UserParameter=mysql.version_many[*],/patrol/zabbix/bin/duoshili_discovery/mysql_version.sh $1 UserParameter=mysqlcheck_repl[*],/patrol/zabbix/bin/duoshili_discovery/mysql_repl.sh $1 $2 UserParameter=mysql.filestyle_many[*],/patrol/zabbix/bin/duoshili_discovery/mysql_filestype