如何用 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.20和192.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)算法將流量分發給 web1 和 web2。check 參數確保 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 改為 BACKUP,priority 設為低於 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 基礎設施建設提供實用的參考。