通常情況下,利用keepalived做熱備,其中一台設置為master,一台設置為backup。當master出現異常后,backup自動切換為master。當backup成為master后,master恢復正常后會再次搶占成為master,導致不必要的主備切換。因此可以將兩台keepalived初始狀態均配置為backup,設置不同的優先級,優先級高的設置nopreempt解決異常恢復后再次搶占的問題。
1、vrrp_script能做什么
keepalived只能做到對網絡故障和keepalived本身的監控,即當出現網絡故障或者keepalived本身出現問題時,進行切換。但是這些還不夠,我們還需要監控keepalived所在服務器上的其他業務進程,比如說nginx,keepalived+nginx實現nginx的負載均衡高可用,如果nginx異常,僅僅keepalived保持正常,是無法完成系統的正常工作的,因此需要根據業務進程的運行狀態決定是否需要進行主備切換。這個時候,我們可以通過編寫腳本對業務進程進行檢測監控。
例如:編寫個簡單腳本查看haproxy進程是否存活
#!/bin/bash count = `ps aux | grep -v grep | grep haproxy | wc -l` if [ $count > 0 ]; then exit 0 else exit 1 fi
在keepalived的配置文件中增加相應配置項
vrrp_script checkhaproxy { script "/home/check.sh" interval 3 weight -20 } vrrp_instance test { ... track_script { checkhaproxy } ... }
2、優先級更新策略
keepalived會定時執行腳本並對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。
如果腳本執行結果為0,並且weight配置的值大於0,則優先級相應的增加
如果腳本執行結果非0,並且weight配置的值小於0,則優先級相應的減少
其他情況,維持原本配置的優先級,即配置文件中priority對應的值。
這里需要注意的是:
1) 優先級不會不斷的提高或者降低
2) 可以編寫多個檢測腳本並為每個檢測腳本設置不同的weight
3) 不管提高優先級還是降低優先級,最終優先級的范圍是在[1,254],不會出現優先級小於等於0或者優先級大於等於255的情況
這樣可以做到利用腳本檢測業務進程的狀態,並動態調整優先級從而實現主備切換。
3、vrrp_script中節點權重改變算法
在Keepalived集群中,其實並沒有嚴格意義上的主、備節點,雖然可以在Keepalived配置文件中設置“state”選項為“MASTER”狀態,但是這並不意味着此節點一直就是Master角色。控制節點角色的是Keepalived配置文件中的“priority”值,但並它並不控制所有節點的角色,另一個能改變節點角色的是在vrrp_script模塊中設置的“weight”值,這兩個選項對應的都是一個整數值,其中“weight”值可以是個負整數,一個節點在集群中的角色就是通過這兩個值的大小決定的。
3.1、不設置weight
在vrrp_script模塊中,如果不設置“weight”選項值,那么集群優先級的選擇將由Keepalived配置文件中的“priority”值決定,而在需要對集群中優先級進行靈活控制時,可以通過在vrrp_script模塊中設置“weight”值來實現。
3.2、設置weight
vrrp_script 里的script返回值為0時認為檢測成功,其它值都會當成檢測失敗;
-
weight 為正時,腳本檢測成功時此weight會加到priority上,檢測失敗時不加;
-
主失敗:
-
主 priority < 從 priority + weight 時會切換。
-
-
主成功:
-
主 priority + weight > 從 priority + weight 時,主依然為主
-
-
-
weight 為負時,腳本檢測成功時此weight不影響priority,檢測失敗時priority – abs(weight)
-
主失敗:
-
主 priority – abs(weight) < 從priority 時會切換主從
-
-
主成功:
-
主 priority > 從priority 主依然為主
-
-
4、配置不搶占nopreempt帶來的問題
例如:A,B兩台keepalived
A的配置大概為:
vrrp_script checkhaproxy { script "/etc/check.sh" interval 3 weight -20 } vrrp_instance test { .... state backup priority 80 nopreempt track_script { checkhaproxy } .... }
B的配置大概為:
vrrp_script checkhaproxy { script "/etc/check.sh" interval 3 weight -20 } vrrp_instance test { .... state backup priority 70 track_script { checkhaproxy } .... }
A,B同時啟動后,由於A的優先級較高,因此通過選舉會成為master。當A上的業務進程出現問題時,優先級會降低到60。此時B收到優先級比自己低的vrrp廣播包時,將切換為master狀態。那么當B上的業務出現問題時,優先級降低到50,盡管A的優先級比B的要高,但是由於設置了nopreempt,A不會再搶占成為master狀態。
所以,可以在檢測腳本中增加殺掉keepalived進程(或者停用keepalived服務)的方式,做到業務進程出現問題時完成主備切換。
5、參考文章
keepalived之vrrp_script總結:https://my.oschina.net/hncscwc/blog/158746
Keepalived雙主模型中vrrp_script中權重改變故障排查:http://blog.51cto.com/xxrenzhe/1405571
Keepalived中Master和Backup角色選舉策略:https://www.linuxidc.com/Linux/2014-08/105884.htm