zoukankan      html  css  js  c++  java
  • 如何用zabbix监控mysql多实例

    agent上起了多了 mysql实例,占用不同的端口,agent 仅在初始状况下,塞入脚本和 键配置,然后重启。 以后维护的时候(mysql端口变动),要做到 不能 动agent,力争 只在 web端 或者server端做修改 就能自动监控到对应端口。
    用到的主要工具: 宏(分为模板宏,主机宏,自动发现宏)
          主机宏格式:$MACRO   (直接就可以 填  值)
               自动发现宏:#MACRO    (需要配合 创建的 key 取值)
    
    大体架构

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

    搭建步骤
    1.创建模板
     
    如何用zabbix监控mysql多实例如何用zabbix监控mysql多实例
     

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

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

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

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

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

    3.创建监控项(监控项和监控的脚本都是要改的,因为自动发现功能,至少脚本会多了一个参数)
     
    如何用zabbix监控mysql多实例如何用zabbix监控mysql多实例
    4.创建 主机宏
     
    如何用zabbix监控mysql多实例如何用zabbix监控mysql多实例

    点开主机,添加主机宏,宏名称是 自动发现脚本里的 参数, 宏的值就是 此 主机上需要监控的端口。

    这样就实现了 只要改动主机宏的 值,就可以改变主机宏的监控项。

    脚本展示
    1.discovery_mysql.sh 自动发现端口脚本 (网上抄的脚本做了修改)
     res=`echo $1| sed "s/_/
    /g"`;
    port=($res)
    printf '{
    '
    printf '	"data":[
    '
    for key in ${!port[@]}
    do
        if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];
    then
            printf '	 {
    '
            printf "			"{#MYSQLPORT}":"${port[${key}]}"},
    "
       
    else [[ "${key}" -eq "((${#port[@]}-1))" ]]
            printf '	 {
    '
            printf "			"{#MYSQLPORT}":"${port[${key}]}"}
    "
    fi
    done
    printf '	 ]
    '
    printf '}
    '
    

    执行实例: 以_ 为分隔符,格式化输出 自动发现宏
    ./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 "${var}"|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 "${var}"|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
  • 相关阅读:
    C#关键字
    委托
    async和await异步编程
    IOC、DI,IoC容器
    数据库脏读、幻读
    关于vue 从零开始的搭建注意事项
    C#.NET WebApi返回各种类型(图片/json数据/字符串)
    win7下IIS配置以及域名映射方法
    18/11月 日常总结
    Js 数组去重的几种方法总结
  • 原文地址:https://www.cnblogs.com/linuxprobe-sarah/p/10961881.html
Copyright © 2011-2022 走看看