應用程式負載平衡器的自訂指標

本頁面說明如何在應用程式負載平衡器中使用自訂指標。您可以使用自訂指標,根據應用程式或基礎架構需求專屬的指標,設定負載平衡器的流量分配行為,而非使用 Google Cloud的標準使用率或以費率為準的指標。為負載平衡器定義自訂指標,您就能靈活地將應用程式要求轉送至最適合工作負載的後端執行個體和端點。

負載平衡器會使用自訂指標值做出下列決定:

  1. 選取要接收流量的後端虛擬機器 (VM) 執行個體群組或網路端點群組
  2. 選取要接收流量的 VM 執行個體或端點
使用自訂指標的負載平衡。
使用自訂指標的負載平衡 (按一下可放大)。

以下是一些自訂指標的範例用途:

  • 盡量充分運用全球運算資源:根據與應用程式最相關的自訂指標 (而非區域親和性或網路延遲等預設條件) 做出負載平衡決策。

    如果應用程式經常出現以秒為單位的後端處理延遲情形,您可以根據自訂指標 (而非網路延遲) 負載平衡要求,更有效率地使用全球運算能力。

  • 根據部署作業專屬的指標組合,做出負載平衡決策,盡量提高運算效率。舉例來說,假設您的要求具有高度變化的處理時間和運算需求。在這種情況下,如果負載平衡器只根據每秒要求數率進行負載平衡,就會導致負載分配不均。在這種情況下,您可能需要定義自訂指標,根據要求率和 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) 選取
  • 在後端層級影響 VM 例項或端點的選取

以下各節說明自訂指標的運作方式。

判斷哪些自訂指標會影響負載平衡決策

決定哪些自訂指標會影響負載平衡決策,取決於應用程式的需求,因此非常主觀。舉例來說,如果應用程式有數秒等級的後端處理延遲時間,您可能會根據其他自訂指標而非標準網路延遲時間,來負載平衡要求。

確定要使用的指標後,您還必須為每個指標決定最高使用率門檻。舉例來說,如果您想使用記憶體使用率做為指標,則必須為每個後端決定記憶體使用率上限。

舉例來說,如果您設定名為 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

    mem_utilizationcpu_utilizationapplication_utilization 指標的值應在 0.0 - 1.00 範圍內,但如果資源使用率超過預算,則可超過 1.00

  • 命名指標。這些是應用程式專屬的指標,您可以使用 ORCA named_metrics 欄位,以下列格式指定這些指標:

    orca.named_metrics.METRIC_NAME
    

    所有使用者定義的自訂指標都會使用這個 named_metrics 對應表,以名稱/值組合的格式指定。

    CUSTOM_METRICS 平衡模式定義的具名指標必須包含 0 - 100 範圍內的值。為 WEIGHTED_ROUND_ROBIN 負載平衡地區政策定義的命名指標沒有預期的範圍。

必要指標

如要讓負載平衡器針對後端 VM 執行個體群組或網路端點群組選取使用自訂指標,您必須在傳送至負載平衡器的 ORCA 負載報表中,指定一或多個下列使用率指標。orca.named_metrics 是使用者定義的指標對應項目,格式為名稱/值組合。

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

此外,如要讓負載平衡器使用自訂指標,進一步影響後端 VM 執行個體或端點的選取,您必須在傳送至負載平衡器的 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

    對於支援 Protocol Buffers 的程式碼,這會是 endpoint-load-metrics-binendpoint-load-metrics: BIN 中的二進位序列化 base64 編碼 OrcaLoadReport protobuf。

  • 原生 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. 前置字串。

以下程式碼片段說明如何在 HTTP 標頭中附加兩個自訂指標 (customUtilAcustomUtilB)。這個程式碼片段同時顯示原生 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 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 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 欄位將指標檔案附加至後端服務。

後續步驟