在Linux中,keepalive工作原理是什麼及如何做到健康檢查?

黄嘉波發表於2024-06-22

Keepalived 是一個用於 Linux 系統的高可用性解決方案,它主要透過 Virtual Router Redundancy Protocol (VRRP) 協議來實現網路服務的高可用性和故障轉移。其核心功能包括故障切換和健康檢查,廣泛應用於 LVS 負載均衡叢集以及其他需要高可用性的場景。下面是 Keepalived 工作原理及其健康檢查機制的詳細介紹:

1. Keepalived 工作原理
  1. VRRP 協議基礎

    • VRRP 是一種容錯協議,旨在透過建立一個虛擬路由器來提供預設閘道器的冗餘。這個虛擬路由器有一個虛擬 IP 地址(VIP)和一個虛擬 MAC 地址,客戶端會將這個 VIP 設定為它們的預設閘道器。
    • 在 Keepalived 配置中,至少有兩個節點:一個是主節點(MASTER),另一個是備份節點(BACKUP)。它們都執行 VRRP 協議,競爭成為 VIP 的擁有者。
    • 主節點週期性地傳送 VRRP 通告報文(多播到 224.0.0.18),告訴備份節點它仍在執行。備份節點監聽這些報文,以確認主節點的狀態。
  2. 優先順序與狀態轉換

    • 每個 VRRP 節點都有一個優先順序,優先順序高的節點將成為 MASTER。如果 MASTER 節點停止傳送 VRRP 報文(比如因為故障或網路問題),BACKUP 節點在超時後(預設3秒)沒有收到通告,它會認為 MASTER 故障,並且如果它的優先順序足夠高(或成為最高),它會接管 VIP,成為新的 MASTER。
  3. 健康檢查

    • Keepalived 支援多種健康檢查方法,確保真實伺服器(real servers)或服務本身的健康狀況。
    • 指令碼檢查:透過 vrrp_script 配置,可以定義一個外部指令碼來檢測特定服務(如 HTTP、資料庫等)的健康狀態。指令碼定期執行,根據其返回值(0 表示成功,非0 表示失敗)調整 VRRP 優先順序或直接關閉 Keepalived 程序。
    • HTTP/HTTPS GET:可以直接配置 Keepalived 使用 HTTP 或 HTTPS GET 請求檢查指定的 URL,透過響應的狀態碼來判斷服務是否健康。
    • TCP/UDP 連線檢查:對於基於 TCP 或 UDP 協議的服務,可以配置 Keepalived 去嘗試建立連線或傳送資料包,根據響應情況判斷服務狀態。
  4. 故障恢復與通知

    • 當故障節點恢復並重新上線時,如果它之前是 MASTER,但發現當前已有其他節點作為 MASTER 在執行,它會自動降級為 BACKUP,等待下一次選舉機會。
    • 透過配置,Keepalived 可以傳送郵件或其他形式的通知給管理員,告知狀態變化或故障發生。
2. 如何做到健康檢查

健康檢查是透過在 Keepalived 配置檔案中定義 vrrp_instancevrrp_script 完成的。一個基本步驟如下:

  1. 定義健康檢查指令碼:編寫一個 shell 指令碼,該指令碼負責檢查特定服務的狀態,例如檢查 Web 伺服器的 HTTP 埠是否響應。

  2. 配置 vrrp_script

    vrrp_script chk_http {
        script /path/to/check_http.sh    # 檢查指令碼路徑
        interval 5                      # 執行間隔,單位秒
        timeout 3                       # 超時時間,單位秒
        rise 2 fall 2                   # 成功和失敗的閾值
    }
    

    這裡,rise 表示連續幾次成功即認為服務恢復,fall 表示連續幾次失敗則認為服務故障。

  3. 在 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 不僅實現了高可用性,還透過健康檢查機制確保了服務的穩定性和可靠性。

相關文章