keepalived之vrrp_script詳解


通常情況下,利用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時認為檢測成功其它值都會當成檢測失敗

  1. weight 為正時腳本檢測成功時此weight會加到priority上,檢測失敗時不加;

    1. 主失敗:

      1. 主 priority < 從 priority + weight 時會切換。

    2. 主成功:

      1. 主 priority + weight > 從 priority + weight 時,主依然為主

  2. weight 為負時,腳本檢測成功時此weight不影響priority,檢測失敗時priority – abs(weight)

    1. 主失敗:

      1. 主 priority – abs(weight) < 從priority 時會切換主從

    2. 主成功:

      1. 主 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM