高级负载均衡优化

本页面介绍了如何使用服务负载均衡政策为以下负载均衡器提供高级费用、延迟时间和弹性优化支持:

  • 全球外部应用负载均衡器
  • 跨区域内部应用负载均衡器
  • 全局外部代理网络负载均衡器
  • 跨区域内部代理网络负载均衡器

Cloud Service Mesh 还支持高级负载均衡优化。如需了解详情,请参阅 Cloud Service Mesh 文档中的高级负载均衡概览

服务负载均衡政策 (serviceLbPolicy) 是与负载均衡器的后端服务关联的资源。通过服务负载均衡政策,您可以自定义一些参数,以影响流量在与后端服务关联的后端中的分配方式:

  • 自定义负载均衡算法,用于确定流量在特定区域或可用区中的分配方式。
  • 启用自动容量排空,以便负载均衡器可以快速排空健康状况不佳的后端中的流量。
  • 设置故障切换阈值,以确定何时将后端视为健康状况不佳。这样,流量便可以故障切换到其他后端,以避免健康状况不佳的后端。

此外,您还可以将特定后端指定为首选后端。这些后端必须先达到最大容量,系统才会向其余的后端发送请求。

下图展示了 Cloud Load Balancing 如何评估路由、负载均衡和流量分配。

Cloud Load Balancing 如何做出路由和流量分配决策。
Cloud Load Balancing 如何做出路由和流量分配决策。

须知事项

在查看本页面的内容之前,请仔细查看外部应用负载均衡器概览页面中所述的请求分配过程。对于始终处于高级层级的负载均衡器,本页面中所述的所有负载均衡算法都支持在区域之间溢出(如果首选区域已满)。

受支持的后端

服务负载均衡政策和首选后端只能在使用下表所示受支持的后端的负载均衡器上配置。

后端 是否支持?
实例组
  • 不受管理
  • 可用区级代管式
区域级 MIG
可用区级 NEG(GCE_VM_IP_PORT 端点)
混合 NEG(NON_GCP_PRIVATE_IP_PORT 端点)
无服务器 NEG
互联网 NEG
Private Service Connect NEG

负载均衡算法

本部分介绍了您可以在服务负载均衡政策中配置的负载均衡算法。如果您未配置算法,或根本未配置服务负载均衡政策,则负载均衡器默认使用 WATERFALL_BY_REGION

Waterfall by region

WATERFALL_BY_REGION 是默认负载均衡算法。使用此算法时,从总体上区域中的所有 Google Front End (GFE) 都会尝试根据其配置的目标容量的比例(由其容量扩缩器修改)填充后端。

每个单独的第二层 GFE 倾向于选择尽可能靠近(由网络往返时间定义)第二层 GFE 的可用区中的后端实例或端点。由于 WATERFALL_BY_REGION 会最大限度地缩短可用区之间的延迟时间(在请求速率较低的情况下),因此每个第二层 GFE 可能仅向第二层 GFE 的首选可用区中的后端发送请求。

Spray to region

SPRAY_TO_REGION 算法会修改每个第二层 GFE 的单独行为,以使每个第二层 GFE 不会优先选择尽可能靠近第二层 GFE 的可用区中的后端实例或端点。使用 SPRAY_TO_REGION 时,每个第二层 GFE 会向区域的所有可用区中的所有后端实例或端点发送请求,无需优先考虑第二层 GFE 与后端实例或端点之间较短的往返时间。

WATERFALL_BY_REGION 一样,区域中的所有第二层 GFE 都根据其配置的目标容量的比例(由其容量扩缩器修改)填充后端。

虽然 SPRAY_TO_REGION 可在区域的所有可用区中的后端之间实现更均匀的分布(尤其是在请求速率较低的情况下),但这种均匀分布需注意以下事项:

  • 当后端发生故障(但继续通过其健康检查)时,更多第二层 GFE 会受到影响,但个别影响不会太严重。
  • 由于每个第二层 GFE 不会将一个可用区优先于另一个可用区,因此第二层 GFE 会创建更多跨可用区流量。根据处理的请求数,每个第二层 GFE 还可能会创建更多与后端的 TCP 连接。

Waterfall by zone

WATERFALL_BY_ZONE 算法会修改每个第二层 GFE 的单独行为,以使每个第二层 GFE 强烈优先选择可能最靠近第二层 GFE 的可用区中的后端实例或端点。使用 WATERFALL_BY_ZONE 时,如果第二层 GFE 已在其最优先的可用区中填充了(或按比例溢出)后端实例或端点,则每个第二层 GFE 仅会向区域的其他可用区中的后端实例或端点发送请求。

WATERFALL_BY_REGION 一样,区域中的所有第二层 GFE 都根据其配置的目标容量的比例(由其容量扩缩器修改)填充后端。

WATERFALL_BY_ZONE 算法可最大限度地缩短延迟时间,但要注意以下事项:

  • WATERFALL_BY_ZONE 本身不会最大限度地减少跨可用区连接。该算法仅取决于延迟时间。
  • WATERFALL_BY_ZONE 不保证每个第二层 GFE 始终先填充其最优先的可用区,然后再填充其他可用区。维护事件可能会暂时使第二层 GFE 中的所有流量发送到其他可用区中的后端实例或端点。
  • WATERFALL_BY_ZONE 可能会导致整个区域内所有后端实例或端点之间的请求分布不太均匀。例如,第二层 GFE 最优先的可用区中的后端实例或端点可能会填充达到最大容量,而其他可用区中的后端不会填充达到最大容量。

比较负载均衡算法

下表比较了不同的负载均衡算法。

行为 Waterfall by region Spray to region Waterfall by zone
单个区域内的统一容量用量
跨多个区域的统一容量用量
负载均衡器中的统一流量分配
跨可用区流量分配 是。流量会在区域内的各可用区中均匀分配,同时优化网络延迟时间。如果需要,流量可能会跨可用区发送。 是。流量会先流向最近的可用区,直到其达到最大容量。 然后,它流向下一个最近的可用区。
对本地可用区中的流量高峰的敏感度 平均;取决于为在可用区之间保持均衡已迁移了多少流量。 较低;单个可用区高峰分布在区域的所有可用区中。 较高;单个可用区高峰可能完全由同一可用区处理,直到负载均衡器能够做出响应。

自动容量排空

当后端健康状况不佳时,您通常希望尽快从负载均衡决策中排除该后端。通过排除健康状况不佳的后端,您可以仅将流量发送到健康状况良好的后端,从而缩短总体延迟时间。

启用自动容量排空功能后,如果后端不到 25% 的实例或端点通过健康检查,则负载均衡器会自动将后端的容量缩减到零。这会从全球负载均衡池中移除健康状况不佳的后端。当您希望避免将流量路由到该后端时,此操作在功能上等同于将 backendService.capacityScaler 设置为 0

如果之前自动排空后端的 35% 的实例或端点(超过阈值 10%)通过了健康检查长达 60 秒,则该后端会自动取消排空并重新添加到负载均衡池。这可确保后端真正健康状况良好,并且不会在排空和取消排空状态之间切换。

即使启用了自动容量排空,负载均衡器也不会排空连接到后端服务的超过 50% 的后端(无论后端的健康状况如何)。保持 50% 的后端连接状态可以降低健康状况良好的后端过载的风险。

自动容量排空的一个应用场景是使用该功能来最大限度地降低首选后端过载的风险。例如,如果某个后端被标记为首选,但其大多数实例或端点健康状况不佳,则自动容量排空会从负载均衡池中移除该后端。自动容量排空会将流量转移到其他后端,而不是使首选后端中其余健康状况良好的实例或端点过载。

您可以作为服务负载均衡政策的一部分启用自动容量排空。如需了解详情,请参阅配置服务负载均衡政策

不使用均衡模式的后端不支持自动容量排空。这包括互联网 NEG、无服务器 NEG 和 PSC NEG 等后端。

故障切换阈值

负载均衡器以多级层方式确定后端之间的流量分配。在稳定状态下,负载均衡器会将流量发送到根据前面介绍的一种负载均衡算法选择的后端。这些后端称为主要后端,从延迟时间和容量方面来看,会被视为最佳后端。

负载均衡器还会跟踪其他后端,如果主要后端健康状况不佳且无法处理流量,则可以使用其他后端。这些后端称为故障切换后端。这些后端通常是附近具有剩余容量的后端。

如果主要后端中的实例或端点健康状况不佳,则负载均衡器不会立即将流量转移到其他后端。负载均衡器会先将流量转移到同一后端中其他健康状况良好的实例或端点,以帮助稳定流量负载。如果主要后端中有太多端点健康状况不佳,并且同一后端中的其余端点无法处理额外的流量,则负载均衡器会使用故障切换阈值来确定何时开始向故障切换后端发送流量。负载均衡器可以容忍主要后端的健康状况不佳,直到达到故障切换阈值。之后,流量会从主要后端迁出。

故障切换阈值是介于 1 到 99 之间的值,表示为后端中健康状况必须良好的端点的百分比。如果健康状况良好的端点的百分比低于故障切换阈值,则负载均衡器会尝试将流量发送到故障切换后端。默认情况下,故障切换阈值为 70。

如果故障切换阈值设置得过高,则由于暂时性健康状况更改,可能会发生不必要的流量溢出。如果故障切换阈值设置得过低,则即使有许多健康状况不佳的端点,负载均衡器仍会继续向主要后端发送流量。

故障切换决策会本地化。各个本地 Google Front End (GFE) 前端的行为方式彼此独立。您应负责确保故障切换后端可以处理额外的流量。

故障切换流量可能会导致后端过载。即使后端健康状况不佳,负载均衡器仍可能向其发送流量。如需从可用后端池中排除健康状况不佳的后端,请启用自动容量排空功能

首选后端

首选后端是指您希望在将流量溢出到其他后端之前优先用尽容量的后端。超出首选后端配置的容量的任何流量都会路由到其余非首选后端。然后,负载均衡算法会在后端服务的非首选后端之间分配流量。

您可以将负载均衡器配置为先首选并完全使用连接到后端服务的一个或多个后端,然后再将后续请求路由到其余后端。

使用首选后端时,请考虑以下限制:

  • 配置为首选后端的后端可能会更远离客户端,导致客户端请求的平均延迟时间较长。即使其他更接近的后端能够以较短的延迟时间为客户端提供服务,也会发生这种情况。
  • 某些负载均衡算法(WATERFALL_BY_REGIONSPRAY_TO_REGIONWATERFALL_BY_ZONE)不适用于配置为首选后端的后端。

如需了解如何设置首选后端,请参阅设置首选后端

配置服务负载均衡政策

通过服务负载均衡政策资源,您可以配置以下字段:

  • 负载均衡算法
  • 自动容量排空
  • 故障切换阈值

如需设置首选后端,请参阅设置首选后端

创建政策

如需创建和配置服务负载均衡政策,请完成以下步骤:

  1. 创建服务负载均衡政策资源。您可以使用 YAML 文件执行此操作,也可以使用 gcloud 参数直接执行此操作。

    • 使用 YAML 文件。您可以在 YAML 文件中指定服务负载均衡政策。以下示例 YAML 文件展示了如何配置负载均衡算法,启用自动容量排空,以及设置自定义故障切换阈值:

      name: projects/PROJECT_ID/locations/global/serviceLbPolicies/SERVICE_LB_POLICY_NAME
      autoCapacityDrain:
          enable: True
      failoverConfig:
          failoverHealthThreshold: FAILOVER_THRESHOLD_VALUE
      loadBalancingAlgorithm: LOAD_BALANCING_ALGORITHM
      

      替换以下内容:

      • PROJECT_ID:项目 ID。
      • SERVICE_LB_POLICY_NAME:服务负载均衡政策的名称。
      • FAILOVER_THRESHOLD_VALUE:故障切换阈值。该值应是 1 到 99 之间的数字。
      • LOAD_BALANCING_ALGORITHM:要使用的负载均衡算法。可以是 SPRAY_TO_REGIONWATERFALL_BY_REGIONWATERFALL_BY_ZONE

      创建 YAML 文件后,将该文件导入新的服务负载均衡政策。

      gcloud network-services service-lb-policies import SERVICE_LB_POLICY_NAME \
       --source=PATH_TO_POLICY_FILE \
       --location=global
      
    • 不使用 YAML 文件。或者,您可以在不使用 YAML 文件的情况下配置服务负载均衡政策功能。

      如需设置负载均衡算法并启用自动排空,请使用以下参数:

      gcloud network-services service-lb-policies create SERVICE_LB_POLICY_NAME \
       --load-balancing-algorithm=LOAD_BALANCING_ALGORITHM \
       --auto-capacity-drain \
       --failover-health-threshold=FAILOVER_THRESHOLD_VALUE \
       --location=global
      

      替换以下内容:

      • SERVICE_LB_POLICY_NAME:服务负载均衡政策的名称。
      • LOAD_BALANCING_ALGORITHM:要使用的负载均衡算法。可以是 SPRAY_TO_REGIONWATERFALL_BY_REGIONWATERFALL_BY_ZONE
      • FAILOVER_THRESHOLD_VALUE:故障切换阈值。该值应是 1 到 99 之间的数字。
  2. 更新后端服务,以使其 --service-lb-policy 字段引用新创建的服务负载均衡政策资源。后端服务只能与一个服务负载均衡政策资源相关联。

    gcloud compute backend-services update BACKEND_SERVICE_NAME \
      --service-lb-policy=SERVICE_LB_POLICY_NAME \
      --global
    

    您可以在创建后端服务时将服务负载均衡政策与后端服务相关联。

    gcloud compute backend-services create BACKEND_SERVICE_NAME \
        --protocol=PROTOCOL \
        --port-name=NAMED_PORT_NAME \
        --health-checks=HEALTH_CHECK_NAME \
        --load-balancing-scheme=LOAD_BALANCING_SCHEME \
        --service-lb-policy=SERVICE_LB_POLICY_NAME \
        --global
    

移除政策

如需从后端服务中移除服务负载均衡政策,请使用以下命令:

gcloud compute backend-services update BACKEND_SERVICE_NAME \
    --no-service-lb-policy \
    --global

设置首选后端

您可以使用 Google Cloud CLI 或 API 配置首选后端。

gcloud

添加首选后端

如需设置首选后端,请在将后端添加到后端服务时使用 gcloud compute backend-services add-backend 命令来设置 --preference 标志。

gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
    ...
    --preference=PREFERENCE \
    --global

PREFERENCE 替换为您要分配给后端的优先级别。可以是 PREFERREDDEFAULT

该命令的其余部分取决于您使用的后端类型(实例组或 NEG)。如需了解所有必需参数,请参阅 gcloud compute backend-services add-backend 命令

更新后端的优先设置

如需更新后端的 --preference 参数,请使用 gcloud compute backend-services update-backend 命令

gcloud compute backend-services update-backend BACKEND_SERVICE_NAME \
    ...
    --preference=PREFERENCE \
    --global

该命令的其余部分取决于您使用的后端类型(实例组或 NEG)。以下示例命令会更新后端实例组的优先设置并将其设置为 PREFERRED

gcloud compute backend-services update-backend BACKEND_SERVICE_NAME \
    --instance-group=INSTANCE_GROUP_NAME \
    --instance-group-zone=INSTANCE_GROUP_ZONE \
    --preference=PREFERRED \
    --global

API

如需设置首选后端,请使用全球性 backendServices 资源对每个后端设置 preference 标志。

以下示例展示了如何配置后端优先设置:

  name: projects/PROJECT_ID/locations/global/backendServices/BACKEND_SERVICE_NAME
  ...
  - backends
      name: BACKEND_1_NAME
      preference: PREFERRED
      ...
  - backends
      name: BACKEND_2_NAME
      preference: DEFAULT
      ...

请替换以下内容:

  • PROJECT_ID:项目 ID
  • BACKEND_SERVICE_NAME:后端服务的名称
  • BACKEND_1_NAME:首选后端的名称
  • BACKEND_2_NAME:默认后端的名称

问题排查

当您将新的服务负载均衡政策附加到后端服务时,流量分配模式可能会发生变化。

如需调试流量问题,请使用 Cloud Monitoring 查看流量在负载均衡器和后端之间流动的方式。Cloud Load Balancing 日志和指标也可以帮助您了解负载均衡行为。

本部分汇总了您可能会在新公开的配置中看到的一些常见场景。

来自单个来源的流量发送到过多不同的后端

这是 SPRAY_TO_REGION 算法的预期行为。但是,您可能会遇到流量分配范围更大导致的问题。例如,由于后端看到来自更多客户端的流量,缓存命中率可能会降低。在这种情况下,请考虑使用其他算法,例如 WATERFALL_BY_REGION

流量未发送到具有大量健康状况不佳的端点的后端

这是启用 autoCapacityDrain 时的预期行为。具有大量健康状况不佳的端点的后端会被排空并从负载均衡池中移除。如果您不希望发生此行为,可以停用自动容量排空。但是,这意味着流量可能会发送到具有大量健康状况不佳的端点的后端,并且请求可能会失败。

流量先发送到距离更远的后端,然后再发送到距离更近的后端

如果首选后端比默认后端距离更远,则这是预期行为。如果您不希望发生此行为,请相应地更新每个后端的优先设置。

使用首选后端时流量未发送到某些后端

这是首选后端尚未达到最大容量时的预期行为。系统会先根据到首选后端的往返延迟时间分配这些后端。

如果您希望将流量发送到其他后端,可以执行以下操作之一:

  • 更新其他后端的优先设置。
  • 为首选后端设置较低的目标容量设置。目标容量是使用 max-ratemax-utilization 字段配置的,具体取决于后端服务的均衡模式

流量在暂时性健康状况更改期间发送到远程后端

这是故障切换阈值设置为较高值时的预期行为。如果您希望在发生暂时性健康状况更改时流量继续流向主要后端,请将此字段设置为较低值。

健康状况良好的端点在其他端点健康状况不佳时过载

这是故障切换阈值设置为较低值时的预期行为。当端点健康状况不佳时,发往这些健康状况不佳的端点的流量会改为分布在同一后端中的其余端点之间。如果您希望更快地触发故障切换行为,请将此字段设置为更高的值。

限制

  • 每个后端服务只能与单个服务负载均衡政策资源关联。