横向扩展软件负载均衡器的典型方法是什么?

z80*_*000 32 scalability reverse-proxy load-balancing

我经常在一堆应用服务器前看到带有 SLB/反向代理的 Web 应用架构。

当到SLB的连接数需要太多资源而单个SLB无法有效处理时,会发生什么情况?对于一个具体但过度的示例,请考虑 200 万个持久 HTTP 连接。显然,单个SLB 无法处理此问题。

什么是缩放的建议配置一个SLB?

创建 LB 的组/集群是典型的吗?如果是这样,客户端负载如何在 LB 组之间分布?

Jes*_*r M 27

好的,已经有一个可以接受的答案,但还有一些要补充的。 扩展负载均衡器层的最常见的“经典”方法是(没有特定的顺序):

  • DNS Round Robin为域公开多个 IP 地址。对于每个 IP 地址,实现一个高度可用的服务器对(2 个服务器合作以保持一个 IP 地址始终工作。)每个 IP 对应一个负载均衡器集群,使用设备或带有负载均衡软件的服务器。通过根据需要添加更多负载均衡器对来水平扩展。

  • 路由或防火墙调整以将负载分散到多个负载平衡器。让前端路由器或前端防火墙通过散列源 IP 地址、具有多个到负载均衡器的等成本路由或类似方法,将传入连接传播到多个 IP 地址(每个地址代表一个负载均衡器对)。

  • 的层IP级别负载平衡器在HTTP水平负载平衡器的层的前面。IP 层负载平衡可以在 ASIC/硅片中实现,并且可以在某些情况下快速实现。因此,单个 IP 负载均衡器对通常可以“跟上”多个 HTTP/HTTPS 级别的负载均衡器,并在保持架构美观和简单的同时提供多千兆位的性能级别。

完全深入了解执行上述操作的不同方法需要很长的答案。但总的来说,扩展负载均衡器层并不难,扩展应用服务器层尤其是数据库层要困难得多。

无论您选择设备外形规格(F5、Cisco、A10)还是通用服务器(Windows/Linux + 软件)都不重要。扩展负载均衡器层时的主要考虑因素是:

  • 有状态与无状态。你绝对需要粘性会话,或者你可以没有吗?不保持状态使一切变得更简单。
  • 用于负载平衡的“硬件”(ASIC)与“软件”(通用服务器)。每个都有其优点和缺点,请参阅上面链接的 HAProxy 概述文档。
  • L3/4 (IP / TCP/IP) 负载平衡与 L7 (HTTP)负载平衡。同样,优点和缺点,HAProxy 文档提供了一个很好的概述。
  • SSL 终止,在 webnodes 或负载均衡器上。

通常,在您的网站变得非常大之前,您无需担心这一点——具有 fx nginx 的单个现代服务器每秒将处理数万个普通 HTTP 请求。所以不要做过早的优化,不要在必须之前处理这个。


Hyp*_*ppy 16

负载均衡器不能轻易地被其他负载均衡器扩展,因为链上的某个地方会固有地有一个单一的负载均衡器来维护连接。也就是说,LVS 或 HAProxy 等平衡器在 Gbps 范围内具有荒谬的容量。一旦您超越了单个负载均衡器(软件、硬件等)的能力,那么您就需要转向其他技术,例如循环 DNS。


小智 9

扩展 HTTP 负载平衡层的关键是首先添加另一层较低级别(IP 或 TCP)负载平衡。这一层可以完全用开源软件构建,但如果你有现代路由器,你会得到更好的结果。

流(TCP 会话)应该使用源/目标 IP 和 TCP 端口等标头进行散列,以确定它们去哪个前端。您还需要一种机制来确保当前端死亡时,它不再被使用。

有多种策略,我将概述我在为数百万用户提供服务的网站的生产中使用的一些策略,以便您了解这个想法。详细解释所有内容会太长,但我希望这个答案能为您提供足够的信息/指示以开始使用。为了实施这些解决方案,您将需要真正了解网络的人。

诚然,我在这里描述的内容比其他答案中描述的内容更难实现,但是如果您有一个高访问量的网站,并且具有很大的可扩展性问题和超过 99.9% 的可用性要求,那么这确实是最先进的. 如果您已经有一名网络工程师,那么它的设置和运行成本(包括资本支出和运营支出)比负载平衡器设备要低,而且可以在几乎不增加成本的情况下进一步扩展(与购买新设备相比,甚至更多)当您超出当前型号时昂贵的设备)。

第一个策略:使用防火墙

大概你有几个路由器连接了你的 ISP 上行链路。您的 ISP 提供 2 个链接(主动/被动,使用 VRRP)。在您的路由器上,您还使用 VRRP,并将流向公共网络的流量路由到防火墙。防火墙(FW 1FW 2以下)也是主动/被动的,将过滤流量并将每个流发送到健康的前端服务器(您的 HTTP 负载平衡器,FE 1FE 2以下)。

      +--------------+ +--------------+
      | ISP 路由器 A | | ISP 路由器 B |
      +--------------+ +--------------+
             | |
           ==#======================#==(公网)
             | |
      +--------------+ +--------------+
      | 您的路由器 A | | 您的路由器 B |
      +--------------+ +--------------+
             | |
           ==#======#==========#======#==(RFC 1918 专用网络)
             | | | |
       +------+ +------+ +------+ +------+
       | FW 1 | | FE 1 | | FE 2 | | FW 2 |
       +------+ +------+ +------+ +------+

目标是让流程看起来像这样:

  1. ISP 将流向您的 IP 的流量路由到您的活动路由器。
  2. 您的路由器将流量路由到使用RFC 1918地址的 VIP 。此 VIP 归活动防火墙所有,与 VRRP 非常相似。如果您使用 OpenBSD 来满足防火墙需求,那么您可以使用CARP,这是 VRRP/HSRP 的无专利替代品。
  3. 您的防火墙应用过滤器(例如“只允许 80/tcp 和 443/tcp 进入这个特定的 IP 地址”)。
  4. 您的防火墙还充当路由器并将数据包转发到健康的前端。
  5. 您的前端终止 TCP 连接。

现在魔法发生在第 4 步和第 5 步,所以让我们更详细地了解它们的作用。

您的防火墙知道前端列表(FE 1FE 2),它会根据流的特定方面(例如,通过散列源 IP 和端口以及其他标头)选择其中一个。但它还需要确保将流量转发到一个健康的前端,否则你会造成流量黑洞。例如,如果您使用 OpenBSD,您可以使用relayd. 什么relayd做的很简单:它对所有前端进行健康检查(例如,通过向它们发送探测 HTTP 请求),并且只要前端健康,它就会将其添加到一个表中,防火墙使用该表来选择给定流的数据包的下一跳. 如果前端未通过健康检查,则会将其从表中删除,并且不再向其发送数据包。将数据包转发到前端时,防火墙所做的就是将数据包的目标 MAC 地址交换为所选前端的目标 MAC 地址。

在第 5 步中,您的负载均衡器(无论是 Varnish、nginx 还是其他)接收来自用户的数据包。此时,数据包仍以您的公共 IP 地址为目的地,因此您需要在环回接口上为您的 VIP 设置别名。这称为DSR(直接服务器返回),因为您的前端终止 TCP 连接,并且中间的防火墙只能看到单工流量(仅传入数据包)。您的路由器会将传出的数据包直接路由回 ISP 的路由器。这对 HTTP 流量特别有用,因为请求往往比响应小,有时甚至比响应小。需要明确的是:这不是 OpenBSD 特定的东西,它广泛用于高访问量的网站。

陷阱:

  • 由于您使用 DSR,最终用户将直接连接到您的前端服务器。也许已经是这种情况,但如果不是,您需要确保它们得到充分保护。
  • 如果您使用 OpenBSD,请注意内核是单线程的,因此单个 CPU 内核的性能将限制防火墙的吞吐量。根据您的 NIC 类型和您看到的数据包速率,这可能是一个问题。有很多方法可以解决这个问题(更多内容见下文)。

第二个策略:没有防火墙

这种策略更有效但更难设置,因为它更多地取决于您拥有的路由器的细节。这个想法是绕过上面的防火墙,让路由器完成防火墙所做的所有工作。

您将需要支持每端口 L3/L4 ACL、BGPECMP以及基于策略的路由(PBR) 的路由器。只有高端路由器才支持这些功能,而且使用 BGP 时通常需要支付额外的许可费用。这通常仍然比硬件负载平衡器便宜,并且也更容易扩展。这些高端路由器的好处是它们往往是线速的(例如,它们总是可以最大化链接,即使在 10GbE 接口上,因为它们做出的所有决定都是由 ASIC 在硬件中完成的)。

在您拥有 ISP 上行链路的端口上,应用以前在防火墙上的 ACL(例如“只允许 80/tcp 和 443/tcp 进入这个特定的 IP 地址”)。然后让您的每个前端都与您的路由器保持 BGP 会话。您可以使用优秀的OpenBGPD(如果您的前端在 OpenBSD 上)或Quagga。您的路由器会将流量 ECMP 到健康的前端(因为它们正在维护其 BGP 会话)。路由器还将使用 PBR 适当地将流量路由出去。

改进

  • 使用防火墙对解决方案,如果您可以跨防火墙同步 TCP 状态,那就太好了,这样当一个防火墙出现故障时,一切都可以顺利地转移到另一个防火墙。您可以使用pfsync.
    • 请记住,pfsync这通常会使防火墙上的数据包速率加倍。
    • HTTP 是一种无状态协议,因此如果您在防火墙故障转移期间重置所有连接,这并不是世界末日,因为您不使用pfsync.
  • 如果您超出了单个防火墙,您可以在您的路由器上使用 ECMP 将您的流量路由到多个防火墙。
  • 如果您使用不止一对防火墙,您不妨将它们全部设为主动/主动。您可以通过让防火墙与路由器保持 BGP 会话来实现这一点,就像前端需要在没有防火墙的第二种设计中维护一个会话一样。

示例relayd配置

另请参阅https://calomel.org/relayd.html 上的HOWTO

vip="1.2.3.4" # 你的公网IP
               #(你可以有多个,但没必要)
fe1="10.1.2.101"
fe2="10.1.2.102"
fe3="10.1.2.103"
fe4="10.1.2.104" # 你可以有任意数量的前端。
int_if="em0"
table <fe> { $fe1 重试 2, $fe2 重试 2, $fe3 重试 2, $fe4 重试 2 }
表 <回退> { 127.0.0.1 }

重定向网络流量{
        监听 $vip 80 端口
        会话超时 60
        路由到 <fe> 检查 http "/healthcheck.html" 摘要 "(healthcheck.html 的 sha1sum)" 接口 $int_if
}