如何用 HAProxy 建立高可用架構 文章首圖

如何用 HAProxy 建立高可用架構

如何用 HAProxy 建立高可用架構

在現代 Web 架構中,單點故障(Single Point of Failure)是系統穩定性的最大殺手。當流量增長或後端伺服器發生硬體故障時,如何確保服務不中斷?這就是 HAProxy 大顯身手的時刻。作為業界標準的 TCP/HTTP 負載平衡器,HAProxy 以其高效能和靈活性著稱。本文将引導您在 Ubuntu 22.04 或 Debian 12 環境中,從零開始搭建一個具備基本高可用能力的 HAProxy 集群。

環境規劃與準備

在開始之前,請確保您擁有至少兩台伺服器來模擬 HAProxy 的高可用架構。我們將採用主從(Active-Standby)模式,並結合 keepalived 來實現虛擬 IP(VIP)的自動切換。

  • HAProxy Node 1 (Primary): IP 192.168.1.10
  • HAProxy Node 2 (Backup): IP 192.168.1.11
  • Virtual IP (VIP): 192.168.1.100 (用戶端將連線至此 IP)
  • 後端伺服器: 假設存在兩台 Web 伺服器,IP 分別為 192.168.1.20192.168.1.21

步驟一:安裝與基礎配置 HAProxy

首先,在兩台節點上安裝 HAProxy。在 Ubuntu 22.04 / Debian 12 中,安裝過程非常簡潔:

sudo apt update
sudo apt install haproxy -y

安裝完成後,我们需要配置後端伺服器列表。編輯 /etc/haproxy/haproxy.cfg,在文件末尾添加以下配置,定義您的後端 Web 伺服器集群:

frontend http_front
    bind *:80
    mode http
    default_backend web_servers

backend web_servers
    mode http
    balance roundrobin
    server web1 192.168.1.20:80 check
    server web2 192.168.1.21:80 check

這段配置告訴 HAProxy 監聽 80 端口,並使用輪詢(roundrobin)算法將流量分發給 web1web2check 參數確保 HAProxy 會定期健康檢查後端伺服器。

步驟二:安裝 Keepalived 實現 VIP 漂移

僅有 HAProxy 還不夠,如果主節點宕機,用戶端無法自動切換到備用節點。我們需要 keepalived 來管理 VIP。

在兩台節點上安裝 keepalived:

sudo apt install keepalived -y

接下來,配置主節點(Node 1)的 /etc/keepalived/keepalived.conf

vrrp_script chk_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100
    }
    track_script {
        chk_haproxy
    }
}

同時,配置備用節點(Node 2)的 /etc/keepalived/keepalived.conf,將 state 改為 BACKUPpriority 設為低於 100 的值(例如 90):

vrrp_script chk_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100
    }
    track_script {
        chk_haproxy
    }
}

步驟三:創建健康檢查腳本

為了讓 Keepalived 能檢測 HAProxy 是否運行正常,創建一個檢查腳本 /etc/keepalived/check_haproxy.sh

#!/bin/bash
if ! pgrep haproxy > /dev/null; then
    /etc/init.d/haproxy restart
    exit 1
else
    exit 0
fi

賦予腳本執行權限並啟動所有服務:

chmod +x /etc/keepalived/check_haproxy.sh
sudo systemctl enable --now haproxy keepalived

現在,使用 ip addr 命令檢查 VIP 192.168.1.100 是否已綁定在主節點上。如果是,您的高可用架構已初步建立。

常見問題排查

1. VIP 無法漂移或雙主現象 這通常是由於防火牆阻擋了 VRRP 協議(IP 協議號 112)或 virtual_router_id 衝突。請確保兩台節點之間的防火牆允許 VRRP 通信,並且同一個集群內的 virtual_router_id 必須唯一。

2. HAProxy 健康檢查失敗導致後端被標記為 DOWN 檢查後端伺服器的防火牆是否開放了對應端口。此外,HAProxy 默認使用 TCP 層的健康檢查,若需應用層檢查(如 HTTP 200 OK),需在 backend 區塊中添加 option httpchk GET /health 等指令。

小結

透過 HAProxy 與 Keepalived 的協作,我們成功建立了一個簡單但堅實的高可用負載平衡架構。這種組合不僅能分散流量,還能自動處理節點故障,是提升系統韌性的關鍵一步。對於更複雜的場景,您可以進一步考慮引入 Consul 或 etcd 進行配置管理,或擴展為多活架構。希望這篇文章能為您的 Linux 基礎設施建設提供實用的參考。