如何用zabbix监控mysql多实例

用到的主要工具: 宏(分为模板宏,主机宏,自动发现宏)

      主机宏格式:$MACRO   (直接就可以 填  值)             自动发现宏:#MACRO    (需要配合 创建的 key 取值)  

大体架构

1.agent主机 — agent 主机创建 宏变量 $MYSQLPORT ,宏变量的值为 Discovery rules的 自动发现脚本参数
2.模板 — 模板里创建自动发现规则,靠的是自动发现脚本,得到自动发现宏变量。
3.监控项– 在Discovery rules 里创建监控项,监控项名称和key值里都有自动发现宏变量,会自动生成相关端口的监控项
4.客户端 脚本和键创建,来支持整个架构运行

搭建步骤
1.创建模板

因为这个模板是 克隆 的默认 mysql监控模板,可以忽略 items,triggers。 监控项都在 Discovery rules 里。

2.为模板添加 自动发现宏(自动发现宏声明的途径就是下图的脚本,脚本里只有生成固定的格式,zabbix就会认定他是 自动发现宏)

上图 里的 mysql.discovery 就是获取 自动发现宏的 脚本,脚本是放在 agent端。

后面的 $MYSQLPORT 为此脚本执行时带的参数,$MYSQLPORT 是主机宏。

discovery rule 右边的 filters 是过滤规则的意思,比方你 只想取脚本里的 某某 自动发现宏,就可以在里面设置。 这里就只有一个自动发现宏,所有不做 配置。

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 "ttt"{#MYSQLPORT}":"${port[${key}]}"},n"    else [[ "${key}" -eq "((${#port[@]}-1))" ]]          printf 't {n'          printf "ttt"{#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 statusG;"  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

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。
超哥软件库 » 如何用zabbix监控mysql多实例