HAProxy 和负载平衡概念简介

简介

HAProxy是High Availability Proxy的缩写,是一个流行的开源软件TCP/HTTP负载均衡和备份解决方案,可以在Linux,macOS和FreeBSD上运行。它最常见的用途是通过在多个服务器(例如Web,应用程序,数据库)之间分配工作负载来提高服务器环境的性能和可靠性。它被用于许多高知名度的环境,包括:GitHub,Imgur,Instagram和Twitter。

在本指南中,您将大致了解HAProxy是什么,回顾负载平衡术语,以及如何使用它来提高您自己的服务器环境的性能和可靠性的示例。

HAProxy术语

在讨论负载平衡和负载均衡时,有许多重要的术语和概念。在下面的小节中,您将浏览常用的术语。

在了解负载均衡的基本类型之前,您应该先回顾一下ACL、后端和前端。

访问控制列表(ACL)

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

ACL示例:

1acl url_blog path_beg /blog

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

有关acl用法的详细指南,请查看HAProxy配置Manual.

后端

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

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

一个后端可以包含一个或多个服务器。一般来说,向后端添加更多服务器会将负载分散到多个服务器上,从而增加潜在的负载能力。在某些后端服务器不可用的情况下,还可以通过这种方式实现更高的可靠性。

以下是两个后端配置的示例,web-ackendblog-backend,每个后端配置两个Web服务器,监听端口80:

 1backend web-backend
 2   balance roundrobin
 3   server web1 web1.yourdomain.com:80 check
 4   server web2 web2.yourdomain.com:80 check
 5
 6backend blog-backend
 7   balance roundrobin
 8   mode http
 9   server blog1 blog1.yourdomain.com:80 check
10   server blog1 blog1.yourdomain.com:80 check

均衡舍入行指定了负载均衡算法,详情请参见负载均衡Algorithms]小节。

模式Balancing](https://andsky.com/tech/tutorials/an-introduction-to-haproxy-and-load-balancing-concepts# types-of-load-balancing)指定使用七层代理,这在[负载类型]一节中有介绍。

server指令末尾的check选项指定应在这些后端服务器上执行健康检查。

前端

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

  • 一组IP地址和一个端口(例如10.1.1.7:80、* :443等)
  • ACL
  • USE_Backend规则,根据匹配的ACL条件定义使用哪些后端;和/或处理其他情况的Default_Backend规则

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

负载均衡类型

现在您已经了解了负载平衡中使用的基本组件,接下来可以介绍负载平衡的基本类型。

无负载均衡

没有负载平衡的简单Web应用程序环境可能如下所示:

无负载Balancing

在本例中,用户直接连接到您的Web服务器,地址为you domain.com,没有负载均衡。如果您的单个Web服务器出现故障,用户将无法再访问您的Web服务器。此外,如果许多用户同时尝试访问您的服务器,而服务器无法处理负载,则他们可能体验缓慢或根本无法连接。

第4层负载均衡

对多台服务器的网络流量进行负载均衡的最简单方法是使用第4层(传输层)负载均衡。这种负载均衡方式会根据网段和端口转发用户流量(即如果有http://yourdomain.com/anything,的请求传入,则流量会被转发到后端,后端负责处理端口80上的youdomain.com的所有请求)。有关第4层的更多详细信息,请查看我们Networking.简介》的_tcp_子部分

下图是第4层负载均衡的简单示例:

四层负载均衡(Layer 4 Load Balancing]

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

第7层负载均衡

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

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

Layer 7 Load Balancing

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

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

1frontend http
2  bind *:80
3  mode http
4
5  acl url_blog path_beg /blog
6  use_backend blog-backend if url_blog
7
8  default_backend web-backend

这将配置一个名为HTTP的前端,该前端处理端口80上的所有传入流量。

如果用户请求的路径以/Blok开头,则acl url_blog路径_beg/blog匹配该请求。

USE_BACKEND BLOG-BACKEND,如果url_blog使用ACL将流量代理到BLOG-BACKEND

default_backend web-backend指定所有其他流量将转发到web-backend

负载均衡算法

使用的负载均衡算法确定在负载均衡时选择后端的哪一台服务器。HAProxy为算法提供了几个选项。除了负载平衡算法之外,还可以为服务器分配一个_weight_参数,以控制与其他服务器相比选择服务器的频率。

一些常用的算法如下:

舍入

轮流轮流选择服务器。这是默认算法。

至少

选择连接数最少的服务器。对于较长时间的会话,建议使用此选项。同一后端的服务器也以循环的方式轮换。

来源

这将根据用户发出请求的源IP地址的散列选择要使用的服务器。此方法确保相同的用户将连接到相同的服务器。

粘滞会话

一些应用程序要求用户继续连接到相同的后端服务器。这可以通过_Sticky SESSIONS_实现,在后台使用appession参数需要它。

健康检查

HAProxy使用健康检查来确定后端服务器是否可用于处理请求。这避免了在服务器不可用时从后端手动删除服务器。默认的健康检查是尝试建立到服务器的TCP连接。

如果服务器未通过健康检查,因此无法服务请求,则会在后端自动禁用该服务器,并且流量不会被转发到该服务器,直到它恢复健康为止。如果后端中的所有服务器都出现故障,该服务将变得不可用,直到这些后端服务器中至少有一台恢复正常。

对于某些类型的后端,如数据库服务器,默认的健康检查不一定是确定服务器是否仍然健康。

Nginx Web服务器还可以用作独立的代理服务器或负载均衡器,并经常与HAProxy配合使用,以实现其缓存和压缩功能。

高可用

本教程中描述的第4层和第7层负载平衡设置都使用负载均衡器将流量定向到许多后端服务器之一。然而,您的负载平衡器是这些设置中的单点故障;如果它出现故障或请求过多,可能会导致您的服务出现高延迟或停机。

高可用性(HA)设置被广泛地定义为没有单点故障的基础设施。它通过将冗余添加到架构的每一层来防止单个服务器故障成为停机事件。负载均衡器有助于后端层(Web/应用程序服务器)的冗余,但为了实现真正的高可用性设置,您还需要有冗余的负载均衡器。

以下是高可用性设置的示意图:

HA设置

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

结论

既然您已经了解了负载平衡,并且知道了如何使用HAProxy,那么您就有了一个坚实的基础来开始改进您自己的服务器环境的性能和可靠性。

如果您对存储HAProxy的输出以备以后查看感兴趣,请查看[How to Configure HAProxy Logging With Rsyslog on CentOS8Quickstart

如果您正在寻求解决问题,请查看Common HAProxy Errors.如果需要进一步的故障排除,请查看如何排除常见HAProxy Errors.故障

Published At
Categories with 技术
comments powered by Disqus