在Keepalived的配置文件中,我们可以指定Keepalived监控的网络接口,当系统或网络出现问题时就会进行主备切换。但是,很多时候我们需要对集群中特定的服务进行监控,但服务发生故障时就进行主备切换,此时只监控网络接口就无法满足我们的需求。Keepalived提供了vrrp_script调用自定义脚本的方式满足了我们的需求。
1、vrrp_script
在Keepalived中,可以通过vrrp_script调用shell命令或一个脚本,通过该命令或脚本的返回值来判断监控的资源是否出问题。当返回值为0时,Keepalived认为被监控的资源正常;当返回值为非0时,Keepalived认为被监控的资源出现了问题。
配置vrrp_script:
vrrp_script 自定义名称 { script "命令或脚本" interval 数字 fall 数字 rise 数字 } vrrp_instance VRRP实例名 { ... track_script { vrrp_script的自定义名称 } }
- script:调用shell命令或脚本
- interval:定义执行命令或脚本的时间间隔,单位秒
- fall:定义检测失败的最大次数,如设置为2表示当请求失败两次时就认为节点资源故障
- rise:定义请求成功的次数,如设置为1表示当进行一次请求成功后就认为节点资源恢复正常
- vrrp_instance中的track_script:调用vrrp_script使之生效
vrrp_script执行命令或脚本时默认使用的用户为keepalived_script,如果系统中不存在该用户,则使用root用户执行脚本。
2、使用vrrp_script监控资源的几种常用方式
2.1、通过killall命令检测服务运行状态
通过命令killall –0 进程名可以检测指定的进程是否正在运行。这里使用了killall的0信号,当killall向一个进程发出0信号时,不会结束这个进程,而是返回0或非0的值。0表示进程正在运行,而非0表示进程不存在。所以,通过这种方式可以很方便的检测一个服务是否正在运行。
e.g:监测Apache的httpd服务
vrrp_script check_httpd{ script "killall -0 httpd" ... }
2.2、检测端口运行状态
对于服务端口的监控也可以达到检测服务是否正常运行的目的。通过一个特殊的文件/dev/tcp就可以对端口进行检测,打开这个文件就相当于建立了一个socket连接。注意:/dev/tcp文件本身并不存在。
e.g:检测80端口是否打开
vrrp_script check_httpd { script "</dev/tcp/127.0.0.1/80" ... }
2.3、使用shell语句进行监控
vrrp_script还支持直接引用shell语句进行状态监控。
e.g:判断Apache的PID文件是否存在以确定Apache的服务是否正常
vrrp_script check_httpd { script "if [ -f /var/run/httpd/httpd.pid ]; then exit 0; else exit 1; fi" ... }
2.4、通过脚本进行监控
vrrp_script可以通过运行指定的脚本来对服务进行监控。在编写脚本时,只需要控制脚本的返回值为0或非0即可。