我经常看到一堆应用程序服务器前面带有SLB /反向代理的Web应用程序体系结构。
如果到SLB的连接数需要太多资源才能使单个 SLB有效处理,会发生什么情况?对于一个具体的但举足轻重的示例,请考虑200万个持久HTTP连接。显然,单个 SLB无法处理此问题。
什么是缩放的建议配置了一个SLB?
创建LB的组/集群是否很典型?如果是这样,客户端负载如何在LB组之间分配?
我经常看到一堆应用程序服务器前面带有SLB /反向代理的Web应用程序体系结构。
如果到SLB的连接数需要太多资源才能使单个 SLB有效处理,会发生什么情况?对于一个具体的但举足轻重的示例,请考虑200万个持久HTTP连接。显然,单个 SLB无法处理此问题。
什么是缩放的建议配置了一个SLB?
创建LB的组/集群是否很典型?如果是这样,客户端负载如何在LB组之间分配?
Answers:
负载平衡器无法轻松地由其他负载平衡器扩展,因为在链上固有地只有一个负载平衡器可以维护连接。也就是说,LVS或HAProxy之类的平衡器在Gbps范围内具有荒唐的容量。一旦超出了单个负载均衡器(软件,硬件等)的功能,那么您将需要使用其他技术,例如循环DNS。
好的,已经有一个可接受的答案,但是有一些补充。. 扩展负载均衡器层的最常见“经典”方法是(没有特定顺序):
DNS Round Robin公开该域的多个IP地址。对于每个IP地址,实施一对高度可用的服务器对(2个服务器协作以始终保持一个IP地址正常工作。)每个IP都使用设备或带有负载平衡软件的服务器对应于一个负载平衡器群集。通过根据需要添加更多负载均衡器对来水平扩展。
路由或防火墙调整可将负载分散到多个负载均衡器。通过散列源IP地址,到负载均衡器的多个等价路由或类似路由,使前端路由器或前端防火墙将传入的连接扩展到多个IP地址(每个IP地址代表一个负载均衡器对)。
的层IP级别负载平衡器在HTTP水平负载平衡器的层的前面。IP层负载平衡可以在ASIC /硅片中实现,并且可以在某些方面快速实现。因此,单个IP负载平衡器对通常可以“保持”多个HTTP / HTTPS级别的负载平衡器,并提供数千兆位的性能水平,同时保持体系结构的美观和简单。
完全深入地了解执行上述操作的不同方法将需要一个很长的答案。但是总的来说,扩展负载均衡器层并不难,而扩展应用程序服务器层尤其是数据库层则要困难得多。
无论您选择设备外形尺寸(F5,Cisco,A10)还是通用服务器(Windows / Linux +软件),都无关紧要。扩展负载均衡器层时的主要注意事项是:
一般情况下,你不需要对这种担心你的网站之前得到非常大的-与外汇nginx的一个现代化的服务器将处理数以万计每秒普通HTTP请求。因此,请勿进行过早的优化,而不必先进行处理。
扩展HTTP负载平衡层的关键是首先添加另一层较低级别(IP或TCP)的负载平衡。该层可以完全用开源软件构建,尽管如果您拥有现代路由器,则可以得到更好的结果。
应该使用诸如源/目标IP和TCP端口之类的标头对流(TCP会话)进行哈希处理,以决定流向哪个前端。您还需要一种机制来确保前端消亡时不再使用。
有多种策略,我将概述在为数百万用户提供服务的站点上用于生产的几个示例,以便您可以理解。详细解释所有内容可能太花时间,但是我希望这个答案将为您提供足够的信息/指针,以帮助您入门。为了实施这些解决方案,您需要一个真正了解网络的人。
诚然,我在此描述的内容比其他答案更难实现,但是如果您的网站访问量大,可伸缩性问题大且可用性要求超过99.9%,这确实是最新技术。如果您已经拥有网络工程师,则与负载平衡器设备相比,设置和运行(在资本支出和运营支出中)的成本要低得多,并且可以进一步扩展,而几乎无需支付额外费用(与购买新设备相比,甚至更多)如果您购买的是当前型号,则价格昂贵的电器)。
大概您有几个路由器,在这些路由器上连接了ISP上行链路。您的ISP提供2条链接(主动/被动,使用VRRP)。在路由器上,您还使用VRRP,并将进入公共网络的流量路由到防火墙。防火墙(FW 1
及FW 2
以下)也处于主动/被动状态,将过滤流量并将每个流发送到运行状况良好的前端服务器(您的HTTP负载平衡器FE 1
及FE 2
以下)。
+ -------------- + + -------------- + | ISP路由器A | | ISP路由器B | + -------------- + + -------------- + | | ==#=====================#==(公共网络) | | + --------------- + + --------------- + | 您的路由器A | | 您的路由器B | + --------------- + + --------------- + | | ==#================#=======(RFC 1918专用网络) | | | | + ------ + + ------ + + ------ + + ------ + | FW 1 | | FE 1 | | FE 2 | | FW 2 | + ------ + + ------ + + ------ + + ------ +
目标是使流程看起来像这样:
现在魔术发生在步骤4和5中,因此让我们更详细地了解它们的作用。
您的防火墙知道前端(FE 1
和FE 2
)的列表,它将根据流的特定方面(例如,通过对源IP和端口进行哈希处理以及其他标头)来选择其中的一个。但是它还需要确保将流量转发到健康的前端,否则您将使流量瘫痪。例如,如果您使用OpenBSD,则可以使用relayd
。什么relayd
这样做很简单:它对所有前端进行健康检查(例如,通过向其发送探测HTTP请求),并且只要前端健康,就会将其添加到防火墙用来选择给定流数据包的下一跳的表中。如果前端未通过运行状况检查,则会将其从表中删除,并且不再发送任何数据包。将数据包转发到前端时,所有防火墙所做的就是将数据包的目标MAC地址交换为所选前端的MAC地址。
在第5步中,负载均衡器(来自Varnish,nginx或其他)接收来自用户的数据包。此时,数据包仍将发送到您的公共IP地址,因此您需要在环回接口上为VIP加上别名。之所以称为DSR(直接服务器返回),是因为您的前端终止了TCP连接,并且它们之间的防火墙仅看到单工通信(仅传入数据包)。您的路由器会将传出数据包直接路由回ISP的路由器。这对于HTTP通信特别有用,因为请求往往小于响应,有时甚至很小。需要明确的是:这不是OpenBSD特有的东西,在人流量大的网站中广泛使用。
陷阱:
此策略效率更高,但难以设置,因为它更多地取决于您所拥有的路由器的具体情况。这个想法是绕过上面的防火墙,让路由器完成防火墙正在做的所有工作。
您将需要支持每端口L3 / L4 ACL,BGP和ECMP以及基于策略的路由(PBR)的路由器。仅高端路由器支持这些功能,并且使用BGP时通常需要支付额外的许可费用。通常,这仍然比硬件负载平衡器便宜,并且扩展起来也容易得多。这些高端路由器的优点在于它们倾向于线速(例如,即使在10GbE接口上,它们也始终可以最大化链路,因为它们做出的所有决定都是由ASIC在硬件中完成的)。
在具有ISP上行链路的端口上,应用防火墙上曾经使用过的ACL(例如“仅允许80 / tcp和443 / tcp转到该特定IP地址”)。然后让您的每个前端与您的路由器维护BGP会话。您可以使用出色的OpenBGPD(如果您的前端在OpenBSD上)或Quagga。您的路由器将ECMP到健康的前端的流量(因为它们正在维护BGP会话)。路由器还将使用PBR适当地路由流量。
pfsync
。
pfsync
这通常会使防火墙上的数据包速率增加一倍。pfsync
。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 }
就我个人而言,那时候我会去找更简单,配置更少的硬件负载平衡器-像思科的ACE / ASA,Foundry ServerIrons甚至Zeus ZXTM(一种为超重负载设计的SW LB)。
一种典型的方法是创建一个足够大的集群来处理所需的负载,并使用可以实现确定性负载平衡的SLB(对于持久连接的情况)。
诸如CARP之类的东西使用请求IP的哈希值来确定哪个后端Web服务器将处理该请求,这应该是确定性的,但如果负载均衡器前面有防火墙或NAT,则它不是很有用。如果您在Linux上运行,
您可能还会发现IPVS之类的有用信息。