当同一个实例组位于两个不同的负载均衡器后面时,速率限制将如何工作

Posted

技术标签:

【中文标题】当同一个实例组位于两个不同的负载均衡器后面时,速率限制将如何工作【英文标题】:How rate limiting will work when same instance group is behind two different load balancers 【发布时间】:2017-11-16 18:02:48 【问题描述】:

我正在阅读 GCP 中的速率限制和自动缩放,但遇到了这个问题:

场景:

    我创建了一个实例组 ig 并具有自动缩放功能 OFF。 我创建了一个负载均衡器lb1,详情如下: lb1 包含一个后端服务 bs1,它指向实例组 igwhole group 的最大 RPS 设置为 1000。 前端端口:8080 路径规则:/alpha/* lb1 是一个外部负载均衡器 我又创建了一个负载均衡器lb2,详情如下: lb2 包含一个后端服务 bs2,它指向实例组 igwhole group 的最大 RPS 设置为 2000。 前端端口:9090 路径规则:/beta/* lb2 是区域负载均衡器

我的问题:

谁来监控这两个负载平衡器处理的请求? 1000 或 2000 将遵循哪个限制? 整个请求(即通过lb1lb2)是否会受到速率限制,或者对两个请求流应用单独的限制?

【问题讨论】:

【参考方案1】:

TL;DR - The RPS is set in the Backend Service,因此每个负载均衡器都有自己的 RPS 限制,独立于另一个。

谁将监控两个负载均衡器所服务的请求?

Google Compute Engine (GCE) 将监控负载平衡器所服务的请求,并相应地引导流量以保持在后端服务中每个后端的 RPS 限制内。

1000 或 2000 将遵循哪个限制?

1000 对应于第一个负载均衡器,2000 对应于第二个负载均衡器。请记住,您使用 2 个单独的后端服务 bs1bs2 分别用于 lb1lb2

是整体请求(即通过 lb1 和 lb2)将受到速率限制,还是对两个请求流应用单独的限制?

通过lb1bs1 的请求将符合每个后端VM 的最大值1000 RPS。通过lb2bs2 的请求将符合每个后端VM 的最大2000 RPS。因此,在任何给定的后端 VM 实例中运行的服务至少应该能够处理 3000 RPS

加长版

实例组无法指定 RPS,only backend services do。实例组仅有助于对实例列表进行分组。因此,尽管您可以在多个后端服务中使用相同的实例组,但如果您的目标是在多个后端服务之间共享实例,则需要考虑您在相应后端服务中设置的 RPS 值。 GCE 将无法自动解决此问题。

理想情况下,后端服务代表微服务,由一组后端虚拟机(来自实例组)提供服务。您应该预先计算单个后端实例(即您在 VM 内运行的服务)可以处理多少最大 RPS 以设置此限制。如果您打算在后端服务之间共享 VM,则需要确保在最坏的情况下合并的 RPS 限制是您在 VM 中的服务能够处理的。

Google Compute Engine (GCE) 将监控每个后端服务的指标(即您的情况下的每秒请求数)并将其用于负载平衡。每个负载均衡器在逻辑上都是不同的,因此负载均衡器之间不会有聚合(即使使用相同的实例组)。

Load distribution algorithm

HTTP(S) 负载均衡提供了两种判断实例的方法 加载。在后端服务对象中,balanceMode 属性 在每秒请求数 (RPS) 和 CPU 利用率之间进行选择 模式。两种模式都允许指定最大值; HTTP 负载 平衡器将尝试确保负载保持在限制之下,但是 在故障转移或负载峰值期间可能会发生超过限制的短时间突发 事件

传入的请求被发送到离用户最近的区域,前提是 该地区有可用的容量。如果有多个区域 在一个区域配置后端,流量是分布式的 根据每个组的跨每个区域中的实例组 容量。在区域内,请求均匀分布在 使用循环算法的实例。循环分发可以 通过配置会话亲和性来覆盖。

maxRate 和 maxRatePerInstance

后端服务有2 configuration fields related to RPS,一个是maxRate,一个是maxRatePerInstancemaxRate 可用于为每个组设置RPS,而maxRatePerInstance 可用于为每个实例设置RPS。如果需要,看起来两者可以结合使用。

后端[].maxRate

整数

每秒最大请求数 (RPS) 组。可与RATEUTILIZATION 平衡模式一起使用, 但在 RATE 模式下是必需的。对于RATE 模式,maxRatemaxRatePerInstance 必须设置。

这不能用于内部负载平衡。

后端[].maxRatePerInstance

浮动

每秒最大请求数 (RPS) 单个后端实例可以处理。这用于计算 组的容量。可用于任一平衡模式。为了 RATE 模式,必须设置 maxRate 或 maxRatePerInstance。

这不能用于内部负载平衡。

以高于指定 RPS 的速率接收请求

如果您碰巧以高于 RPS 的速率接收请求并且您已禁用自动扩缩功能,那么我在 Google Cloud 网站上找不到任何关于确切预期行为的文档。我能找到的最接近的是this one,它指定负载均衡器将尝试将每个实例保持在指定的RPS 或以下。因此,这可能意味着如果超过RPS,请求可能会被丢弃,并且客户端可能会基于此看到5XX 错误代码之一(可能是502):

failed_to_pick_backend

负载均衡器未能选择健康的后端来处理 请求。

502

您可以通过设置一个相当低的RPS(如1020)来解决这个问题,然后看看会发生什么。查看您在后端收到请求的时间戳以确定行为。此外,限制可能不会恰好发生在第 11 个或第 21 个请求上,因此请尝试发送远多于每秒的请求以验证请求是否被丢弃。

With Autoscaling

如果您启用自动扩缩,这将自动触发自动扩缩器并使其根据您在自动扩缩器中设置的目标利用率级别扩展实例组中的实例数量。

注意:更新了答案,因为您实际上指定您使用的是 2 个单独的后端服务。

【讨论】:

如果说 lb1 for bs1 已经在提供 1000 RPS 并且我收到一个新请求(即 1001 请求),会发生什么情况。它会被丢弃还是排队?? @VikasVerma - 更新了描述行为的答案。网站上没有关于此的可靠文档,但如果您超过 RPS 并且您没有自动缩放,它似乎只会被丢弃。 我刚遇到同样的问题,Google Cloud 支持人员回答说请求将被排队。它仍然没有记录,我没有任何进一步的细节,比如队列有多大,以及如果你要超过队列的限制大小(拒绝新请求还是从队列中删除项目?)。

以上是关于当同一个实例组位于两个不同的负载均衡器后面时,速率限制将如何工作的主要内容,如果未能解决你的问题,请参考以下文章

数据库集群和负载均衡

可以将 ip 列入白名单以与 aws 负载均衡器后面的 ec2 实例进行入站通信吗?

将“非托管实例组”添加到 HTTPS 负载均衡器时响应缓慢

在负载均衡器后面运行多个 daphne 实例:django-channels

为啥我在 gcloud 中设置 http 负载均衡器时无法选择我创建的托管实例组?

健康检查类型ELB具有多个负载均衡器