如何实时检测mysql主从状态,并作邮件告警?

                                                      实时检测mysql主从状态,并作邮件告警python

 需求分析:mysql

    当咱们作完主从后,主从成功的话,Slave_IO_Running和Slave_SQL_Running两个进程的状态就为yes,可是在作主从同步时也不排除,会发生一些意外的状况,因此咱们须要写个脚原本实时检测Slave_IO_Running和Slave_SQL_Running的状态,一旦mysql主从状态出现了情况,就经过邮件发送告警,而后再作维护。sql

 

 脚本思路:bash

   定时检测mysql主从状态,说白的了就是经过脚本让系统去自我检测主从状态,若是是主从状态是正常的,那就不作告警出来,但一旦发生状态异常,就经过发送邮件给运维人员,运维人员收到告警邮件后,而后就作相关的维护处理服务器

 

 一、邮件告警,我直接用的是Python写的脚本作邮件信息发送,你也能够yum装个sendmail包,作信息发送,脚本以下。运维

[root@mysqlslave ~]# cd /python/send_mail.py
#!/usr/bin/python
#coding: utf-8
import smtplib
import sys
from email.mime.text import MIMEText
_user = "847536**@qq.com"    ##这里填写你的邮件号
_pwd  = "ilbsly******"   
##这里填写你邮件的密码 ,我这里使用的是qq邮箱(其余邮箱也能够),qq邮箱密码是要到QQ邮箱里面申请的,而后它会生成一个密码的
#_to   = "dsf@163.com"    ##这里是发送给谁,这个通常注释掉,在执行脚本的时候指定发给谁就能够了
def send_mail(to,subject,contain):
    msg = MIMEText(contain)
    msg["Subject"] = subject
    msg["From"]    = _user
    msg["To"]      = to
    try:
        s = smtplib.SMTP_SSL("smtp.qq.com", 465)
        s.login(_user, _pwd)
        s.sendmail(_user, to, msg.as_string())
        s.quit()
        with open('/tmp/zabbix.log', 'w') as f:
            f.write("%s\n%s\n%s\n"%(to,subject,contain))
#        print "Success!"
    except smtplib.SMTPException,e:
        print "Falied,%s"%e
if __name__ == "__main__":
    send_mail(sys.argv[1], sys.argv[2], sys.argv[3])


二、检测脚本编写tcp

   接下来,写个检测主从脚本,按照咱们的思路来讲,首先是把Slave_IO_Running和Slave_SQL_Running的状态获取,而后利用if语句判断,若是状态为NO就经过Python脚原本发送邮件,严重一点的,若是从服务器的MySQL服务down了,咱们也发送邮件告警,把整个过程执行过程,写的时间任务里面,这里咱们须要使用函数来实现,这个方便快捷,接下来我详细解析。ide

[root@mysqlslave ~]# cd /python/checkslave.sh 
#!/bin/bash   
send_mail (){            ##定义一个函数,用来作整合检测MySQL状态内容。

ip=`ifconfig eth0 | sed -n 2p | awk '{print $2}' | cut -d: -f2`   
##获取本地的ip,个人本地网卡为eth0,使用sed、awk、cut命令获取IP地址

hostname=`hostname`      ##获取本地的主机名

status=(`mysql -uroot -pmichael123456  -e "show slave status\G"|grep "Running" |awk '{print $2}'`)   
##经过MySQL命令获取Slave_IO_Running和Slave_SQL_Running的状态,获取出来的结果是(Yes、Yes、slave),由于有三个元素,因此咱们可使用元组来实现

netstat -ntpl | grep 3306  ##查看3306是否存在,用来作检测MySQL的状态
  
if [ $? -eq 0 ];then    
##写一个判断语句若是netstat命令执行成功话,输出$?是0,不存在$?输出结果大于0

     if [ "${status[0]}" == "Yes" ] || [ "${status[1]}" == "Yes" ] ;then 
      ##获取元组的第零个元素数和第一个元素,使用if判断,采用并集。
            echo "主从复制成功" 
     else    ##作个判断
            python /python/send_mail.py "847536944@qq.com" "$hostname:$ip-主从复制失败" "$hostname:$ip- Slave_IO_Running 或者 Slave_SQL_Running已经为NO请尽快:作维护处理"
             ##当输出的元组的结果不为Yes,而后就执行,邮件发送告警$hostname 、$ip为获取的参数
            
            sed  -i 's/^*\/10/#&/g' /etc/crontab   
            ##为了防止,它一直在邮件告警,咱们须要用sed注释掉,计划任务,这个的做用就是只容许发送故障后,
            #脚本只执行一次,固然,若是你想发两封的邮件,你也能够添加发送邮件命令两遍。
     fi
else
     python /python/send_mail.py "847536944@qq.com" "$hostname:$ip-slave主机mysql服务已经关闭" "$hostname:$ip-主机已经中止运行请尽快作维护"
     ##netstat输出$?的结果不为0,发送告警。
fi
}
$1   ##添加函数的参数,让本身决定是否执行该函数
crontab () {
  cat /etc/crontab | grep "bash $0 send_mail "   ##查找是否有计划任务
  if [ $? -eq 0 ]; then    ##作判断,有就输出有,没有就写入
     echo "The port test has been written to the time task"
  else
     echo "*/10 * * * *  root  bash $0 send_mail " >> /etc/crontab ##定义每十分钟,执行一次
  fi   
} 
crontab




三、执行结果函数

[root@mysqlslave ~]# bash /python/checkslave.sh   #执行第一次,查看不了效果

##经过函数来执行,能够发现,已经有效果了,ui

[root@mysqlslave ~]# bash /python/checkslave.sh send_mail  
Warning: Using a password on the command line interface can be insecure.
tcp        0      0 :::3306                 :::*                    LISTEN      27684/mysqld
主从复制成功
*/10 * * * *  root  bash /python/checkslave.sh send_mail 
The port test has been written to the time task

四、模拟故障

我把slave停掉了,等了几分钟后,已经能够收到邮件了,结果以下:

blob.png



五、总结

  感受写了个脚本后,发现已经不用每隔一段时刻要本身检测slave的状态了。方便了不少,固然,还有别的方法,也一样能够的作主从复制状态监控。

相关文章
相关标签/搜索