在前两篇文章中我们队keepalived做了相关介绍,这里环境还是和之前保持的一样,这次我们主要介绍vrrp_script模块,在上次介绍keepalived基础HA功能时用到了vrrp_script这个模块,此模块专门用于对集群中服务自己进行监控,与此模块一起使用的还有track_script模块,在此模块中可以引用监控脚本,命令组合,shell语句等,以实现对服务端口多方面的监控,track_script模块主要用来调用vrrp_script模块使keepalived执行对集群服务资源的检查,下面就简单介绍下vrrp_script模块厂家的几种检测机制,至于选择哪种监控方面,依据实际应用环境而定


1、通过killall命令探测服务运行状态

这种监控集群服务的方式主要是通过killall命令实现的,killall会发送一个信号到正在运行的指定命令的进程,killall可用的信号名有很多,如9的信号表示强制中断一个程序的运行,这里用到的信号为0,代号为0的信号并不表示要关闭某个程序,而表示对程序(进程)的运行状态进行监控,如果发现进程关闭或其他异常,将返回状态码1,反之,如果发现进程运行正常,将返回状态码0

vrrp_script模块正是利用了killall命令的这个特性,变相的实现了对服务运行状态的监控,在我们之前的配置文件中  

vrrp_script check_httpd {


        script "killall -0 httpd"

        interval 2

}


wKiom1eav4PQ-IpEAAAOs_IjTic332.png


这里通过 echo $? 方式显示了上面命令的返回状态码,httpd服务运行正常,因此状态返回码是0,此时check_httpd模块将返回服务检测的正常提示,接着将httpd服务关闭,再次执行检测,结果如下

HA 集群软件 keepalived 详解3_第1张图片


由于httpd服务关闭,因此状态返回码是1,此时check_httpd模块将返回服务检测失败的提示

从这个过程可以看到,vrrp_script模块其实并不关注监控脚本或监控命令是如何实现的,它仅仅通过监控脚本的返回状态码来识别集群服务是否正常,如果状态返回码是0,那么就认为服务正常,如果状态返回码是1,则认为服务障碍,明白了这个原理后,在进行自定义监控脚本的时候,只需按照这个原则来编写即可


2、检测端口的运行状态

script "


3、通过shell语句监控

script "if [ -f /var/run/httpd/httpd.pid ];then exit 0;else exit 1;fi"


4、通过脚本进行服务状态监控

这是最常见的监控方式,这里我们还是把之前的配置文件看一下

[root@centos01 keepalived]# cat keepalived.conf
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id http_master
}
vrrp_script check_httpd {
        script "/etc/keepalived/check_httpd.sh"
        interval 2
}
vrrp_instance HA_1 {
    state MASTER
    interface eth0
    virtual_router_id 80
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
notify_master "/etc/keepalived/master.sh"
notify_backup "/etc/keepalived/backup.sh"
notify_fault "/etc/keepalived/fault.sh"
track_script {
  check_httpd
}
    virtual_ipaddress {
        172.16.80.100
    }
}
/etc/keepalived/check_httpd.sh  脚本内容如下
[root@centos01 keepalived]# cat check_httpd.sh 脚本需要有执行权限
#!/bin/bash

IP=`ifconfig|grep Bcast|head -1|awk '{print $2}'|awk -F: '{print $2}'`
HTTP_STATUS=`curl -I -s $IP|head -1|wc -l`

if [ $HTTP_STATUS -gt 0 ];then

        HTTPD=0
else
        HTTPD=1

fi


exit $HTTPD


那么我们来实际测试下,将主节点httpd服务停掉,看看脚本是否能监控到及是否会自动进行切换

wKioL1eayfKTzKBfAAAPJvTjzNc116.png


主节点

wKiom1eaygngYgMkAAA1KSytqug368.png

备用节点

wKioL1eayiaDCDAIAABNkfVBJP4607.png

再次把主节点httpd服务开启

主节点

wKioL1eayk6hbd-nAABhueQsENY909.png

备用节点

wKiom1eaymHQLNy2AAArhZk5AoY755.png

可以看到现象一切都符合预期的效果