Keepalived 是一個用於 Linux 系統的高可用性解決方案,它主要透過 Virtual Router Redundancy Protocol (VRRP) 協議來實現網路服務的高可用性和故障轉移。其核心功能包括故障切換和健康檢查,廣泛應用於 LVS 負載均衡叢集以及其他需要高可用性的場景。下面是 Keepalived 工作原理及其健康檢查機制的詳細介紹:
1. Keepalived 工作原理
-
VRRP 協議基礎:
- VRRP 是一種容錯協議,旨在透過建立一個虛擬路由器來提供預設閘道器的冗餘。這個虛擬路由器有一個虛擬 IP 地址(VIP)和一個虛擬 MAC 地址,客戶端會將這個 VIP 設定為它們的預設閘道器。
- 在 Keepalived 配置中,至少有兩個節點:一個是主節點(MASTER),另一個是備份節點(BACKUP)。它們都執行 VRRP 協議,競爭成為 VIP 的擁有者。
- 主節點週期性地傳送 VRRP 通告報文(多播到 224.0.0.18),告訴備份節點它仍在執行。備份節點監聽這些報文,以確認主節點的狀態。
-
優先順序與狀態轉換:
- 每個 VRRP 節點都有一個優先順序,優先順序高的節點將成為 MASTER。如果 MASTER 節點停止傳送 VRRP 報文(比如因為故障或網路問題),BACKUP 節點在超時後(預設3秒)沒有收到通告,它會認為 MASTER 故障,並且如果它的優先順序足夠高(或成為最高),它會接管 VIP,成為新的 MASTER。
-
健康檢查:
- Keepalived 支援多種健康檢查方法,確保真實伺服器(real servers)或服務本身的健康狀況。
- 指令碼檢查:透過
vrrp_script
配置,可以定義一個外部指令碼來檢測特定服務(如 HTTP、資料庫等)的健康狀態。指令碼定期執行,根據其返回值(0 表示成功,非0 表示失敗)調整 VRRP 優先順序或直接關閉 Keepalived 程序。 - HTTP/HTTPS GET:可以直接配置 Keepalived 使用 HTTP 或 HTTPS GET 請求檢查指定的 URL,透過響應的狀態碼來判斷服務是否健康。
- TCP/UDP 連線檢查:對於基於 TCP 或 UDP 協議的服務,可以配置 Keepalived 去嘗試建立連線或傳送資料包,根據響應情況判斷服務狀態。
-
故障恢復與通知:
- 當故障節點恢復並重新上線時,如果它之前是 MASTER,但發現當前已有其他節點作為 MASTER 在執行,它會自動降級為 BACKUP,等待下一次選舉機會。
- 透過配置,Keepalived 可以傳送郵件或其他形式的通知給管理員,告知狀態變化或故障發生。
2. 如何做到健康檢查
健康檢查是透過在 Keepalived 配置檔案中定義 vrrp_instance
和 vrrp_script
完成的。一個基本步驟如下:
-
定義健康檢查指令碼:編寫一個 shell 指令碼,該指令碼負責檢查特定服務的狀態,例如檢查 Web 伺服器的 HTTP 埠是否響應。
-
配置 vrrp_script:
vrrp_script chk_http { script /path/to/check_http.sh # 檢查指令碼路徑 interval 5 # 執行間隔,單位秒 timeout 3 # 超時時間,單位秒 rise 2 fall 2 # 成功和失敗的閾值 }
這裡,
rise
表示連續幾次成功即認為服務恢復,fall
表示連續幾次失敗則認為服務故障。 -
在 vrrp_instance 中引用指令碼:
vrrp_instance VI_1 { state MASTER/BACKUP # 節點狀態 interface eth0 # 監聽的網路介面 virtual_router_id 51 # VRRP 組ID priority 100 # 優先順序 advert_int 1 # 通告間隔 track_script { chk_http # 引用健康檢查指令碼 } # 其他配置... }
當
track_script
指定的指令碼狀態改變時,會影響 VRRP 優先順序,從而觸發主備切換。
綜上所述,透過上述配置,Keepalived 不僅實現了高可用性,還透過健康檢查機制確保了服務的穩定性和可靠性。