引言

是高可用性代理的缩写,是一个流行的开源软件 tcp / http 负载均衡器和代理解决方案,可以在 Linux、 Solaris 和 FreeBSD 上运行。 它最常见的用途是通过将工作负载分布到多个服务器(例如 web、应用程序、数据库)来提高服务器环境的性能和可靠性。 它被用于许多高知名度的环境,包括 GitHub、 Imgur、 Instagram 和 Twitter。

在本指南中,我们将对 HAProxy 是什么、基本的负载平衡术语以及如何使用它来提高您自己的服务器环境的性能和可靠性提供一个总体概述。

Haproxy 名词术语

在讨论负载平衡和代理时,有许多重要的术语和概念。 我们将在下面的小节中介绍常用的术语。

在进入负载平衡的基本类型之前,我们将讨论 acl、后端和前端。

访问控制列表(ACL)

关于负载平衡,acl 用于测试某些条件,并根据测试结果执行操作(例如选择服务器或阻止请求)。 Acl 的使用允许基于各种因素(例如模式匹配和到后端的连接数)的灵活网络流量转发。

前交叉韧带示例:

acl url_blog path_beg /blog

如果用户请求的路径以 / blog 开头,则该 ACL 匹配。 例如,这将与 http://yourdomain.com/blog/blog-entry-1的请求相匹配。

有关 ACL 使用的详细指南,请参阅 HAProxy 配置手册。

后端

后端是一组接收转发请求的服务器。 后端在 HAProxy 配置的后端部分中定义。 在最基本的形式中,后端可以通过以下方式定义:

  • 要使用的负载平衡算法
  • 服务器和端口的列表

一个后端可以包含一个或多个服务器——通常来说,向后端添加更多的服务器会通过将负载分散到多个服务器来增加潜在的负载能力。 通过这种方式还可以提高可靠性,以防某些后端服务器不可用。

下面是一个两个后端配置的例子,web-backend 和 blog-backend,每个后端有两个 web 服务器,在端口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 行指定负载平衡算法,该算法在 Load Balancing algorithm 一节中有详细说明。

模式 http 指定将使用第七层代理,这在负载平衡类型一节中有所解释。

服务器指令末尾的检查选项指定应该在那些后端服务器上执行健康状况检查。

Frontend

前端定义如何将请求转发到后端。 前端在 HAProxy 配置的前端部分定义。 它们的定义由以下组成部分组成:

  • 一组 IP 地址和一个端口(例如10.1.1.7:80,* : 443,等等)
  • 前交叉韧带
  • 使用后端规则(根据匹配的 ACL 条件定义要使用的后端)和 / 或处理其他情况的默认后端规则

前端可以配置为各种类型的网络流量,如下一节所解释的。

负载平衡的类型

现在我们已经了解了负载平衡中使用的基本组件,接下来让我们了解负载平衡的基本类型。

无负载平衡

一个没有负载平衡的简单 web 应用程序环境可能看起来如下所示:

在这个例子中,用户直接连接到你的网络服务器,在 yourdomain. com,没有负载平衡。 如果你的单个网络服务器出现故障,用户将无法访问你的网络服务器。 此外,如果许多用户试图同时访问您的服务器,而服务器无法处理负载,他们可能会有一个缓慢的体验,或者他们可能根本无法连接。

第四层负载平衡

向多个服务器负载均衡网络流量的最简单方法是使用第4层(传输层)负载均衡。 负载平衡这种方式将基于 IP 范围和端口转发用户流量(也就是说,如果一个请求来自 http://yourdomain.com/anything ,流量将转发到后端,该后端在端口80处理 yourdomain. com 的所有请求)。 关于第4层的更多细节,请查看我们网络介绍的 TCP 部分。

下面是第四层负载平衡的一个简单示例:

用户访问负载均衡器,负载均衡器将用户的请求转发给后端服务器的 web 后端组。 无论选择哪个后端服务器,都将直接响应用户的请求。 通常,web 后端中的所有服务器都应该提供相同的内容,否则用户可能会收到不一致的内容。 请注意,两个 web 服务器都连接到同一个数据库服务器。

第七层负载平衡

另一种更复杂的负载平衡网络流量的方法是使用第7层(应用程序层)负载平衡。 使用第7层允许负载均衡器根据用户请求的内容将请求转发到不同的后端服务器。 这种负载平衡模式允许您在同一域和端口下运行多个 web 应用程序服务器。 关于第7层的更多细节,请查看我们网络介绍的 HTTP 部分。

下面是第7层负载平衡的一个简单示例:

在这个例子中,如果一个用户请求 yourdomain.com/blog ,他们会被转发到博客后端,这是一组运行博客应用程序的服务器。 其他请求被转发到 web 后端,后端可能正在运行另一个应用程序。 在本例中,两个后端使用相同的数据库服务器。

前端配置示例的一个片段如下所示:

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上的所有传入流量。

如果用户请求的路径以 / blog 开头,acl url blog path beg / blog 匹配请求。

如果 url blog 使用 ACL 代理 blog-backend 的流量,则使用后端 blog-backend。

默认后端 web-backend 指定所有其他流量将被转发到 web-backend。

负载平衡算法

所使用的负载平衡算法确定在负载平衡时将选择后端中的哪个服务器。 提供了几个算法选项。 除了负载平衡算法之外,还可以为服务器分配一个权重参数,用于操作与其他服务器相比选择服务器的频率。

因为 HAProxy 提供了如此多的负载平衡算法,我们在这里只描述其中的一部分。 有关完整的算法列表,请参阅 HAProxy 配置手册。

一些常用的算法如下:

圆形的

轮流循环选择服务器,这是默认的算法。

上校

选择连接数量最少的服务器——建议使用较长的会话。 同一后端中的服务器也以循环方式轮换。

来源

这将根据源 IP 的散列(即用户的 IP 地址)选择要使用的服务器。 这是一种确保用户将连接到同一台服务器的方法。

棘手的会议

有些应用程序要求用户继续连接到相同的后端服务器。 这种持久性是通过粘贴会话实现的,使用后端中需要它的 appsession 参数。

健康检查

Haproxy 使用健康检查来确定后端服务器是否可用于处理请求。 这样可以避免在服务器变得不可用时手动从后端删除服务器。 默认的健康检查是尝试建立到服务器的 TCP 连接,即检查后端服务器是否正在监听配置的 IP 地址和端口。

如果一个服务器在健康检查中失败,因此无法提供请求,那么它会在后端自动关闭,也就是说,在它恢复健康之前,流量不会被转发给它。 如果后端中的所有服务器都出现故障,则该服务将变得不可用,直到其中至少一个后端服务器恢复正常。

对于某些类型的后端,如某些情况下的数据库服务器,缺省健康检查不足以确定服务器是否仍然健康。

其他解决方案

如果你觉得 HAProxy 对你的需求来说可能太复杂了,下面的解决方案可能更适合你:

  • Linux Virtual Servers (LVS)——一个简单、快速的第4层负载均衡器,包含在许多 Linux 发行版中
  • Nginx-一个快速和可靠的 web 服务器,也可以用于代理和负载平衡的目的。 Nginx 经常与 HAProxy 一起使用,因为它具有缓存和压缩功能

高可用性

前面描述的第4层和第7层负载均衡设置都使用负载均衡器将流量引导到许多后端服务器之一。 但是,在这些设置中,负载均衡器是单点故障; 如果它出现故障或者请求过多,可能会导致服务延迟过长或者宕机。

高可用性设置是一种没有单点故障的基础设施。 它通过向体系结构的每个层添加冗余,防止单个服务器故障成为停机事件。 负载均衡器有利于后端层(web / app 服务器)的冗余,但是对于真正的高可用性 / 服务器设置,还需要冗余的负载均衡器。

下面是一个基本的高可用性设置图:

在本例中,静态 IP 地址后面有多个负载平衡器(一个主动的,一个或多个被动的) ,可以从一个服务器重新映射到另一个服务器。 当用户访问你的网站时,请求通过外部 IP 地址到达活动负载均衡器。 如果负载均衡器失败,您的故障转移机制将检测到它,并自动将 IP 地址重新分配给被动服务器之一。 有许多不同的方法来实现主动 / 被动 HA 设置。 要了解更多信息,请阅读《如何使用浮动 ip 》这一节。

总结

现在您已经对负载平衡有了基本的了解,并且知道了 HAProxy 促进您的负载平衡需求的一些方法,那么您就有了一个坚实的基础,可以开始提高您自己的服务器环境的性能和可靠性。

下面的教程提供了 HAProxy 设置的详细示例:

如何在 Ubuntu 14.04上使用 HAProxy 作为 WordPress 应用服务器的第四层负载平衡器

如何使用 HAProxy 设置 MySQL 负载平衡