高级负载均衡概览
高级负载均衡包含多项功能,可让您微调全球负载均衡和流量分发,以便最大限度地实现可用性、性能和性价比目标。本文档适用于至少对 Cloud Service Mesh 和负载均衡概念有中等了解的用户。
如需实现高级负载均衡,请创建服务负载均衡政策(serviceLbPolicies
资源),其中包含影响后端选择的值。然后,您可以将服务负载均衡政策附加到后端服务。服务负载均衡政策可指定用于确定如何将流量均衡分配到后端的算法。
您可以从以下算法选项中进行选择以实现高级负载均衡:
- Waterfall by region(默认算法)。
- Spray to region。
- Spray to world。
- Waterfall by zone。
还提供了以下其他选项:
- 指定首选后端。Cloud Service Mesh 会先将流量发送到相应 MIG 或 NEG,然后再将流量发送到其他后端。
- 设置自动容量排空。
- 自定义故障切换行为。
在配置任何高级负载均衡选项之前,我们都建议您查看后端服务资源文档。
Cloud Service Mesh 如何路由流量并进行负载均衡
下图展示了 Cloud Service Mesh 如何决定路由流量。
首先,Cloud Service Mesh 根据请求特征以及 Route
资源或网址映射中的路由规则来选择后端服务,具体取决于您的部署使用的 API。
其次,Cloud Service Mesh 根据客户端位置、MIG 或 NEG 的位置、运行状况和容量,以及与后端服务关联的服务负载均衡政策中的信息,选择与后端服务关联的后端 MIG 或 NEG。
最后,Cloud Service Mesh 选择 MIG 或 NEG 中的实例或端点。此选择基于后端服务中的局部负载均衡政策中的信息。
支持的后端和不支持的后端
高级负载均衡支持以下后端类型:
- 非代管实例组
- 托管实例组 (MIG)
- 可用区级网络端点组 (GCE_VM_IP_PORT NEG)
- 混合连接网络端点组 (NON_GCP_PRIVATE_IP_PORT NEG)
高级负载均衡不支持以下后端类型:
- 区域托管实例组
- 互联网网络端点组 (INTERNET_FQDN_PORT NEG)
使用场景
以下部分介绍了每种算法的工作原理,以及如何根据您的具体业务需求选择算法。
在区域内的后端之间平衡流量
默认负载均衡算法 (waterfall by region) 会在一个区域内的所有 MIG 或所有 MIG 中均匀分配流量。除非您有特殊要求,否则我们建议您使用默认算法。
使用 waterfall by region 时,后端会按其容量的比例接收流量,从而提供后端过载保护。流量会在必要时跨可用区边界发送,以使后端在区域内均匀加载。即使客户端的本地可用区有足够的容量,也有跨可用区流量。每个客户端的请求可以分布在该地区内的多个可用区级 MIG 或 NEG 中,这有助于在来自客户端的流量负载不均匀时,使 MIG 或 NEG 上的负载保持均匀。
通过将来自客户端的流量分布到多个可用区来提高弹性
默认的 waterfall by region 算法会尝试平衡多个可用区 MIG 或 NEG 中的容量用量。但是,根据该算法,源自单个客户端的请求不会一致地发送到所有可用区,并且来自单个客户端的请求通常会路由到单个可用区中的 MIG 或 NEG。
如果您希望客户端将其请求分布到某个区域中的所有 MIG 或 NEG,请使用 spray to region 算法,这样可以降低在流量快速、局部增加时出现单个可用区中 MIG 或 NEG 过载的风险。
使用 spray to region 算法时,如果您有两个可用区(A 和 B),并且可用区 B 存在流量高峰,则流量会在这两个可用区之间拆分。使用默认算法时,可用区 B 中的峰值可能会在 Cloud Service Mesh 能够响应更改之前触发可用区中的过载。
请注意,当您使用 spray to region 算法时,每个客户端的流量始终分布在一个区域的后端可用区中。即使本地可用区中有剩余容量,这也会导致跨可用区流量持续增加,并且如果两个 Cloud Service Mesh 客户端正在发送流量到同一可用区,则可能会导致来自 Cloud Service Mesh 的流量的受影响区域增加。
将来自客户端的流量分布到多个区域的所有后端
如前面部分所述,spray to region 算法将来自每个客户端的流量分配到一个区域中的所有可用区。对于在多个区域中具有 MIG 或 NEG 的服务,Cloud Service Mesh 仍会将流量发送到最近的区域,从而优化整体延迟时间。
如果您希望使用更大的分布半径,请使用 spray to world 算法。使用此算法,客户端可将其请求分布到全球多个区域的所有 MIG 或 NEG。
请务必注意,使用此算法,所有流量都会分布到全球所有后端。有缺陷的查询可能会破坏部署中的所有后端。该算法还会产生更多跨区域流量,这可能会增加请求延迟时间并产生额外费用。
最大限度地减少跨可用区流量
您可以使用 waterfall by zone 设置,优化总体延迟时间并减少跨可用区流量。在一个可用区中配置多个 MIG 或 NEG 时,客户端流量将路由到该可用区中最近的 MIG 或 NEG(不超过其容量),然后再将流量发送到该可用区中的下一个 MIG 或 NEG,依此类推,直到该可用区中的所有 MIG 或 NEG 容量均被使用为止。只有这样,流量才会溢出到下一个最近可用区。
使用此算法,您可以最大限度地减少不必要的跨可用区流量。整体延迟时间可能会略有改善,因为首选最近的本地后端。但是,这也可能在一个区域内的 MIG 或 NEG 之间创建不均匀的流量。
负载均衡算法比较
下表对四种 Cloud Service Mesh 负载均衡算法进行了详细比较。
行为 | Waterfall by region | Spray to region | Spray to world | Waterfall by zone |
---|---|---|---|---|
一个区域内稳定状态下的容量用量均匀 | 是 | 是 | 是 | 否 |
多个区域之间稳定状态下的统一容量用量 | 否 | 否 | 是 | 否 |
一个区域内稳定状态下的统一流量拆分 | 否 | 是 | 是 | 否 |
跨可用区的流量 | 可以。此算法会在某个区域内的多个可用区之间均匀地分配流量,同时优化网络延迟时间。如果需要,流量可以跨可用区发送。 | 是 | 是 | 是,流量会填满最近的可用区的容量。然后它将流向下一个可用区。 |
对本地可用区流量高峰的敏感度 | 平均值;取决于已经迁移了多少流量来平衡各个可用区。 | 较低;因为单个可用区峰值将分布在该区域的所有可用区中。 | 较低;因为单个可用区峰值将分布在所有区域。 | 较高;因为单个可用区峰值更有可能完全由单个可用区处理,直到 Cloud Service Mesh 能够做出响应。 |
其他高级负载均衡选项
以下部分讨论了修改 Cloud Service Mesh 负载均衡的选项。
首选后端
您可以配置负载均衡,以将一组后端服务指定为首选后端。后续请求路由到其余后端之前,系统会完全使用这些后端。Cloud Service Mesh 会先将客户端流量分配到首选后端,从而最大限度地缩短客户端的请求延迟时间。
任何超出首选后端配置的容量的流量都会路由到非首选后端。负载均衡算法会在非首选后端之间分配流量。
一个应用场景是溢出到 Google Cloud,您可以在其中指定由混合连接 NEG 表示的本地计算资源,以在请求路由到自动扩缩的 Google Cloud 后端 MIG 或 NEG 之前得到完全使用。此配置可以最大限度地减少 Google Cloud 计算消耗,并且仍然能够灵活地逐步溢出或故障切换到 Google Cloud。
自动排空容量
当后端运行状况不佳时,通常希望尽快将其从负载均衡决策中排除。排除后端可防止将请求发送到运行状况不佳的后端。此外,流量在运行状况良好的后端之间保持平衡,以防止后端过载并优化整体延迟时间。
此选项类似于将 capacityscalar 设置为零。当后端的单个实例或端点通过健康检查的比例低于 25% 时,它会要求 Cloud Service Mesh 自动将后端容量缩减至零。使用此选项时,系统会从全球负载均衡中移除运行状况不佳的后端。
当自动排空的后端再次恢复运行状况良好时,如果至少 35% 的端点或实例运行正常达到 60 秒,则会将这些后端排空。无论后端运行状况如何,Cloud Service Mesh 都不会在后端服务中排空超过 50% 的端点。
一个应用场景是您可以在首选后端中使用自动容量排空。如果首选后端 MIG 或 NEG 且其中的许多端点运行状况不佳,则此设置通过将流量从 MIG 或 NEG 迁出来保护 MIG 或 NEG 中的其余端点。
自定义故障切换行为
Cloud Service Mesh 通过考虑多个因素通常将流量发送到后端。在稳定状态下,Cloud Service Mesh 会将流量发送到根据前面所述的算法选择的后端。从延迟时间和容量利用率方面来看,所选后端会被视为最佳后端。它们称为主要后端。
Cloud Service Mesh 还会跟踪主要后端健康状况不佳且无法接收流量时使用的后端。这些后端称为故障切换后端failover。它们通常是具有剩余容量的附近后端。
当后端健康状况不佳时,Cloud Service Mesh 会尝试避免向其发送流量,而是将流量转移到健康状况良好的后端。
serviceLbPolicy
资源包含一个字段 failoverHealthThreshold
,其值可自定义以控制故障切换行为。您设置的阈值决定了何时将流量从主要后端转移到故障切换后端。
当主要后端中的某些端点健康状况不佳时,Cloud Service Mesh 不一定会立即转移流量。不过,Cloud Service Mesh 可能会将流量转移到主要后端中健康状况良好的端点,以尝试稳定流量。
如果后端中有太多端点健康状况不佳,则其余端点将无法处理额外的流量。在这种情况下,使用故障阈值来决定是否触发故障切换。Cloud Service Mesh 可容忍健康状况不佳,直到达到阈值,然后将部分流量从主要后端转移到故障切换后端。
故障切换健康状况阈值是一个百分比值。您设置的值决定了 Cloud Service Mesh 何时将流量转送到故障切换后端。您可以将该值设置为 1 到 99 之间的整数。Cloud Service Mesh 与 Envoy 结合使用时默认值为 70,Cloud Service Mesh 与无代理 gRPC 结合使用时默认值为 50。与较小值相比,较大值启动流量故障切换会更快。
问题排查
流量分配模式可能会发生变化,具体取决于您使用后端服务设置新的 serviceLbPolicy
的方式。
如需调试流量问题,请使用现有监控系统检查流量如何流向后端。其他 Cloud Service Mesh 和网络指标可帮助您了解做出负载均衡决策的方式。本部分提供常规问题排查和缓解建议。
总体而言,Cloud Service Mesh 会尝试分配流量,以使后端保持低于配置的容量。请注意,这一点无法保证。如需了解详情,您可以查看后端服务的文档。
然后,系统会根据您使用的算法分配流量。例如,使用 WATERFALL_BY_ZONE 算法,Cloud Service Mesh 会尝试将流量保持在最近的可用区。如果您检查网络指标,会看到 Cloud Service Mesh 在发送请求时优先选择 RTT 延迟时间最短的后端,以优化整体 RTT 延迟时间。
以下部分介绍了您可能会遇到的负载均衡政策和首选后端设置方面的问题。
流量先发送到较远的 MIG 或 NEG,然后再发送到较近的 MIG 或 NEG
当首选后端配置了较远的 MIG 或 NEG 时,这是预期行为。如果您不希望出现此行为,请更改首选后端字段中的值。
流量未发送到具有多个运行状况不佳的端点的 MIG 或 NEG
这是由于配置了 autoCapacityDrain
而排空 MIG 或 NEG 的预期行为。使用此设置时,会将具有许多运行状况不佳的端点的 MIG 或 NEG 从负载均衡决策中移除,因此应该避免。如果不希望出现此行为,您可以停用 autoCapacityDrain
设置。但请注意,这意味着流量可能会被发送到具有大量运行状况不佳的端点的 MIG 或 NEG,因此请求可能会失败并显示错误。
首选某些 MIG 或 NEG 时,流量未发送到某些 MIG 或 NEG
如果配置为首选 MIG 或 NEG 尚未达到容量,则这是预期行为。
如果首选后端已配置并且未达到容量上限,则流量将不会发送到其他 MIG 或 NEG。系统会根据这些后端的 RTT 延迟时间首先分配首选 MIG 或 NEG。
如果您希望将流量发送到其他位置,可以在不使用首选后端的情况下配置其后端服务,也可以为首选 MIG 或 NEG 估算更保守的容量。
流量从单个来源发送到过多不同的 MIG 或 NEG
如果使用 spray-to-region 或 spray-to-world 操作,这是预期行为。但是,您可能会遇到流量分配范围更大方面的问题。例如,由于后端会看到来自更多客户端的流量,因此缓存命中率可能会降低。在这种情况下,请考虑使用其他算法,例如 waterfall by region。
流量在后端健康状况更改时发送到远程集群
当 failoverHealthThreshold
设置为较高值时,这是预期行为。如果您希望在发生暂时性健康状况更改时流量保留在主要后端,请将 failoverHealthThreshold
设置为较低值。
健康状况良好的端点在某些端点健康状况不佳时过载
当 failoverHealthThreshold
设置为较低值时,这是预期行为。当某些端点健康状况不佳时,这些健康状况不佳的端点的流量可能会分布在同一 MIG 或 NEG 中的其余端点之间。如果您希望尽早触发故障切换行为,请将 failoverHealthThreshold
设置为更高的值。
限制和注意事项
以下是配置高级负载均衡时应注意的限制和注意事项。
Waterfall-by-zone
在透明维护事件期间,流量可能会在本地可用区之外暂时平衡。
预计某些 MIG 或 NEG 已达到容量上限,而同一区域中的其他 MIG 或 NEG 未得到充分利用。
如果您的服务的流量来源与其端点位于同一可用区,则您会看到跨可用区流量减少。
可用区可能会映射到 Google 数据中心内的不同内部物理硬件集群;例如,由于可用区虚拟化。在这种情况下,同一可用区中的虚拟机可能无法均匀加载。一般来说,总体延迟时间会得到优化。
Spray-to-region
如果一个 MIG 或 NEG 中的端点出现故障,则这些后果通常分散在一组更大的客户端中:换句话说,大量网格客户端可能会受到影响,但更严重。
当客户端向该区域中的所有 MIG 或 NEG 发送请求时,在某些情况下,这可能会增加跨可用区的流量。
向端点打开的连接数可能会增加,导致资源使用量增加。
首选后端
配置为首选后端的 MIG 或 NEG 可能远离客户端,并且可能导致客户端的平均延迟时间较长。即使存在其他能够以低延迟时间为客户端提供服务的 MIG 或 NEG,也可能会发生这种情况。
全球负载均衡算法(waterfall by 区域、spray-to-区域、waterfall-by-zone)不适用于配置为首选后端的 MIG 或 NEG。
自动容量排空
永不排空的 MIG 数下限与使用
serviceLbPolicies
配置时设置的值不同。默认情况下,永不排空的 MIG 数下限为 1。
如果设置了
serviceLbPolicies
,则永不排空的 MIG 或 NEG 的百分比下限为 50%。在这两种配置下,如果 MIG 或 NEG 中的实例或端点数量少于 25%,则 MIG 或 NEG 会被标记为运行状况不佳。要使 MIG 或 NEG 在排空后排空,至少有 35% 的实例或端点必须保持运行状况良好。这样做是为了确保 MIG 或 NEG 不会在排空状态和未排空状态之间变换。
对于不使用均衡模式的后端,容量扩缩器的限制对此同样适用。
后续步骤
- 有关设置说明,请参阅设置高级负载均衡。