应用负载平衡器的自定义指标

本页介绍了如何将自定义指标与应用负载平衡器搭配使用。借助自定义指标,您可以将负载平衡器的流量分发行为配置为基于特定于应用或基础架构要求的指标,而不是 Google Cloud的标准利用率或基于速率的指标。为负载平衡器定义自定义指标后,您可以灵活地将应用请求路由到最适合您的工作负载的后端实例和端点。

负载平衡器会使用自定义指标值来做出以下决策:

  1. 选择应接收流量的后端虚拟机实例组或网络端点组
  2. 选择应接收流量的虚拟机实例或端点
使用自定义指标进行负载均衡。
使用自定义指标的负载均衡(点击可放大)。

以下是自定义指标的一些用例示例:

  • 最大限度地利用全球计算容量,方法是根据与您的应用最相关的自定义指标(而不是区域亲和性或网络延迟时间等默认条件)来做出负载均衡决策。

    如果您的应用后端处理延迟时间通常在几秒钟的范围内,您可以根据自定义指标(而非网络延迟时间)对请求进行负载均衡,从而更高效地使用全球计算容量。

  • 通过根据部署所特有的指标组合做出负载均衡决策,最大限度地提高计算效率。例如,假设您的请求具有高度可变的处理时间和计算要求。在这种情况下,仅根据每秒请求率进行负载均衡会导致负载分布不均。在这种情况下,您可能需要定义一个自定义指标,以便根据请求速率以及 CPU 或 GPU 利用率的组合来平衡负载,从而最大限度地利用计算服务器群。

  • 根据与您的应用要求最相关的自定义指标自动扩缩后端。例如,您可以定义自动扩缩政策,以便在配置的自定义指标超过 80% 时自动扩缩后端实例。这通过使用基于流量的自动扩缩指标 (autoscaling.googleapis.com|gclb-capacity-fullness) 来实现。如需了解详情,请参阅基于负载平衡器流量的自动扩缩

支持的负载平衡器和后端

以下应用负载平衡器支持自定义指标:

  • 全球外部应用负载均衡器
  • 区域级外部应用负载均衡器
  • 跨区域内部应用负载均衡器
  • 区域级内部应用负载均衡器

以下后端类型支持自定义指标:

  • 代管式实例组
  • 可用区级 NEG(具有 GCE_VM_IP_PORT 端点)
  • 混合连接 NEG

自定义指标的运作方式

若要让负载平衡器根据自定义指标做出流量分配决策,您必须先确定与您的特定应用最相关的指标。确定要使用哪些指标后,您可以配置后端,以便开始向负载平衡器报告这些指标的稳定流。 Google Cloud 可让您在从后端发送到负载平衡器的每个 HTTP 响应的标头中报告指标。这些指标封装在自定义 HTTP 响应标头中,并且必须遵循 Open Request Cost Aggregation (ORCA) 标准。

指标可在两个级别进行配置:

  • 在后端级别,用于影响后端(MIG 或 NEG)的选择
  • 在后端服务级别,用于影响虚拟机实例或端点的选择

以下部分介绍了自定义指标的运作方式。

确定哪些自定义指标应影响负载均衡决策

确定哪些自定义指标应影响负载均衡决策具有高度主观性,具体取决于应用的需求。例如,如果您的应用的后端处理延迟时间为几秒级,那么您可能需要根据其他自定义指标(而非标准网络延迟时间)来负载均衡请求。

确定要使用的指标后,您还必须确定每个指标的最大利用率阈值。例如,如果您想将内存用量用作指标,还必须确定每个后端的内存用量上限。

例如,如果您配置名为 example-custom-metric 的指标,并将其最大利用率阈值设置为 0.8,负载平衡器会动态调整后端之间的流量分布,以尽可能将后端报告的 example-custom-metric 指标保持在 0.8 以下。

您可以使用两种类型的自定义指标:

  • 预留指标。有 5 个预留的指标名称;这些名称之所以被预留,是因为它们与 ORCA API 中的顶级预定义字段相对应。

    • orca.cpu_utilization
    • orca.mem_utilization
    • orca.application_utilization
    • orca.eps
    • orca.rps_fractional
  • 命名指标:这些指标是应用特有的指标,您可以使用以下格式的 ORCA named_metrics 字段指定这些指标:

    orca.named_metrics.METRIC_NAME
    

    所有用户定义的自定义指标均使用此 named_metrics 映射以名称-值对的格式指定。

必需的指标

如需让负载平衡器针对后端虚拟机实例组或网络端点组选择使用自定义指标,您必须在发送给负载平衡器的 ORCA 负载报告中指定以下列表中的至少一个利用率指标

  • orca.cpu_utilization,或者
  • orca.application_utilization,或者
  • orca.mem_utilization,或者
  • orca.named_metrics,这是一个以名称-值对形式存储用户定义的指标的映射。

此外,为了让负载平衡器能够使用自定义指标进一步影响后端虚拟机实例或端点的选择,您必须在发送给负载平衡器的 ORCA 负载报告中提供以下所有指标。负载平衡器使用根据这些报告的指标计算出的权重,将负载分配给各个后端。

  • orca.rps_fractional(每秒请求数),
  • orca.eps(每秒错误数),以及
  • 利用率指标,优先级顺序如下:
    • orca.application_utilization
    • orca.cpu_utilization
    • orca.named_metrics 映射中的用户定义指标

补充说明:

  • 每个后端最多只能有 2 个自定义指标。不过,您最多可以使用 3 个自定义指标执行 dryRun 测试

    如果提供了两个指标,负载平衡器会将它们视为相互独立的指标。例如,如果您定义了两个维度:custom-metric-util1custom-metric-util2,负载平衡器会将它们独立处理。如果后端的 custom-metric-util1 利用率较高,负载平衡器会避免将流量发送到此后端。通常,负载平衡器会尝试让所有后端保持大致相同的满载。完整度按 currentUtilization / maxUtilization 计算。在这种情况下,负载平衡器会使用两个指标报告的两个满载值中较高的值来做出负载均衡决策。

  • 每个后端服务最多只能有 2 个自定义指标。不过,您可以执行 dryRun 测试,最多可使用 3 个自定义指标。此限制不包括必需的 orca.epsorca.rps_fractional 指标。此限制也与在后端级别配置的指标无关。

  • 预留指标和命名指标可以搭配使用。例如,您可以在单个负载报告中提供 orca.cpu_utilization = 0.5 和自定义指标(例如 orca.named_metrics.queue_depth_util = 0.2)。

  • 自定义指标名称不得包含受监管、敏感、可识别或其他机密信息,这些信息不应向贵组织之外的任何人显示。

适用于自定义指标规范的可用编码

  • JSON

    负载报告的 JSON 编码示例:

    endpoint-load-metrics-json: JSON {"cpu_utilization": 0.3, "mem_utilization": 0.8, "rps_fractional": 10.0, "eps": 1, "named_metrics": {"custom-metric-util": 0.4}}.
    
  • 二进制 Protobuf

    对于支持 Protocol Buffers 的代码,这是一个二进制序列化 base64 编码的 OrcaLoadReport protobuf,位于 endpoint-load-metrics-binendpoint-load-metrics: BIN 中。

  • 原生 HTTP

    endpoint-load-metrics 中的逗号分隔键值对。以下是 OrcaLoadReport 的扁平化文本表示形式:

    endpoint-load-metrics: TEXT cpu_utilization=0.3, mem_utilization=0.8, rps_fractional=10.0, eps=1, named_metrics.custom_metric_util=0.4
    
  • gRPC

    gRPC 规范要求使用 endpoint-load-metrics-bin 键使用尾随元数据提供指标。

用于报告自定义指标的后端配置

确定要让负载平衡器使用的指标后,您需要配置后端,以便在 ORCA 负载报告中编译所需的自定义指标,并在发送到负载平衡器的每个 HTTP 响应标头中报告其值。

例如,如果您选择 orca.cpu_utilization 作为后端的自定义指标,则该后端必须在发送到负载平衡器的每个数据包中向负载平衡器报告当前的 CPU 利用率。如需了解相关说明,请参阅本页面上的向负载平衡器报告指标部分。

支持自定义指标的负载平衡器配置

若要让负载平衡器使用后端报告的自定义指标值来做出流量分配决策,您必须将每个后端的均衡模式设置为 CUSTOM_METRICS,并将后端服务负载均衡本地性政策设置为 WEIGHTED_ROUND_ROBIN

自定义指标如何与应用负载平衡器搭配使用。
自定义指标如何与应用负载平衡器搭配使用(点击可放大)。
  • CUSTOM_METRICS 均衡模式。后端服务中的每个后端都必须配置为使用 CUSTOM_METRICS 平衡模式。将后端配置为使用 CUSTOM_METRICS 均衡模式时,负载平衡器会根据为每个自定义指标配置的最大利用率阈值将流量引导到后端。

    每个后端都可以指定要报告的一组不同的指标。如果为每个后端配置了多个自定义指标,负载平衡器会尝试分配流量,使所有指标均保持在配置的最大利用率限制以下。

    系统会根据您选择的负载均衡算法在后端之间负载均衡流量;例如,默认的 WATERFALL_BY_REGION 算法会尝试让所有后端以相同的满载运行。

  • WEIGHTED_ROUND_ROBIN 负载均衡位置政策。后端服务的负载均衡位置政策必须设置为 WEIGHTED_ROUND_ROBIN。采用此配置时,负载平衡器还会使用自定义指标在后端中选择最佳实例或端点来处理请求。

配置自定义指标

您将执行以下步骤,以便应用负载平衡器能够根据自定义指标做出负载均衡决策:

  1. 确定要使用的自定义指标。
  2. 配置后端以向负载平衡器报告自定义指标。您必须建立一个可发送到负载平衡器以用于负载均衡决策的数据流。这些指标必须在 ORCA 负载报告中编译和编码,然后使用 HTTP 响应标头报告给负载平衡器。
  3. 将负载平衡器配置为使用后端报告的自定义指标值。

确定自定义指标

此步骤非常主观,具体取决于您自己的应用需求。确定要使用的指标后,您还必须确定每个指标的最大利用率阈值。例如,如果您想将内存用量用作指标,还必须确定每个后端的内存用量上限。

在继续配置负载平衡器之前,请确保您已查看自定义指标的运作方式部分中介绍的可用自定义指标类型(预留和命名)以及指标选择要求。

配置后端以向负载平衡器报告指标

系统会使用 ORCA 标准,在应用后端发送的每个 HTTP 响应中报告自定义指标。本部分将介绍如何在 ORCA 负载报告中编译自定义指标,以及如何在发送到负载平衡器的每个 HTTP 响应标头中报告这些指标。

例如,如果您使用的是 HTTP 文本编码,则标头必须以以下格式报告指标。

endpoint-load-metrics: TEXT BACKEND_METRIC_NAME_1=BACKEND_METRIC_VALUE_1,BACKEND_METRIC_NAME_2=BACKEND_METRIC_VALUE_2

无论使用哪种编码格式,在构建负载报告时,请务必从指标名称中移除 orca. 前缀。

以下代码段演示了如何将两个自定义指标(customUtilAcustomUtilB)附加到 HTTP 标头。此代码段同时显示了原生 HTTP 文本编码和 base64 编码。请注意,此示例仅出于简单起见,对 customUtilAcustomUtilB 的值进行了硬编码。负载平衡器应接收您确定应影响负载均衡的指标的值。

...
type OrcaReportType int

const (
        OrcaText OrcaReportType = iota
        OrcaBin
)

type HttpHeader struct {
        key   string
        value string
}

const (
        customUtilA = 0.2
        customUtilB = 0.4
)

func GetBinOrcaReport() HttpHeader {
        report := &pb.OrcaLoadReport{
                NamedMetrics: map[string]float64{"customUtilA": customUtilA, "customUtilB": customUtilB}}
        out, err := proto.Marshal(report)
        if err != nil {
                log.Fatalf("failed to serialize the ORCA proto: %v", err)
        }
        return HttpHeader{"endpoint-load-metrics-bin", base64.StdEncoding.EncodeToString(out)}
}

func GetHttpOrcaReport() HttpHeader {
        return HttpHeader{
                "endpoint-load-metrics",
                fmt.Sprintf("TEXT named_metrics.customUtilA=%.2f,named_metrics.customUtilB=%.2f",
                        customUtilA, customUtilB)}
}

func GetOrcaReport(t OrcaReportType) HttpHeader {
        switch t {
        case OrcaText:
                return GetHttpOrcaReport()
        case OrcaBin:
                return GetBinOrcaReport()
        default:
                return HttpHeader{"", ""}
        }
}
...

配置负载平衡器以使用自定义指标

为了让负载平衡器在选择后端时使用这些自定义指标,您需要将每个后端的均衡模式设置为 CUSTOM_METRICS。此外,如果您希望自定义指标也影响端点选择,请将负载均衡局部性政策设置为 WEIGHTED_ROUND_ROBIN

本部分介绍的步骤假定您已部署了具有可用区级 NEG 后端的负载平衡器。不过,您可以使用 gcloud compute backend-services update 命令,通过这里演示的相同 --custom-metrics 标志更新任何现有后端。

  1. 在将后端添加到后端服务时,您可以将后端的均衡模式设置为 CUSTOM_METRICS。您可以使用 --custom-metrics 标志指定自定义指标以及用于进行负载均衡决策的阈值。

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --network-endpoint-group=NEG_NAME \
      --network-endpoint-group-zone=NEG_ZONE \
      [--global | region=REGION] \
      --balancing-mode=CUSTOM_METRICS \
      --custom-metrics='name="BACKEND_METRIC_NAME_1",maxUtilization=MAX_UTILIZATION_FOR_METRIC_1' \
      --custom-metrics='name="BACKEND_METRIC_NAME_2",maxUtilization=MAX_UTILIZATION_FOR_METRIC_2'
    

    替换以下内容:

    • BACKEND_METRIC_NAME:此处使用的自定义指标名称必须与后端的 ORCA 报告中报告的自定义指标名称一致。
    • MAX_UTILIZATION_FOR_METRIC:负载均衡算法应针对每个指标设定的最大利用率。

    例如,如果您的后端报告两个自定义指标 customUtilAcustomUtilB(如配置后端以向负载平衡器报告指标部分所示),您可以使用以下命令将负载平衡器配置为使用这些指标:

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --network-endpoint-group=NEG_NAME \
      --network-endpoint-group-zone=NEG_ZONE \
      [--global | region=REGION] \
      --balancing-mode=CUSTOM_METRICS \
      --custom-metrics='name="customUtilA",maxUtilization=0.8' \
      --custom-metrics='name="customUtilB",maxUtilization=0.9'
    

    或者,您也可以在结构化 JSON 文件中提供自定义指标列表:

    {
    "name": "METRIC_NAME_1",
    "maxUtilization": MAX_UTILIZATION_FOR_METRIC_1,
    "dryRun": true
    }
    {
    "name": "METRIC_NAME_2",
    "maxUtilization": MAX_UTILIZATION_FOR_METRIC_2,
    "dryRun": false
    }

    然后,将 JSON 格式的指标文件附加到后端,如下所示:

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --network-endpoint-group=NEG_NAME \
      --network-endpoint-group-zone=NEG_ZONE \
      [--global | region=REGION] \
      --balancing-mode=CUSTOM_METRICS \
      --custom-metrics-file='BACKEND_METRIC_FILE_NAME'
    

    如果您想在不实际影响负载平衡器的情况下测试是否正在报告指标,可以在配置指标时将 dryRun 标志设置为 true,如下所示:

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --network-endpoint-group=NEG_NAME \
      --network-endpoint-group-zone=NEG_ZONE \
      [--global | region=REGION] \
      --balancing-mode=CUSTOM_METRICS \
      --custom-metrics 'name="BACKEND_METRIC_NAME",maxUtilization=MAX_UTILIZATION_FOR_METRIC,dryRun=true'
    

    如果将指标的 dryRun 配置为 true,则该指标会报告给 Monitoring,但负载平衡器实际上不会使用该指标。

    如需执行相反操作,请将 dryRun 标志设为 false 来更新后端服务。

    gcloud compute backend-services update-backend BACKEND_SERVICE_NAME \
      --network-endpoint-group=NEG_NAME \
      --network-endpoint-group-zone=NEG_ZONE \
      [--global | region=REGION] \
      --balancing-mode=CUSTOM_METRICS \
      --custom-metrics 'name="BACKEND_METRIC_NAME",maxUtilization=MAX_UTILIZATION_FOR_METRIC_,dryRun=false'
    

    如果您将所有自定义指标的 dryRun 配置为 true,则将平衡模式设置为 CUSTOM_METRICS 或将负载均衡位置政策设置为 WEIGHTED_ROUND_ROBIN 对负载平衡器没有任何影响。

  2. 如需配置负载平衡器以使用自定义指标来影响端点选择,您可以将后端服务负载均衡位置政策设置为 WEIGHTED_ROUND_ROBIN

    例如,如果您的后端服务已配置了适当的后端,您可以按如下方式配置负载均衡本地性政策:

    gcloud compute backend-services update BACKEND_SERVICE_NAME \
      [--global | region=REGION] \
      --custom-metrics='name=BACKEND_SERVICE_METRIC_NAME,dryRun=false' \
      --locality-lb-policy=WEIGHTED_ROUND_ROBIN
    

    如前面针对后端级指标所示,您还可以在后端服务级别的结构化 JSON 文件中提供自定义指标列表。使用 --custom-metrics-file 字段将指标文件附加到后端服务。

后续步骤