慢启动模式

慢启动模式是 Envoy 中的一种配置设置,用于逐步增加新添加的上游端点的流量量。如果未启用慢启动,Envoy 将向新上游端点发送与它们比例相同的流量。这对于需要预热时间才能提供完整生产负载的服务来说可能不可取,并且会导致请求超时、数据丢失和用户体验下降。

慢启动模式是一种影响上游端点负载均衡权重的机制,可以针对每个上游集群进行配置。目前,慢启动模式在 循环轮询最小请求 负载均衡器类型中受支持。

慢启动模式对于少数新端点启动的情况(例如,Kubernetes 中的扩展事件)最有效。当所有端点都相对较新时(例如,Kubernetes 中的新部署),慢启动模式的效果并不显著,因为所有端点最终都会获得相同数量的请求。

用户可以指定一个 慢启动窗口参数(以秒为单位),它表示每个端点的慢启动模式持续时间。在慢启动窗口期间,特定端点的负载均衡权重将随着时间因子进行缩放,例如:

\[NewWeight = {Weight}*{max(MinWeightPercent,{TimeFactor}^\frac{1}{Aggression})}\]

其中,

\[TimeFactor = \frac{max(TimeSinceStartInSeconds,1)}{SlowStartWindowInSeconds}\]

随着时间的推移,在慢启动窗口内,越来越多的流量将被发送到端点。

MinWeightPercent 参数 指定最小百分比的原始权重,以确保 EDF 调度程序具有合理的截止日期,默认值为 10%。

Aggression 参数 非线性地影响端点权重,并代表了流量增加的速度。通过调整攻击参数,可以实现流量增加的多项式或指数速度。下面的模拟演示了攻击参数的不同值如何影响流量增加:

../../../../_images/slow_start_aggression.svg

每当慢启动窗口持续时间过去时,上游端点退出慢启动模式,并根据负载均衡算法获得常规的流量量。它的负载均衡权重将不再根据运行时偏差和攻击进行缩放。如果端点离开集群,它也可以退出慢启动模式。如果端点已通过主动健康检查从不健康状态转换为健康状态,它也可以重新进入慢启动模式。

再次强调,端点进入慢启动模式:
  • 如果集群中未配置主动健康检查,则在加入集群后立即进行。

  • 如果集群中配置了主动健康检查,则在端点已通过主动健康检查从不健康状态转换为健康状态时进行。

端点在以下情况下退出慢启动模式:
  • 它离开集群。

  • 它未通过集群中配置的主动健康检查。如果端点通过了主动健康检查,它可能会重新进入慢启动模式。

不建议在低流量或大量端点场景中启用慢启动模式,潜在的缺点包括:
  • 端点饥饿,其中端点由于低流量或大量总端点而接收请求的概率很低。

  • 虚假(非逐步)流量增加,每当一个饥饿的端点收到一个请求,并且在慢启动窗口内已经过去了足够的时间时,它的负载均衡权重由于时间因子而不会线性地增加。

以下是如何在具有相同优先级和循环轮询负载均衡器类型的端点中,使用 60 秒的慢启动窗口、没有主动健康检查和 1.0 的攻击来展示结果负载均衡权重的示例。一旦端点 E1 和 E2 退出慢启动模式,它们的负载均衡权重将保持不变。

../../../../_images/slow_start_example.svg

注意,当使用慢启动模式时,如果使用多个优先级,并且较低优先级只有一个端点 A,在跨优先级溢出期间,不会逐步增加到端点 A 的流量,所有流量都会立即转移。同样的情况也适用于区域加权负载均衡,当对上游集群启用慢启动模式,并且流量跨区域路由到只有一个端点 A 的区域时,不会逐步增加到端点 A 的流量。