在前两篇文章中我们队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
}
这里通过 echo $? 方式显示了上面命令的返回状态码,httpd服务运行正常,因此状态返回码是0,此时check_httpd模块将返回服务检测的正常提示,接着将httpd服务关闭,再次执行检测,结果如下
由于httpd服务关闭,因此状态返回码是1,此时check_httpd模块将返回服务检测失败的提示
从这个过程可以看到,vrrp_script模块其实并不关注监控脚本或监控命令是如何实现的,它仅仅通过监控脚本的返回状态码来识别集群服务是否正常,如果状态返回码是0,那么就认为服务正常,如果状态返回码是1,则认为服务障碍,明白了这个原理后,在进行自定义监控脚本的时候,只需按照这个原则来编写即可
2、检测端口的运行状态
script "</dev/tcp/127.0.0.1/80"
3、通过shell语句监控
script "if [ -f /var/run/httpd/httpd.pid ];then exit 0;else exit 1;fi"
4、通过脚本进行服务状态监控
这是最常见的监控方式,这里我们还是把之前的配置文件看一下
[[email protected] 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 脚本内容如下 [[email protected] 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 echo $HTTPD exit $HTTPD
那么我们来实际测试下,将主节点httpd服务停掉,看看脚本是否能监控到及是否会自动进行切换
主节点
备用节点
再次把主节点httpd服务开启
主节点
备用节点
可以看到现象一切都符合预期的效果