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 + 软件)都不重要。扩展负载均衡器层时的主要考虑因素是:
通常,在您的网站变得非常大之前,您无需担心这一点——具有 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 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
配置另请参阅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 }