本頁面說明如何在應用程式負載平衡器中使用自訂指標。您可以使用自訂指標,根據應用程式或基礎架構需求專屬的指標,設定負載平衡器的流量分配行為,而非使用 Google Cloud的標準使用率或以費率為準的指標。為負載平衡器定義自訂指標,您就能靈活地將應用程式要求轉送至最適合工作負載的後端執行個體和端點。
負載平衡器會使用自訂指標值做出下列決定:
- 選取要接收流量的後端虛擬機器 (VM) 執行個體群組或網路端點群組
- 選取要接收流量的 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_utilization
、cpu_utilization
和application_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
(每秒錯誤數)- 使用率指標,優先順序如下:
orca.application_utilization
orca.cpu_utilization
orca.named_metrics
地圖中的使用者定義指標
其他注意事項:
每個後端最多可設定兩個自訂指標。不過,您最多可以使用三個自訂指標執行
dryRun
測試。如果提供兩個指標,負載平衡器會個別處理這兩個指標。舉例來說,如果您定義了兩個維度:
custom-metric-util1
和custom-metric-util2
,負載平衡器會個別處理這兩個維度。如果後端的custom-metric-util1
使用率過高,負載平衡器就會避免將流量傳送至該後端。一般來說,負載平衡器會嘗試讓所有後端以大致相同的滿載率運作。完整度計算公式為currentUtilization
/maxUtilization
。在這種情況下,負載平衡器會使用兩個指標回報的兩個較高值,做出負載平衡決策。每個後端服務最多可有兩個自訂指標。不過,您最多只能使用三個自訂指標來執行
dryRun
測試。但必要的orca.eps
和orca.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-bin
或endpoint-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
。在這種設定下,負載平衡器也會根據自訂指標,在後端選取最適合的執行個體或端點來處理要求。
設定自訂指標
如要讓應用程式負載平衡器使用自訂指標,請執行下列操作:
- 決定要使用的自訂指標。
- 設定後端,向負載平衡器回報自訂指標。您必須建立可傳送至負載平衡器的資料串流,以便用於負載平衡。這些指標必須在 ORCA 負載報表中編譯及編碼,然後使用 HTTP 回應標頭回報給負載平衡器。
- 設定負載平衡器,以便使用後端回報的自訂指標值。
決定自訂指標
這個步驟的做法取決於應用程式的需求,因此非常主觀。確定要使用的指標後,您還必須為每個指標決定最高使用率門檻。舉例來說,如果您想使用記憶體使用率做為指標,則必須為每個後端決定記憶體使用率上限。
繼續設定負載平衡器前,請務必先查看本頁「自訂指標的運作方式」一節所述的資訊,瞭解您可使用的自訂指標類型 (已保留和命名) 以及指標選取要求。
設定後端,向負載平衡器回報指標
系統會使用 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 標頭中附加兩個自訂指標 (customUtilA
和 customUtilB
)。這個程式碼片段同時顯示原生 HTTP 文字編碼和 base64 編碼。請注意,這個範例只是為了簡單起見,將 customUtilA
和 customUtilB
的值硬式編碼。負載平衡器會接收您判斷會影響負載平衡的指標值。
...
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
指令更新任何現有的後端。
將後端新增到後端服務時,您可以將後端的平衡模式設為
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
:負載平衡演算法必須針對每個指標設定的最大使用率
舉例來說,如果您的後端會回報兩個自訂指標
customUtilA
和customUtilB
(如「設定後端,以便向負載平衡器回報指標」一節所示),請使用下列指令設定負載平衡器,以便使用這些指標: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
對負載平衡器沒有任何影響。如要設定負載平衡器,以便使用自訂指標影響端點選取作業,請將後端服務負載平衡區域政策設為
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
欄位將指標檔案附加至後端服務。