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


22

我经常看到一堆应用程序服务器前面带有SLB /反向代理的Web应用程序体系结构。

如果到SLB的连接数需要太多资源才能使单个 SLB有效处理,会发生什么情况?对于一个具体的但举足轻重的示例,请考虑200万个持久HTTP连接。显然,单个 SLB无法处理此问题。

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

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


z8000,您能说说您正在使用什么软件负载均衡器吗?同样,如果可能,它使用哪种算法/协议进行负载平衡。
马丁

我没有偏好。我更新了问题,使之更清楚。
z8000 2011年

我尚不清楚为什么负载平衡器本来就无法处理200万个持久HTTP连接。
womble

Answers:


10

负载平衡器无法轻松地由其他负载平衡器扩展,因为在链上固有地只有一个负载平衡器可以维护连接。也就是说,LVS或HAProxy之类的平衡器在Gbps范围内具有荒唐的容量。一旦超出了单个负载均衡器(软件,硬件等)的功能,那么您将需要使用其他技术,例如循环DNS。


对!拥有单个LB是“问题”。我同意吞吐量通常不会成为问题。但是我担心RAM等其他资源,在我看来,这是有限的。在RAM用完之前,单个SLB上只能托管许多连接。
z8000 2011年

HAProxy可以处理每GB RAM约20k-60k的活动会话。我相信LVS可以做得更多,因为保留的会话数据较小。如果您用完了RAM,请升级它或构建另一个负载均衡器,该负载均衡器以循环DNS系统为首。
2011年

1
“负载均衡器不能轻易被其他负载均衡器扩展”-实际上,单个基于ASIC的L4负载均衡器通常可以放置在两个基于L7 HTTP的负载均衡器之前,从而获得出色的结果。相同的基本原理适用于纯软件的实现,例如nignx前面的Linux LVS。
Jesper M

19

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

  • DNS Round Robin公开该域的多个IP地址。对于每个IP地址,实施一对高度可用的服务器对(2个服务器协作以始终保持一个IP地址正常工作。)每个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终止,在Web节点上或负载平衡器上。

一般情况下,你不需要对这种担心你的网站之前得到非常大的-与外汇nginx的一个现代化的服务器将处理数以万计每秒普通HTTP请求。因此,请勿进行过早的优化,而不必先进行处理。


使用DNS RR,实际上并不需要每个IP地址都高度可用。通常,浏览器在无法连接时会回退到另一个IP(如果可用)。但是,如果您具有公共Web服务,则每个IP地址都将需要HA,因为许多Web服务库不会自动处理故障转移到其他IP。
rmalayter 2011年

9

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

应该使用诸如源/目标IP和TCP端口之类的标头对流(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会话来实现此目的,就像前端需要在没有防火墙的情况下在第二个设计中维护一个BGP会话一样。

样本relayd配置

另请参阅HOWTO,网址https://calomel.org/relayd.html。

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”
表<fe> {$ fe1重试2,$ fe2重试2,$ fe3重试2,$ fe4重试2}
表<fallback> {127.0.0.1}

重定向webtraffic {
        在$ vip端口80上监听
        会话超时60
        路由到<fe>检查http“ /healthcheck.html”摘要“(healthcheck.html的sha1sum)”接口$ int_if
}

2

就我个人而言,那时候我会去找更简单,配置更少的硬件负载平衡器-像思科的ACE / ASA,Foundry ServerIrons甚至Zeus ZXTM(一种为超重负载设计的SW LB)。


换句话说扩展?这样的LB仍会在一定数量的连接(例如)上最大化。然后怎样呢?那真的是我的问题。谢谢!
z8000 2011年

1
真正的大型站点只是使用大量重型LB,这些LB在某种形式的DNS循环下运行-对于大多数人而言,目前足够了,并且可以处理数亿个连接。那就是为什么存在这样的问题,为什么当然需要保持如此多的连接...
Chopper3,2011年

您是说内部 RRDNS吗?整洁,我没想到。回复:打开连接...我正在研究某个应用程序的选项,该应用程序需要随着时间的推移在后端某处发生事件而向连接的客户端发送更新。我在自定义TCP服务器或SLB后面的许多开放HTTP连接之间感到困惑。谢谢您的意见。
z8000 2011年

我认为这将必须是外部RRDNS。例如,Twitter.com将使用RRDNS解析请求并将请求分发到许多大型LB之一,然后再将负载分发到服务器。
罗伯特

是的,Robert,您是对的,例如,我们使用Cisco GSS盒进行逐站点RR。
斩波器

1

也许不是持续保持这么多打开的连接来发送答复,而是以某种方式对应用程序进行编码,以便客户端可以根据需要定期轮询服务器?

您正在执行的操作实际上是否需要毫秒级的响应,或者客户可以等待15/20秒,直到下一个轮询周期?


0

一种典型的方法是创建一个足够大的集群来处理所需的负载,并使用可以实现确定性负载平衡的SLB(对于持久连接的情况)。

诸如CARP之类的东西使用请求IP的哈希值来确定哪个后端Web服务器将处理该请求,这应该是确定性的,但如果负载均衡器前面有防火墙或NAT,则它不是很有用。如果您在Linux上运行,
您可能还会发现IPVS之类的有用信息。


您对鲤鱼的主张与它的工作原理相去甚远,我不知道从哪里开始!+ -0表示IPVS。
3molo

@ 3molo ...嗯?请参阅linux.com/archive/feed/35482上的 net.inet.carp.arpbalance。 “。CARP源对请求的原始IP进行哈希处理。然后使用哈希从可用池中选择虚拟主机来处理请求。”
保罗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.