MySQL(或者其它服务)的 keepalived 高可用监控脚本
开发脚本需求:我们知道,keepalive 是基于虚拟 ip 的存活来判断是否抢占 master 的机制的,但是如果我们做了 MySQL 的 keepalived 的高可用的时候,就要考虑一种情况的发生,那就是如果机器网卡并没有断,二十由于 MySQL 服务的不稳定,或者人为的误操作,导致的服务关闭,会引起的结果就是,keepalive 并不会切换,因为并不是主 master 的虚拟 ip 不存在,而是服务已经停止了,这种情况如果不及时切换到 backup 会导致的问题,大家可想而知,所以在此和大家分享一个监控 keepalive 主 master 服务的脚本
实现的功能:当主 master 机器(vip 所在的机器)服务 down 了 会关闭自身的 keepalive 服务,让 vip 切换到备机,这样服务才能保持可用。大家可以看到,不管用 keepalive 做什么服务的高可用,只要你把监听的端口号作为监控判断的对象,其实这是一个适用范围特别广泛的脚本,希望大家能尽量写出通用脚本,这样可以提升思维的能力!如果写的有不好的地方请多指正。
- 1 #!/bin/sh
- 2 #author feifei
- 3 #date 20161212
- 4 #email eeeee@qq.com
- 5 #version 1.0
- 6 #function guard mysql service
- 7 . /etc/init.d/functions
- 8 #define var
- 9 #usage(使用方法)
- 10 if [ $# -ne 1 ];then
- 11 echo "usage:sh $0 {tcp_port}"
- 12 exit 1
- 13 fi
- 14 #define var(用netstat是我们进行判断服务是否存活的重要依据,可以基于服务名,或者端口号,建议最好是端口号,因为端口号有唯一性)
- 15 check=`netstat -lnutp|grep $1|wc -l`
- 16
- 17 #check if there is already have a same monitoring exit(守护进程的脚本,必须要判断是否已经存在一个相同的监控,不然导致资源浪费)
- 18 count=`ps -ef|grep "$0 $1"|grep -v "grep"|wc -l`
- 19
- 20 if [ $count -gt 2 ];then
- 21 echo -e "\nERROR:There is already have a same monitoring!"
- 22 exit 1
- 23 fi
- 24
- 25 function dmail(){
- 26 echo "$1-$(hostname):down" >/var/log/$1.log
- 27 mail -s "$1-$(hostname):down" 00000000@qq.com 1.log
- 28 }
- 29
- 30 function umail(){
- 31 echo "$1-switch-success" >/var/log/$1.log
- 32 mail -s "$1-switch-success" 00000000@qq.com 1.log
- 33 }
- 34
- 35 #check=`namp 192.168.1.21 $1|grep open|wc -l`(也可以用nmap命令监控一个主机某个端口号是否开启,功能类似nestat和ss)
- 36 if [ $check -eq 0 ];then
- 37 echo "$1 is not listening!pls input again!"
- 38 exit 1
- 39 else
- 40 while true
- 41 do
- 42 if [ `netstat -lnutp|grep $1|wc -l` -eq 0 ];then
- 43 echo 0
- 44 dmail $1
- 45 /etc/init.d/keepalived stop
- 46 sleep 5
- 47 ping -c 2 -W 2 192.168.1.22 &>/dev/null
- 48 if [ $? -eq 0 ];then
- 49 echo 1
- 50 umail $1
- 51 break
- 52 else
- 53 echo "$1-swith-failed" >/var/log/$1.log
- 54 mail -s "$1-switch-failed" 00000000@qq.com 1.log
- 55 break
- 56 fi
- 57 fi
- 58 done
- 59 fi
脚本简单说明:
1. 运行的条件:当前监控的端口号必须是监听状态,如果没启用会提示先启动服务
2. 实现原理:实现监控的原理是用 while 循环 + if 判断
3. 失败的处理机制:如果有心思的同学可以尝试,在服务 down 了之后,加上一些处理措施,比如说,让服务尝试重启,如果重启成功继续监控,不成功则关闭 keepalive
4. 事件的记录:每一个过程的成功与否,都要记录到相应的文件,如果有必要,进行邮件通知(一个好的运维,要懂得进行必须的故障记录,方便日后总结)
ps. 不是特别难的脚本,重在梳理过程,如果有不妥的地方希望大家指正。
来源: