一般狀況下,利用keepalived作熱備,其中一臺設置爲master,一臺設置爲backup。當master出現異常後,backup自動切換爲master。當backup成爲master後,master恢復正常後會再次搶佔成爲master,致使沒必要要的主備切換。所以能夠將兩臺keepalived初始狀態均配置爲backup,設置不一樣的優先級,優先級高的設置nopreempt解決異常恢復後再次搶佔的問題。 bash
然而keepalived只能作到對網絡故障和keepalived自己的監控,即當出現網絡故障或者keepalived自己出現問題時,進行切換。可是這些還不夠,咱們還須要監控keepalived所在服務器上的其餘業務進程,根據業務進程的運行狀態決定是否須要進行主備切換。這個時候,咱們能夠經過編寫腳本對業務進程進行檢測監控。 服務器
例如編寫個簡單腳本查看haproxy進程是否存活 網絡
#!/bin/bash
ide
count = `
ps
aux |
grep
-
v
grep
|
grep
haproxy |
wc
-l`
code
if
[ $count > 0 ];
then
進程
exit
0
ip
else
it
exit
1
io
fi
ast
在keepalived的配置文件中增長相應配置項
vrrp_script checkhaproxy
{
script
"/home/check.sh"
interval 3
weight -20
}
vrrp_instance
test
{
...
track_script
{
checkhaproxy
}
...
}
keepalived會定時執行腳本並對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。
若是腳本執行結果爲0,而且weight配置的值大於0,則優先級相應的增長
若是腳本執行結果非0,而且weight配置的值小於0,則優先級相應的減小
其餘狀況,維持本來配置的優先級,即配置文件中priority對應的值。
這裏須要注意的是:
1) 優先級不會不斷的提升或者下降
2) 能夠編寫多個檢測腳本併爲每一個檢測腳本設置不一樣的weight
3) 無論提升優先級仍是下降優先級,最終優先級的範圍是在[1,254],不會出現優先級小於等於0或者優先級大於等於255的狀況
這樣能夠作到利用腳本檢測業務進程的狀態,並動態調整優先級從而實現主備切換。
可是利用該方式會存在一個問題,例如: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服務)的方式,作到業務進程出現問題時完成主備切換。