介绍
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的Web服务器:
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.)
- ACL
-
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:

在此示例中,用户直接连接到您的 Web 服务器,位于 yourdomain.com
,并且没有负载平衡。如果您的单个 Web 服务器宕机,用户将无法再访问您的 Web 服务器。此外,如果有许多用户同时尝试访问您的服务器,而服务器无法处理负载,他们可能会经历缓慢的体验,或者根本无法连接。
第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提供了几种算法选项。除了负载均衡算法之外,服务器可以被分配一个权重参数,以调整服务器被选中的频率,相对于其他服务器。
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 地址重新分配给其中一个被动服务器。有多种不同的方法可以实现主/备高可用性设置。要了解更多信息,请阅读如何使用保留的 IP 地址。
结论
现在您已经了解了负载均衡,并知道如何使用 HAProxy,您就有了一个坚实的基础,可以开始改进自己服务器环境的性能和可靠性。
如果您对存储 HAProxy 的输出以供以后查看感兴趣,请查看如何在 CentOS 8 上使用 Rsyslog 配置 HAProxy 日志记录[快速入门]。
如果您想解决问题,请查看常见的HAProxy错误。如果需要更深入的故障排除,请查看如何排除常见的HAProxy错误。