使用Zabbix监控mysql的主从同步

Zabbix 监控触发器设置


简述

在生产环境中,有一台mysql的备份服务器,上面运行着三个数据库实例的从库,也在做日志的同步工作,为了实现对该备份服务器的监控,当出现从库实例不为3或者日志同步进程不为3的时候,产生告警通知,生产使用的是zabbix监控。就想着自己写一个监控的item,通过定时取值,然后设置触发器,当有告警的时候进行通知。

在设计的时候就没有想到什么比较厉害的方法,只是通过ps查看进程的方式,获取mysqld_safe的数量,因为运行了三个从库实例,自己写的多实例启动脚本,在脚本中就是通过该命令启动的数据库,所以在做的时候就是过滤这个关键字。

对于日志的同步,也是用的这种方式进行统计的。

过程

1.编写监控命令

在设计的时候,选择使用ps命令,过滤的命令和结果如下:

[root@mysqlbackup opt]# ps -ef|grep mysqld_safe|grep -v grep|wc -l
3
[root@mysqlbackup opt]# ps -ef|grep mysqlbinlog|grep -v grep|wc -l
3

上面就是直接过滤关键字,而获取到值,因为需求很简单,只有当着两个值,不为3的时候,就说明出现了mysql的同步异常,这个时候就需要发送告警通知给管理员来进行处理了。所以这两条命令就可以了。

为了写的高端一点,选择的是写脚本的方式,因为过滤的命令格式都是一样的,只有关键字是不同的,所以写个脚本case一下。脚本如下:

[root@mysqlbackup opt]# cat instance_count.sh 
#/bin/bash 
# monitor mysql instance and binlog instance 
function instance_count(){
    NAME=$1
    # /bin/ps -ef|grep $NAME|grep -v grep|wc -l
    case $NAME in
    1)
        /bin/ps -ef|grep mysqld_safe|grep -v grep|wc -l
        ;;
    2)
        /bin/ps -ef|grep mysqlbinlog|grep -v grep|wc -l
        ;;
    *)
        echo "Usage $0 {mysql|mysqlbinlog}"
    esac
}

main(){
    instance_count $1
}

main $1

实际上就是通过参数的形式,将要获取的值传入,然后返回,可以通过本地执行的方式,获取这些值。获取mysql实例数是参数1,获取mysqlbinlog日志同步的实例数是参数2,输入其他参数,直接报错。

2.编写item_key

基于之前的脚本,在zabbix-agentd.d目录下,编写一个conf文件,用来定义key,调用刚才创建的脚本进行传参。

[root@mysqlbackup opt]# cat /etc/zabbix/zabbix_agentd.d/mysql.conf 
#UserParameter=mysql.MysqlInstanceCount,ps -ef|grep mysqld_safe |grep -v grep|wc -l
#UserParameter=mysql.MysqlbinlogCount,ps -ef|grep mysqlbinlog |grep -v grep|wc -l
UserParameter=instance.count[*],/opt/instance_count.sh $1

脚本编写完成之后,需要重启zabbix-agent才能生效。

3.获取item

在zabbix-server上通过zabbix_get命令。获取指定的值。

[root@Zabbix-server zabbix]# zabbix_get -s 192.168.1.120 -p 10050 -k instance.count[2]
3
[root@Zabbix-server zabbix]# zabbix_get -s 192.168.1.120 -p 10050 -k instance.count[1]
3

在zabbix-server上能够通过命令成功获取这些值,表明该item已经可以使用,下面就可以开始在web页面上进行配置了。

4.item配置

在这里我选择的是创建一个模板,然后在模板中创建一个应用application,然后再创建两个item,name分别为MySQLInstanceCount和MySQLBinlogCount,对应的key值分别为instance.count[1]和instance.count[2],至于取数周期和保留期,可以选择默认,也可以适当调整。

配置完成后,就可以在最新数据中,获取这两个值。

5.触发器配置trigger

为了实现告警短信的通知,选择配置两个触发器,当出现值不为3的时候,就触发告警,开始选择用的是last方法,意思就是获取该item的最近的一个值。当该值不为3的时候,则产生告警,编辑的表达式如下所示:

{mysql:instance.count[1].last()}<>3

后来考虑到误报,或者是短时间的异常告警,所以修改了表达式,选择的是count,当最近的5次采集中,不为3的采集大于2次时,就产生告警。这样也就减少了告警的频次。

{mysql:instance.count[1].count(#5,3,ne,0)}>2

主从状态监控

由于这台机器120是一个专门来做从库和备份的机器,上面运行了3个从库,同时还在做日志的备份,所以要对数据库的主从状态进行一下监控,在这里做的很简单,因为在数据库的主从中,有两个很关键的指标,也就是IO_STATUS和SQL_STATUS,只有当这两个值都为Yes的时候,就能说明主从状态是正常的。所以在做mysql主从监控的时候,也就只监控这两个指标就可以了。

选择的是通过远程登录mysql执行命令的方式,获取slave的状态信息,然后通过截取相关字段,最后计算Yes的个数,当个数位2的时候,表明主从状态是正常的。

下面写的一个简单的监控脚本,比较low。

#!/bin/bash 
# monitor mysql slave status

USER_SELECT=$1
COMMAND_SHOW="show slave status\G;"
case $USER_SELECT in
1)
    MYSQL_SERVER=192.168.1.108
    MYSQL_PORT=3306
    MYSQL_USER=root
    MYSQL_PASSWORD="password"
    ;;
2)
    MYSQL_SERVER=192.168.1.120
    MYSQL_PORT=3306
    MYSQL_USER=root
    MYSQL_PASSWORD="password"
    ;;
3)
    MYSQL_SERVER=192.168.1.120
    MYSQL_PORT=3307
    MYSQL_USER=root
    MYSQL_PASSWORD="password"
    ;;
4)
    MYSQL_SERVER=192.168.1.120
    MYSQL_PORT=3308
    MYSQL_USER=root
    MYSQL_PASSWORD="password"
    ;;
*)
    echo "Usage $0 {108|120}"
esac

/usr/local/mysql/bin/mysql -h$MYSQL_SERVER -P$MYSQL_PORT -u$MYSQL_USER -p$MYSQL_PASSWORD -e '$COMMAND_SHOW' 2>/dev/null|grep -E 'Slave_IO_Running|Slave_SQL_Running'|grep Yes

因为有4个实例,所以写了一个简单的case,不同的实例用不同的端口、地址、用户名和密码。然后还是通过命令去查询的 mysql -e 'show slave status\G;'获取slave的状态,由于是命令执行,密码直接输入的,会弹出提示,不安全的提示,所以做了一个简单粗暴的,将所有的错误信息,全部打入到/dev/null中,当系统出现其他告警的时候,也就看不见了,但是仅仅是为了监控这两个状态,所以可以忽略。

创建zabbix的监控item,编写一个key的定义。

[root@mysqlbackup ~]# cat /etc/zabbix/zabbix_agentd.d/mysql_slave.conf 
UserParameter=mysql.slave.status[*],/opt/slave_status_all.sh $1

跟之前的脚本一样,输入1 2 3 4,监控不同的数据库实例的主从状态,在server上指定key进行查询。剩下的就跟正常的操作一样了。

在做触发器的时候,只是判断,最后的一次取值,不为2,就产生告警。

posted @ 2019-04-29 09:09  波波波波波  阅读(562)  评论(0编辑  收藏  举报