介紹
HAProxy代表高可用性代理,是一個流行的開源軟件TCP/HTTP負載平衡器和代理解決方案,可在Linux、macOS和FreeBSD上運行。它最常見的用途是通過將工作負載分配到多個服務器上(例如Web、應用程序、數據庫)來改善服務器環境的性能和可靠性。它被用於許多知名環境中,包括:GitHub、Imgur、Instagram和Twitter。
在本指南中,您將獲得有關HAProxy的一般概述,審查負載平衡術語,以及它如何用於改善您自己的服務器環境的性能和可靠性的示例。
HAProxy術語
在討論負載平衡和代理時,有許多重要的術語和概念。您將在以下子部分中介紹常用術語。
在深入了解基本負載平衡類型之前,您應該從回顧ACL、後端和前端開始。
訪問控制列表(ACL)
關於負載平衡,ACL 用於測試某些條件並根據測試結果執行操作(例如,選擇一個伺服器或阻止一個請求)。使用 ACL 允許基於各種因素進行靈活的網絡流量轉發,例如模式匹配和與後端的連接數。
ACL 的示例:
acl url_blog path_beg /blog
如果用戶請求的路徑以 /blog
開頭,則匹配此 ACL。例如,這將匹配請求 http://yourdomain.com/blog/blog-entry-1
。
有關 ACL 使用的詳細指南,請查看 HAProxy 配置手冊。
後端
A backend is a set of servers that receives forwarded requests. Backends are defined in the backend section of the HAProxy configuration. In its most basic form, a backend can be defined by:
- 要使用哪種負載平衡算法
- a list of servers and ports
A backend can contain one or many servers in it. Generally speaking, adding more servers to your backend will increase your potential load capacity by spreading the load over multiple servers. Increased reliability is also achieved through this manner, in case some of your backend servers become unavailable.
以下是一個具有兩個後端配置的示例,web-backend
和 blog-backend
,每個後端有兩個網絡伺服器,監聽端口 80:
backend web-backend
balance roundrobin
server web1 web1.yourdomain.com:80 check
server web2 web2.yourdomain.com:80 check
backend blog-backend
balance roundrobin
mode http
server blog1 blog1.yourdomain.com:80 check
server blog1 blog1.yourdomain.com:80 check
balance roundrobin
行指定了負載平衡算法,詳細信息請參閱 負載平衡算法 部分。
mode http
指定將使用第 7 層代理,這在 負載平衡類型 部分有解釋。
server
指令末尾的 check
選項指定應對這些後端服務器執行健康檢查。
前端
A frontend defines how requests should be forwarded to backends. Frontends are defined in the frontend
section of the HAProxy configuration. Their definitions are composed of the following components:
- a set of IP addresses and a port (e.g. 10.1.1.7:80, *:443, etc.)
- ACLs
use_backend
規則,根據匹配的 ACL 條件定義使用哪些後端,以及處理其他所有情況的default_backend
規則
A frontend can be configured to various types of network traffic, as explained in the next section.
負載平衡類型
現在您已經了解了負載平衡中使用的基本組件,可以進入基本的負載平衡類型。
無負載平衡
A simple web application environment with no load balancing might look like the following:

在這個例子中,用戶直接連接到您的網絡服務器,位於yourdomain.com
,並且沒有負載均衡。如果您的單個網絡服務器宕機,用戶將不再能夠訪問您的網絡服務器。此外,如果有許多用戶同時嘗試訪問您的服務器,而它無法處理負載,他們可能會經歷緩慢的體驗,或者根本無法連接。
第4層負載均衡
將網絡流量負載平衡到多個服務器的最簡單方法是使用第4層(傳輸層)負載平衡。以這種方式進行負載平衡將根據IP範圍和端口轉發用戶流量(即,如果請求進來,http://yourdomain.com/anything
,則流量將被轉發到處理yourdomain.com
上所有請求的後端,端口為80
)。有關第4層的更多詳細信息,請查看我們的網絡介紹中的TCP子節。
這是一個簡單的第4層負載平衡示例的示意圖:

用戶訪問負載平衡器,該負載平衡器將用戶的請求轉發到後端伺服器的web-backend組。選擇的任何後端伺服器將直接回應用戶的請求。通常,web-backend中的所有伺服器應該提供相同的內容 – 否則用戶可能會收到不一致的內容。請注意,這兩個Web伺服器都連接到同一個資料庫伺服器。
第7層負載平衡
另一種更複雜的負載平衡網絡流量的方法是使用第7層(應用層)負載平衡。使用第7層使負載平衡器能夠根據用戶請求的內容將請求轉發到不同的後端伺服器。這種負載平衡模式允許您在相同的域和端口下運行多個Web應用伺服器。有關第7層的更多詳細信息,請查看我們的網絡介紹中的HTTP子部分。
以下是第7層負載平衡的一個簡單示例圖表:

在此示例中,如果用戶請求yourdomain.com/blog
,則將其轉發到blog後端,這是運行博客應用程序的一組伺服器。其他請求則轉發到web-backend,這可能運行另一個應用程序。在此示例中,兩個後端都使用同一個資料庫伺服器。
A snippet of the example frontend configuration would look like this:
frontend http
bind *:80
mode http
acl url_blog path_beg /blog
use_backend blog-backend if url_blog
default_backend web-backend
這個配置了一個名為 http
的前端,它處理在 80 端口上的所有流量。
acl url_blog path_beg /blog
如果用戶請求的路徑以 /blog
開頭,則匹配該請求。
use_backend blog-backend if url_blog
使用 ACL 將流量代理到 blog-backend
。
default_backend web-backend
指定其他所有流量都將轉發到 web-backend
。
負載均衡算法
所使用的負載均衡算法決定了在負載均衡時將選擇後端中的哪個服務器。HAProxy 提供了幾種算法選項。除了負載均衡算法外,服務器還可以被分配一個 weight 參數,以控制該服務器相對於其他服務器被選中的頻率。
A few of the commonly used algorithms are as follows:
roundrobin
Round Robin 按輪詢選擇服務器。這是默認算法。
leastconn
選擇連接數最少的伺服器。這在較長的會話中是建議使用的。同一後端的伺服器也會以循環方式進行輪詢。
來源
這會根據用戶發送請求的來源 IP 地址的哈希值來選擇使用哪個伺服器。此方法確保相同的用戶將連接到相同的伺服器。
黏性會話
一些應用程式要求用戶繼續連接到同一個後端伺服器。這可以通過使用需要的後端中的黏性會話,使用appsession
參數來實現。
健康檢查
HAProxy 使用健康檢查來確定後端伺服器是否可用於處理請求。這樣可以避免在伺服器不可用時手動從後端中移除伺服器。默認的健康檢查是嘗試與伺服器建立 TCP 連接。
如果服務器未通過健康檢查,因此無法提供請求,則它將自動在後端停用,直到再次變為健康為止,流量將不會被轉發到它。
對於某些類型的後端,如數據庫服務器,默認的健康檢查並不一定是確定服務器是否仍然健康。
Nginx Web 服務器也可以用作獨立代理服務器或負載平衡器,通常與 HAProxy 一起使用,因為它具有緩存和壓縮功能。
高可用性
在本教程中描述的第 4 層和第 7 層負載平衡設置都使用負載平衡器將流量導向其中一個後端服務器。但是,在這些設置中,您的負載平衡器是單點故障;如果它宕機或被請求淹沒,它可能會導致服務的高延遲或停機。
A high availability (HA) setup is broadly defined as infrastructure without a single point of failure. It prevents a single server failure from being a downtime event by adding redundancy to every layer of your architecture. A load balancer facilitates redundancy for the backend layer (web/app servers), but for a true high availability setup, you need to have redundant load balancers as well.
這是高可用性設置的示意圖:
在這個例子中,您有多個負載均衡器(一個主動和一個或多個被動),這些負載均衡器位於一個靜態IP地址後面,可以從一台伺服器重新映射到另一台伺服器。當使用者訪問您的網站時,請求通過外部IP地址到達主動負載均衡器。如果該負載均衡器失效,您的故障轉移機制將檢測到並自動將IP地址重新分配給其中一台被動伺服器。實施主動/被動HA設置有多種不同的方式。要了解更多信息,請閱讀如何使用保留的IP地址。
結論
現在您已經了解了負載均衡,並知道如何利用HAProxy,您有了一個堅實的基礎,可以開始改善自己伺服器環境的性能和可靠性。
如果您有興趣將HAProxy的輸出存儲以供以後查看,請查看如何在CentOS 8上使用Rsyslog配置HAProxy日誌記錄[快速入門]。
如果您正在尋找解決問題的方法,請查看常見的 HAProxy 錯誤。如果需要進一步的故障排除,請參考如何排除常見的 HAProxy 錯誤。