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

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

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

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

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

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

    如果您的应用的后端处理延迟时间常达秒级,您可以根据自定义指标(而不是网络延迟时间)对请求进行负载均衡,从而更有效地利用全球计算能力。

  • 最大限度地提高计算效率,方法是根据部署特有的指标组合做出负载均衡决策。例如,设想一个场景,您的请求的处理时间和计算要求变化很大。在此类场景下,仅根据每秒请求速率进行负载均衡会导致负载分布不均匀。在这种情况下,您可能要定义自定义指标,以根据请求速率以及 CPU 或 GPU 利用率的组合进行负载均衡,以便最有效地使用计算舰队。

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

支持的负载均衡器和后端

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

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

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

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

自定义指标的运作方式

为了让负载均衡器能够根据自定义指标做出流量分配决策,您必须先确定最适合您的特定应用的指标。确定要使用的指标后,您可以配置后端以开始向负载均衡器报告这些指标的稳定数据流。 Google Cloud 可让您将指标作为从后端发送到负载均衡器的每个 HTTP 响应标头的一部分进行报告。这些指标封装在自定义 HTTP 响应标头中,并且必须遵循 Open Request Cost Aggregation (ORCA) 标准。

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

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

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

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

确定哪些自定义指标会影响负载均衡决策非常主观,且取决于应用的需求。例如,如果您的应用的后端处理延迟时间达秒级,那么您可能要根据其他自定义指标(而不是标准网络延迟时间)对请求进行负载均衡。

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

例如,如果您配置名为 example-custom-metric 的指标,并将其利用率阈值上限设置为 0.8,负载均衡器会动态调整后端之间的流量分配,以尽可能使后端报告的 example-custom-metric 指标低于 0.8。

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

  • 预留指标。有五个预留的指标名称;这些名称之所以预留,是因为其对应于 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.named_metrics 是用户定义的指标的映射,采用名称值对的格式。

  • orca.cpu_utilization
  • orca.application_utilization
  • orca.mem_utilization
  • orca.named_metrics

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

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

补充说明:

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

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

  • 每个后端服务最多只能有两个自定义指标。不过,您最多可以使用三个自定义指标执行 dryRun 测试。此限制不包含必需的 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

    对于协议缓冲区感知代码,这是二进制序列化 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 后端的负载均衡器。不过,您可以使用此处演示的相同 --custom-metrics 标志,通过使用 gcloud compute backend-services update 命令来更新任何现有的后端。

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

    gcloud beta 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_SERVICE_NAME:后端服务的名称
    • NEG_NAME:可用区级或混合 NEG 的名称
    • NEG_ZONE:在其中创建 NEG 的可用区
    • REGION:对于区域级负载均衡器,是指在其中创建负载均衡器的区域
    • BACKEND_METRIC_NAME:此处使用的自定义指标名称必须与后端的 ORCA 报告所报告的自定义指标名称匹配
    • MAX_UTILIZATION_FOR_METRIC:负载均衡算法必须针对每个指标设定的最大利用率

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

    gcloud beta 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 beta 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 beta 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 beta 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 beta 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 字段将指标文件附加到后端服务。

后续步骤