在Keepalived叢集中,其實並沒有嚴格意義上的主、備節點,雖然可以在Keepalived配置檔案中設定“state”選項為“MASTER”狀態,但是這並不意味著此節點一直就是Master角色。控制節點角色的是Keepalived配置檔案中的“priority”值,但並它並不控制所有節點的角色,另一個能改變節點角色的是在vrrp_script模組中設定的“weight”值,這兩個選項對應的都是一個整數值,其中“weight”值可以是個負整數,一個節點在叢集中的角色就是通過這兩個值的大小決定的。

在一個一主多備的Keepalived叢集中,“priority”值最大的將成為叢集中的Master節點,而其他都是Backup節點。在Master節點發生故障後,Backup節點之間將進行“民主選舉”,通過對節點優先順序值“priority”和““weight”的計算,選出新的Master節點接管叢集服務。

在vrrp_script模組中,如果不設定“weight”選項值,那麼叢集優先順序的選擇將由Keepalived配置檔案中的“priority”值決定,而在需要對叢集中優先順序進行靈活控制時,可以通過在vrrp_script模組中設定“weight”值來實現。下面列舉一個例項來具體說明。

假定有A和B兩節點組成的Keepalived叢集,在A節點keepalived.conf檔案中,設定“priority”值為100,而在B節點keepalived.conf檔案中,設定“priority”值為80,並且A、B兩個節點都使用了“vrrp_script”模組來監控mysql服務,同時都設定“weight”值為10,那麼將會發生如下情況。

在兩節點都啟動Keepalived服務後,正常情況是A節點將成為叢集中的Master節點,而B自動成為Backup節點,此時將A節點的mysql服務關閉,通過檢視日誌發現,並沒有出現B節點接管A節點的日誌,B節點仍然處於Backup狀態,而A節點依舊是Master狀態,在這種情況下整個HA叢集將失去意義。

下面就分析一下產生這種情況的原因,這也就是Keepalived叢集中主、備角色選舉策略的問題。下面總結了在Keepalived中使用vrrp_script模組時整個叢集角色的選舉演算法,由於“weight”值可以是正數也可以是負數,因此,要分兩種情況進行說明。

1. “weight”值為正數時

在vrrp_script中指定的指令碼如果檢測成功,那麼Master節點的權值將是“weight值與”priority“值之和,如果指令碼檢測失敗,那麼Master節點的權值保持為“priority”值,因此切換策略為:

Master節點“vrrp_script”指令碼檢測失敗時,如果Master節點“priority”值小於Backup節點“weight值與”priority“值之和,將發生主、備切換。

Master節點“vrrp_script”指令碼檢測成功時,如果Master節點“weight”值與“priority”值之和大於Backup節點“weight”值與“priority”值之和,主節點依然為主節點,不發生切換。

2. “weight”值為負數時

在“vrrp_script”中指定的指令碼如果檢測成功,那麼Master節點的權值仍為“priority”值,當指令碼檢測失敗時,Master節點的權值將是“priority“值與“weight”值之差,因此切換策略為:

Master節點“vrrp_script”指令碼檢測失敗時,如果Master節點“priority”值與“weight”值之差小於Backup節點“priority”值,將發生主、備切換。

Master節點“vrrp_script”指令碼檢測成功時,如果Master節點“priority”值大於Backup節點“priority”值時,主節點依然為主節點,不發生切換。

在熟悉了Keepalived主、備角色的選舉策略後,再來分析一下剛才例項,由於A、B兩個節點設定的“weight”值都為10,因此符合選舉策略的第一種,在A節點停止Mysql服務後,A節點的指令碼檢測將失敗,此時A節點的權值將保持為A節點上設定的“priority”值,即為100,而B節點的權值將變為“weight”值與“priority”值之和,也就是90(10+80),這樣就出現了A節點權值仍然大於B節點權值的情況,因此不會發生主、備切換。

對於“weight”值的設定,有一個簡單的標準,即“weight”值的絕對值要大於Master和Backup節點“priority”值之差。對於上面A、B兩個節點的例子,只要設定“weight”值大於20即可保證叢集正常執行和切換。由此可見,對於“weight值的設定,要非常謹慎,如果設定不好,將導致叢集角色選舉失敗,使叢集陷於癱瘓狀態。