在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