在Keepalived的配置文件中,咱们能够指定Keepalived监控的网络接口,当系统或网络出现问题时就会进行主备切换。可是,不少时候咱们须要对集群中特定的服务进行监控,但服务发生故障时就进行主备切换,此时只监控网络接口就没法知足咱们的需求。Keepalived提供了vrrp_script调用自定义脚本的方式知足了咱们的需求。html
在Keepalived中,能够经过vrrp_script调用shell命令或一个脚本,经过该命令或脚本的返回值来判断监控的资源是否出问题。当返回值为0时,Keepalived认为被监控的资源正常;当返回值为非0时,Keepalived认为被监控的资源出现了问题。shell
配置vrrp_script:网络
vrrp_script 自定义名称 { script "命令或脚本" interval 数字 fall 数字 rise 数字 } vrrp_instance VRRP实例名 { ... track_script { vrrp_script的自定义名称 } }
vrrp_script执行命令或脚本时默认使用的用户为keepalived_script,若是系统中不存在该用户,则使用root用户执行脚本。socket
经过命令killall –0 进程名能够检测指定的进程是否正在运行。这里使用了killall的0信号,当killall向一个进程发出0信号时,不会结束这个进程,而是返回0或非0的值。0表示进程正在运行,而非0表示进程不存在。因此,经过这种方式能够很方便的检测一个服务是否正在运行。tcp
vrrp_script check_httpd{ script "killall -0 httpd" ... }
对于服务端口的监控也能够达到检测服务是否正常运行的目的。经过一个特殊的文件/dev/tcp就能够对端口进行检测,打开这个文件就至关于创建了一个socket链接。注意:/dev/tcp文件自己并不存在。code
vrrp_script check_httpd { script "</dev/tcp/127.0.0.1/80" ... }
vrrp_script还支持直接引用shell语句进行状态监控。htm
vrrp_script check_httpd { script "if [ -f /var/run/httpd/httpd.pid ]; then exit 0; else exit 1; fi" ... }
vrrp_script能够经过运行指定的脚原本对服务进行监控。在编写脚本时,只须要控制脚本的返回值为0或非0便可。blog