在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即可。