HAProxy簡介
HAProxy是法國開發者 威利塔羅(Willy Tarreau) 在2000年使用C語言開發的一個開源軟件 是一款具備高并發(萬級以上)、高性能的TCP和HTTP負載均衡器 支持基于cookie的持久性,自動故障切換,支持正則表達式及web狀態統計
LVS 與 HAProxy 的核心區別及優劣勢
工作層級與本質
LVS(Linux Virtual Server):是 Linux 內核級別的負載均衡器,僅工作在四層(傳輸層,如 TCP/UDP),基于 IP 和端口進行流量轉發,不解析應用層協議(如 HTTP)。
HAProxy:是用戶態的軟件負載均衡器,支持四層(傳輸層)和七層(應用層,如 HTTP/HTTPS),可解析應用層協議內容(如 HTTP 頭部、URL),實現更精細的轉發。
性能與適用場景
LVS 優勢:
作為內核級工具,轉發效率極高(幾乎接近硬件負載均衡器),能承載百萬級并發連接,適合超大規模流量場景(如電商秒殺、大型分布式服務入口)。
缺點:功能簡單,不支持七層邏輯,配置和維護成本高(需結合其他工具完善功能)。
HAProxy 優勢:
功能豐富,支持七層精細化轉發,健康檢查能力強,配置靈活,適合中高流量且需要應用層邏輯的場景(如 Web 服務、API 網關)。
缺點:用戶態軟件,轉發效率略低于 LVS(承載幾十萬并發無壓力,超大規模場景可能成為瓶頸)。
總結:LVS轉發效率更高但是沒有后端檢查需要其它工具完善功能,HAProxy轉發效率略低于LVS但有后端檢測,配置簡單。
HAProxy 的四層與七層負載詳解
?四層負載(TCP 模式)
工作原理:基于傳輸層協議(TCP/UDP)轉發,僅關注 “源 IP: 端口” 和 “目標 IP: 端口”,不解析數據包內容(如 HTTP 請求的 URL、頭部)。
轉發邏輯:類似 LVS,通過預設的 IP + 端口規則將流量轉發到后端服務器(如將訪問10.0.0.1:80
的流量轉發到后端192.168.1.10:8080
和192.168.1.11:8080
)。
適用場景:對性能要求高、無需應用層邏輯的服務,如數據庫(MySQL)、SSH、郵件服務(SMTP)等。
?七層負載(HTTP/HTTPS 模式)
工作原理:基于應用層協議(HTTP/HTTPS)轉發,會解析數據包的應用層內容(如 HTTP 的 Host、URI、Cookie、請求方法等),實現更智能的路由。
轉發邏輯:可根據應用層信息定制規則,例如:將訪問/static
的靜態資源請求轉發到 CDN 或靜態服務器;將訪問/api
的動態請求轉發到應用服務器;根據 HTTP 頭部的Host
字段區分不同域名(如a.example.com
轉發到集群 A,b.example.com
轉發到集群 B)。
額外能力:支持 SSL 卸載(前端解密 HTTPS,后端用 HTTP 通信,減輕后端服務器壓力)、會話保持(通過 Cookie 或 IP 綁定固定用戶到某臺服務器)、請求改寫(Rewrite URL 或頭部)等。
適用場景:Web 服務、API 網關等需要應用層邏輯的場景,如電商網站的動靜分離、多域名路由等。
HAProxy的使用方法
HAProxy 的配置文件
haproxy.cfg由兩大部分組成,分別是:
global:全局配置段 進程及安全配置相關的參數 性能調整相關參數 Debug參數
proxies:代理配置段 defaults:為frontend, backend, listen提供默認配置
frontend:前端,相當于nginx中的server {}
backend:后端,相當于nginx中的upstream {}
listen:同時擁有前端和后端配置,配置簡單,生產推薦使用
使用listen替換 frontend和backend的配置方式,可以簡化設置,通常只用于TCP協議的應用 listen
我們每次修改完配置文件之后要重啟服務,影響比較大。我們可以借用一個工具來實現動態更新
socat 工具
對服務器動態權重和其它狀態可以利用 socat工具進行調整,Socat 是 Linux 下的一個多功能的網絡工 具,名字來由是Socket CAT,相當于netCAT的增強版.Socat 的主要特點就是在兩個數據流之間建立雙向 通道,且支持眾多協議和鏈接方式。如 IP、TCP、 UDP、IPv6、Socket文件等
范例:利用工具socat 對服務器動態權重調整
#修改配置文件
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg stats socket /var/lib/haproxy/stats mode 600 level admin
?#查看haproxy狀態
[root@haproxy ~]# echo "show info" | socat stdio /var/lib/haproxy/stats
#查看集群狀態
[root@haproxy ~]# echo "show servers state" | socat stdio /var/lib/haproxy/stats
#查看集群權重
[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stat
#設置權重
[root@haproxy ~]# echo "set weight webcluster/web1 1 " | socat stdio /var/lib/haproxy/stats
#下線后端服務器
[root@haproxy ~]# echo "disable server webcluster/web1 " | socat stdio /var/lib/haproxy/stats
#上線后端服務器
[root@haproxy ~]# echo "enable server webcluster/web1 " | socat stdio /var/lib/haproxy/stats
針對多進程處理方法
如果開啟多進程那么我們在對進程的sock文件進行操作時其對進程的操作時隨機的
如果需要指定操作進程那么需要用多soct文件方式來完成
這樣每個進程就會有單獨的sock文件來進行單獨管理
haproxy的算法
HAProxy通過固定參數 balance 指明對后端服務器的調度算法
balance參數可以配置在listen或backend選項中
HAProxy的調度算法分為靜態和動態調度算法
有些算法可以根據參數在靜態和動態算法中相互轉換。
靜態算法
靜態算法:按照事先定義好的規則輪詢公平調度,不關心后端服務器的當前負載、連接數和響應速度 等,且無法實時修改權重(只能為0和1,不支持其它值),只能靠重啟HAProxy生效。
static-rr:基于權重的輪詢調度
不支持運行時利用socat進行權重的動態調整(只支持0和1,不支持其它值) 不支持端服務器慢啟動 其后端主機數量沒有限制,相當于LVS中的 wrr
慢啟動是指在服務器剛剛啟動上不會把他所應該承擔的訪問壓力全部給它,而是先給一部分,當沒 問題后在給一部分
first:
根據服務器在列表中的位置,自上而下進行調度 其只會當第一臺服務器的連接數達到上限,新請求才會分配給下一臺服務 其會忽略服務器的權重設置 不支持用socat進行動態修改權重,可以設置0和1,可以設置其它值但無效
動態算法
基于后端服務器狀態進行調度適當調整, 新請求將優先調度至當前負載較低的服務器 權重可以在haproxy運行時動態調整無需重啟
roundrobin:
1. 基于權重的輪詢動態調度算法, 2. 支持權重的運行時調整,不同于lvs中的rr輪訓模式, 3. HAProxy中的roundrobin支持慢啟動(新加的服務器會逐漸增加轉發數), 4. 其每個后端backend中最多支持4095個real server, 5. 支持對real server權重動態調整, 6. roundrobin為默認調度算法,此算法使用廣泛
動態調整權重
[root@haproxy ~]# echo "set weight webserver_80/webserver1 2" | socat stdio /var/lib/haproxy/haproxy.sock
leastconn:
leastconn加權的最少連接的動態 支持權重的運行時調整和慢啟動,即:根據當前連接最少的后端服務器而非權重進行優先調度(新客戶 端連接) 比較適合長連接的場景使用,比如:MySQL等場景。
各算法使用場景
first static-rr roundrobin leastconn source #使用較少 #做了session共享的web集群 #數據庫 #基于客戶端公網IP的會話保持 Uri--------------->http url_param--------->http hdr 五.高級功能及配置 介紹HAProxy高級配置及實用案例 #緩存服務器,CDN服務商,藍汛、百度、阿里云、騰訊 #可以實現session保持 #基于客戶端請求報文頭部做下一步處理