Linux上MySQL主从同步监控脚本实现

    之前公司的B2B平台的MySQL我给配了主从同步,所谓主从同步,也叫主从复制,等等,就是将主服务器上的数据库和一台备用服务器上的数据库做同步,主服务器的数据更新通过MySQL的binlog同步到从服务器,通过主从同步还可以做数据库的读写分离,由于公司B2B平台业务非常少,所以并没做完全的读写分离,即将主数据库数据更新同步到从数据库。除此之外,还做了主从双向同步,因为从服务器上布了邮件服务,又定时任务扫描表发送邮件,并更新邮件状态,所以从数据库也有这一点写的操作,所以也就做了主从双向同步。刚配置好的时候没想太多,但后来遇到些问题,比如一方在写入的时候出现了问题导致主从同步就断开了(但这时我还不知道,导致公司业务小姐姐问我为什么询盘感觉少了,我赶紧看数据库再一看slave状态,竟然断开有几天了。。还好公司业务量少),然后我就在想,应该给主从同步做监控,并且自动恢复,发送邮件给我,于是就有了这篇博客的由来,记录一番。

    嘿嘿,下面就是脚本,其实思路很简单,查看MySQL主从状态应该都会,就是进入MySQL,然后show master status和show slave status \G,然后我要做的其实就是通过脚本定时进入MySQL然后查看状态得到信息,再通过grep和awk对文本进行解析,然后关键的slave_sql_running、slave_io_running和last_error,最后按一定格式打印到日志里。ps:网上找了一些脚本,但都不能用,只好自己学习了grep和awk的用法,学艺不精,凑合用应该可以,欢迎指摘

#!/bin/sh
# monitor_mysql_slave status
ip=192.168.1.191
cmd=/usr/bin/mysql
mysqluser=user
mysqlpwd=password
log=/mnt/b2bhome/log/mysql-monitor/monitor.log
while true
do
  datetime=`date '+%Y-%m-%d %H:%M:%S'`
  # echo $datetime
  array=$($cmd -u$mysqluser -p$mysqlpwd -e "show slave status\G"|grep -iE "_running|last_error")
  # echo $array
  io_running=`echo $array|grep -i slave_io_running|awk '{print $2}'`
  # echo $io_running
  sql_running=`echo $array|grep -i slave_sql_running|awk '{print $2}'`
  # echo $sql_running
  last_error=`echo $array|grep -i last_error|awk '{print $2}'`
  # echo $last_error
  if [ "$io_running" == "Yes" -a "$sql_running" == "Yes" ]
  then
    echo "$datetime | OK | Slave is running!" >> $log
  else
    echo "$datetime | FAIL | Slave is not running!" >> $log
    echo "$datetime | FAIL | $last_error" >> $log
    $cmd -u$mysqluser -p$mysqlpwd -e "stop slave;set global sql_slave_skip_counter=1;start slave;exit;"
    char="$datatime $ip MySQL slave is not running"
    echo "$last_error"|mail -s "$char" 1******[email protected]
    break
  fi
  sleep 20
done

前面ip、cmd、mysqluser、mysqlpass、log都是定义的常量,本机ip啊,mysql的命令目录啊,mysql用户密码啊,输出日志文件啊,下面的shell就是先登入MySQL,再查询从机状态,并将slave_io_running、slave_sql_running、last_error的值存在array字符串中通过grep对array进行筛选,-i代表不区分大小写,筛选出包含上述字段的行,此时筛选出的结果是Key:Value的形式,然后再通过awk进行解析,print $2代表第二个位置的字段,而像:这样的特殊符号会被认为是分隔符,所以value就是$2,这样就取到了。最后对slave_io_running和slave_sql_running进行判断,只有他俩都为yes才是正常状态,输出ok日志,否则,输出fail日志,并进入MySQL,关掉slave,设置sql_slave_skip_counter为1,即跳过错误的这一行binlog,再重新开启slave,并调用Linux系统的sendmail服务发送邮件给我。对了,sleep 20即休眠20秒,每20秒执行一次。

       关于grep和awk命令,我也学习了,后续也会写篇笔记。值得注意的是,最后那个调用sendmail服务发送邮件,我这里并没有成功,好像是机器hostname的原因,后来我采取了只打印日志,使用logstash来分析捕捉错误日志,并使用输出插件里的email来发送邮件(不幸的是,这里的email也不行,使用qq和163的都连接不上,最后无奈只用第三方邮件服务,通过curl命令来请求调用,关于logstash分析监控日志我后续也写篇笔记记录下)。

你可能感兴趣的:(Linux)