7. 监控MySQL主从状态

在生产环境里,常见的MySQL架构使用最多的就是主从了,所以对于主从是否同步数据的监控尤为重要。如果使用了专业的监控软件(如zabbix)监控MySQL,那么选择监控工具提供的模板或插件去监控非常方便,但如果涉及到一些特殊要求就另当别论了。当然还可以写shell脚本来实现定制化的需求,本案例需要写一个shell脚本来监控MySQL主从。

具体要求如下:

1)每分钟检测一次,本次执行脚本时要检测上一次是否执行完成,如果还未完成则本次不执行;

2)如果不同步需要发送告警邮件给admin@admin.com;

3)做告警收敛,在没有解决问题之前每隔30分钟发一次告警邮件;

4)假设mysql账户为root,密码是tpH40kznv 。

邮件脚本如下:

#!/usr/bin/python
#coding:utf-8
import smtplib
from email.mine.text import MIMEText
import sys
mail_host = 'stmp.163.com'
mail_user = 'test@163.com'
mail_pass = 'your_mail_password'
mail_postfix = '163.com'
def send_mail(to_list,subject,content):
    me = "zabbix 监控告警平台"+"<"+mail_user+"@"+mail_postfix+">"
    msg = MIMEText(content,'plain','utf-8')
    msg['Subject'] = subject
    msg['From'] = me
    msg['to'] = to_list
    try:
        s = smtplib:SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pass)
        s.sendmail(me,to_list,msg.as_string())
        s.close()
        return True
    except Exception,e:
        print str(e)
        return False
if __name__ == "__main__"
    send_mail(sys.argv[1], sys.argv[2], sys.argv[3])

参考脚本如下:

# vim /usr/local/sbin/mysql_check.sh
#!/bin/bash
#检测MySQL主从是否同步

#把脚本名字存入变量s_name
s_name=`echo $0 |awk -F '/' '{print $NF}'`
mysql_c="mysql -uroot -ptpH40kznv"

#定义收件人邮箱
mail="/usr/local/sbin/mail.py"
mail_user=admin@admin.com

#该函数实现邮件告警收敛
m_mail()
{
    log=$1
    t_s=`date +%s`
    t_s2=`date -d "1 hour ago" +%s`
    if [ ! -f /tmp/$log ]
    then
        touch /tmp/$log         #创建$log文件
        chattr +a /tmp/$log         #增加a权限,仅允许追加内容
        echo $t_s2 >> /tmp/$log         #第一次告警,可直接写入1小时前的时间戳
    fi
    
    t_s2=`tail -1 /tmp/$log |awk '{print $1}'`          #查看$log文件最后一行的时间戳
    echo $t_s >> /tmp/$log          #取出最后一行即上次告警的时间戳后,立即写入当前的时间戳
    v=$[$t_s-$t_s2]         #取两次时间戳差值
    if [ $v -gt 1800 ]          #差值如果超过1800s,立即发邮件
    then
        python $mail $mail_user $1 "`cat $2`" 2>/dev/null         #发邮件,$2为mail函数第二个参数,这里是一个文件
        echo "0" > /tmp/$log.count          #定义计时器临时文件,并写入0
    else
        if [ ! -f /tmp/$log.count ]
        then
            echo "0" > /tmp/$log.count          #如果计时器临时文件不存在,需要创建并写入0
        fi
        
        nu=`cat /tmp/$log.count`
        nu2=$[$nu+1]        #30分钟内每发生一次告警,计数器加1
        echo $nu2 > /tmp/$log.count
        
        if [ $nu2 -gt 30 ]
        then
            python $mail $mail_user "$1 30min" "`cat $2`" 2>/dev/null
            echo "0" > /tmp/$log.count          #第二次告警后,计数器归0
        fi
    fi
}

#把进程情况存入临时文件
ps aux |grep "$s_name" |grep -vE "$$|grep" > /tmp/ps.tmp        #$$为本进程PID
p_n=`wc -l /tmp/ps.tmp |awk '{print $1}'`

#当进程数大于0,则说明上次的脚本还未执行完
if [ $p_n -gt 0 ]
then
    exit
fi

#先执行一条 show processlist,看是否执行成功
$mysql_c -e "show processlist" >/tmp/mysql_pro.log 2>/tmp/mysql_log.err

#如果上一条命令执行不成功,说明这个MySQL服务出现了问题
if [ $? -gt 0 ]
then
    m_mail mysql_service_error /tmp/mysql_s.log
else
    $mysql_c -e "show slave status\G" > /tmp/mysql_s.log
    n1=`wc -l /tmp/mysql_s.log |awk '{print $1}'`
    
    if [ $n1 -gt 0 ]
    then
        y1=`grep 'Slave_IO_Running:' /tmp/mysql_s.log |awk -F : '{print $2}' |sed 's/ //'`
        y1=`grep 'Slave_MYSQL_Running:' /tmp/mysql_s.log |awk -F : '{print $2}' |sed 's/ //'`
        
        if [ $y1 == "No" ] || [ $y2 == "No" ]
        then
            m_mail mysql_slavestatus_error /tmp/mysql_s.log
        fi
    fi
fi

增加计划任务:

* * * * * /bin/bash /usr/local/sbin/mysql_check.sh

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值