Keepalived詳解(四)
Keepalived基礎HA功能時用到了vrrp_script這個模塊,此模塊專門用於對集群中服務資源進行監控。與此模塊一起使用的還有track_script模塊,在此模塊中可以引入監控腳本、命令組合、shell語句等,以實現對服務、端口等多方面的監控。track_script模塊主要用來調用“vrrp_script”模塊使Keepalived執行對集群服務資源的檢測。
此外,在vrrp_script模塊中可以定義對服務資源檢測的時間間隔、權重等參數,通過vrrp_script和track_script組合,可以實現對集群資源的監控並改變集群優先級,進而實現Keepalived的主、備節點切換。
1.通過killall命令探測服務運行狀態:
這種監控集群服務的方式主要是通過killall命令實現的。killall會發送一個信號到正在運行的指定命令的進程。如果沒指定信號名,則發送SIGTERM。SIGTERM也是信號名的一種,代號為15,它表示以正常的方式結束程序的運行。其實killall可用的信號名有很多,可通過“killall -l ”命令顯示所有信號名列表,其中每個信號名代表對進程的不同執行方式,例如,代號為9的信號表示將強制中斷一個程序的運行。這裏要用到的信號為0,代號為0的信號並不表示要關閉某個程序,而表示對程序(進程)的運行狀態進行監控,如果發現進程關閉或其他異常,將返回狀態碼1,反之,如果發現進程運行正常,將返回狀態碼0.vrrp_script模塊正是利用了killall命令的這個特性,變相實現了對服務運行狀態的監控。
例:
vrrp_script check_mysqld {
script "killall -0 mysqld"
interval 2
}
track_script {
check_mysqld
}
這個例子定義了一個服務監控模塊check_mysqld,其采用的監控的方式是通過“killall -0 mysqld”的方式,其中“interval”選項檢查的時間間隔,即2s執行一次檢測。
在MySQL服務運行正常情況下,通過killall命令檢測結果如下:
[root@keepalived-master ~]# killall -0 mysqld
[root@keepalived-master ~]# echo $?
0
這裏通過“echo $?”方式顯示了上個命令的返回狀態碼,MySQL服務運行正常,因此返回的狀態碼為0,此時check_mysqld模塊將返回服務檢測正常的提示。接著將MySQL服務關閉,再次執行檢測,結果如下:
[root@keepalived-master ~]# killall -0 mysqld
mysqld: 沒有進程被殺死
[root@keepalived-master ~]# echo $?
1
由於MySQL服務被關閉,因此返回的狀態碼為1,此時check_mysqld模塊將返回服務檢測失敗的提示。然後根據vrrp_script模塊中設定的“weight”值重新設置Keepalived 主、備節點的優先級,進而引發主、備節點發生切換。
從這個過程可以看到,vrrp_script模塊其實並不關註監控腳本或監控命令是如何實現的,它僅僅通過監控腳本的返回狀態碼來識別集群服務是否正常,如果返回狀態碼為0,那麽就認為服務正常,如果返回狀態碼為1,則認為服務故障。明白了這個原理之後,在進行自定義監控腳本的時候,只需按照這個原則來編寫即可。
2.檢測端口運行狀態:
檢測端口的運行狀態也是最常見的服務監控方式,在keepalived的vrrp_script模塊中可以通過如下方式對本機的端口進行檢測:
vrrp_script check_httpd {
script "</dev/tcp/127.0.0.1/80"
interval 2
fall 2
rise 1
}
track_script {
check_httpd
}
在這個例子中,通過 "</dev/tcp/127.0.0.1/80"這樣的方式定義了一個對本機80端口的狀態檢測,其中,“fail”選項表示檢測到失敗的最大次數,也就是說,如果請求失敗兩次,就認為此節點資源發生故障,將進行切換操作;“rise”表示如果請求一次成功,就認為此節點資源恢復正常。
3.通過shell語句進行狀態監控:
在Keepalived的vrrp_script模塊中甚至可以直接引用shell語句進行狀態監控,例如:
vrrp_script chk_httpd {
script "if [ -f /var/run/httpd/httpd.pid ]; then exit 0;else exit 1; fi"
interval 2
fall 1
rise 1
}
track_script {
chk_httpd
}
在這個例子中,通過一個shell判斷語句,檢測httpd.pid文件是否存在,如果存在,就認為狀態正常,否則認為狀態異常,這種監測方式對於一些簡單的應用監控或者流程監控非常有用。從這裏也可以得知,vrrp_script模塊支持的監控方式十分靈活。
4. 通過腳本進行服務狀態監控:
這是最常見的監控方式,其監控過程類似於nagios的執行方式,不同的是,這裏只有0、1兩種返回狀態,例如:
vrrp_script chk_mysqld {
script "/etc/keepalived/check_mysqld.sh"
interval 2
}
track_script {
chk_mysqld
}
其中,check_mysqld.sh的內容為:
#!/bin/bash
/usr/bin/mysql -e "show status;" > /dev/null 2>&1
if [ $? -eq 0 ];then
MYSQL_STATUS=0
else
MYSQL_STATUS=1
fi
exit $MYSQL_STATUS
這是一個最簡單的實現MySQL服務狀態檢測的shell腳本,它通過登錄MySQL數據庫後執行查詢操作來檢測MySQL運行是否正常,如果檢測正常,將返回狀態碼0,否則返回狀態碼1。其實,很多在nagios下運行的腳本,只要稍作修改,既可在這裏使用,非常方便。
Keepalived詳解(四)