负载均衡器会泛滥吗?

Do load balancers flood?

我正在阅读有关负载平衡的内容。

我理解负载平衡器在任何给定应用程序的多个从属服务器之间转移负载的想法。然而,我能找到的很少有文献谈到当负载平衡器本身开始与大量请求作斗争时会发生什么,以至于 "simple" 负载平衡任务(在从属之间分配请求)成为一项不可能完成的任务.

以这张图片为例,您看到了 3 个负载均衡器 (LB) 和一些从属服务器。

图 1: 客户端知道他们连接的一个 IP,一个负载均衡器在该 IP 后面并且必须处理所有这些请求,因此第一个负载均衡器是瓶颈(和互联网连接)。

当第一个负载均衡器开始出现问题时会发生什么?如果我在第一个负载均衡器旁边添加一个新的负载均衡器,我必须再添加一个,这样客户端只需要知道一个 IP。所以困境继续:我仍然只有一个负载均衡器接收我所有的请求...!

图 2: 我添加了一个负载均衡器,但为了让客户端只知道一个 IP,我不得不添加另一个来集中传入连接,从而导致相同的瓶颈。

此外,我的互联网连接也将达到它可以处理的客户端数量限制,因此我可能希望在偏远地区安装负载均衡器以避免互联网连接泛滥。但是,如果我分发我的负载均衡器,并想让我的客户只知道他们必须连接的一个 IP,我仍然需要在该 IP 后面有一个中央负载均衡器再次承载所有流量...

Google 和 Facebook 等现实世界的公司如何处理这些问题?这是否可以在不给客户端多个 IP 并期望他们随机选择一个的情况下完成,避免每个客户端连接到同一个负载均衡器,从而淹没我们?

您的问题听起来不是特定于 AWS 的,所以这是一个通用的答案(AWS 中的弹性 LB 会根据流量自动缩放):

你是对的,你可以用传入的请求数量压倒负载均衡器。如果你在标准构建机器上部署 LB,你可能首先 exhaust/overload 网络堆栈包括最大打开的连接数和传入连接的处理率。

第一步,您需要微调 LB 机器的网络堆栈。如果仍然不能为您提供所需的吞吐量,市场上有特殊用途的负载均衡器设备,它们是全新构建和高度优化的,可以处理大量传入连接并将它们路由到多个服务器。例如 F5 和 netscaler

您还可以设计应用程序以帮助您将流量拆分到不同的子域,从而减少 1 LB 必须处理的请求数。

也可以实施 round-robin DNS,其中您将有 1 个 DNS 入口点到多个面向客户端的 LB,而不是像您描述的那样只有一个。

如果您打算使用 amazon elastic load balancer 他们声称

Elastic Load Balancing automatically scales its request handling capacity to meet the demands of application traffic. Additionally, Elastic Load Balancing offers integration with Auto Scaling to ensure that you have back-end capacity to meet varying levels of traffic levels without requiring manual intervention.

因此您可以使用它们,而无需使用您自己的 instance/product

来处理负载均衡器

由于您标记了 Amazon,他们的系统中内置了负载平衡器,因此您不需要。只需使用 ELB,Amazon 会将流量定向到您正确的系统。

如果您自己做,负载平衡器通常具有非常轻的处理负载。它们通常只是根据对数据的浅层检查(或不检查)将连接从一台机器重定向到另一台机器。他们有可能不堪重负,但通常这需要一个会使大多数连接饱和的负载。

如果您是 运行 自己,并且您的负载均衡器正在做更多的工作或您的连接变得饱和,下一步是使用 Round-Robin DNS 来查找您的负载均衡器,通常使用 NS 和 CNAME 记录的组合,因此不同的名称查找会给出不同的 IP 地址。

像 Netscaler 和类似的高级负载均衡器也做 GSLB with DNS 而不是简单的 DNS-RR(解释进一步扩展)

如果您要连接到 service.domain.com,您可以让负载平衡器成为该区域的权威 DNS,并将所有负载平衡器添加为有效名称服务器。

当客户端查找 "service.domain.com" 时,您的任何负载均衡器都会响应 DNS 请求并使用您的客户端正确数据中心的 IP 进行回复。然后,您可以根据客户端的地理位置、客户端 DNS 服务器和 netscaler 之间的延迟,进一步使负载均衡器响应 DNS 请求,或者您可以根据不同的数据中心负载进行响应。

在每个数据中心,您通常会在集群中设置一个节点或多个节点。使用这样的设计,您可以扩展得非常高。