Metriche personalizzate per i bilanciatori del carico delle applicazioni

Questa pagina descrive come utilizzare le metriche personalizzate con i bilanciatori del carico delle applicazioni. Le metriche personalizzate ti consentono di configurare il comportamento di distribuzione del traffico del bilanciatore del carico in base a metriche specifiche per i requisiti dell'applicazione o dell'infrastruttura, anziché alle metriche di utilizzo o basate su tariffe standard di Google Cloud. La definizione di metriche personalizzate per il bilanciatore del carico ti offre la flessibilità di instradare le richieste delle applicazioni alle istanze e agli endpoint di backend più ottimali per il tuo carico di lavoro.

Il bilanciatore del carico utilizza i valori delle metriche personalizzate per prendere le seguenti decisioni:

  1. Seleziona il gruppo di istanze VM o il gruppo di endpoint di rete di backend che deve ricevere il traffico
  2. Seleziona l'istanza VM o l'endpoint che deve ricevere il traffico
Bilanciamento del carico con metriche personalizzate.
Bilanciamento del carico con metriche personalizzate (fai clic per ingrandire).

Ecco alcuni casi d'uso di esempio per le metriche personalizzate:

  • Massimizza l'utilizzo della tua capacità di calcolo globale prendendo decisioni di bilanciamento del carico in base alle metriche personalizzate più pertinenti per la tua applicazione, anziché ai criteri predefiniti come l'affinità regionale o la latenza della rete.

    Se le tue applicazioni presentano spesso latenze di elaborazione del backend nell'ordine di alcuni secondi, puoi utilizzare la tua capacità di calcolo globale in modo più efficiente bilanciando il carico delle richieste in base a metriche personalizzate anziché alla latenza della rete.

  • Massimizza l'efficienza di calcolo prendendo decisioni di bilanciamento del carico in base a combinazioni di metriche univoche per il tuo deployment. Ad esempio, immagina uno scenario in cui le tue richieste hanno tempi di elaborazione e requisiti di calcolo molto variabili. In questo scenario, il bilanciamento del carico basato esclusivamente sulla frequenza delle richieste al secondo comporterebbe una distribuzione non uniforme del carico. In questo caso, ti consigliamo di definire una metrica personalizzata che bilanci il carico in base a una combinazione sia della frequenza delle richieste sia dell'utilizzo della CPU o della GPU per utilizzare in modo più efficiente il tuo parco risorse di calcolo.

  • Scalabilità automatica dei backend in base a metriche personalizzate più pertinenti ai requisiti dell'applicazione. Ad esempio, puoi definire un criterio di scalabilità automatica per eseguire la scalabilità automatica delle istanze di backend quando la metrica personalizzata configurata supera l'80%. Questo risultato viene ottenuto utilizzando le metriche di scalabilità automatica basate sul traffico (autoscaling.googleapis.com|gclb-capacity-fullness). Per ulteriori informazioni, consulta Scalabilità automatica in base al traffico del bilanciatore del carico.

Bilanciatori del carico e backend supportati

Le metriche personalizzate sono supportate per i seguenti bilanciatori del carico delle applicazioni:

  • Bilanciatore del carico delle applicazioni esterno globale
  • Bilanciatore del carico delle applicazioni esterno regionale
  • Bilanciatore del carico delle applicazioni interno tra regioni
  • Bilanciatore del carico delle applicazioni interno regionale

Le metriche personalizzate sono supportate con i seguenti tipi di backend:

  • Gruppi di istanze gestite
  • NEG a livello di zona (con endpoint GCE_VM_IP_PORT)
  • NEG connettività ibrida

Come funzionano le metriche personalizzate

Per consentire al bilanciatore del carico di prendere decisioni di distribuzione del traffico in base alle metriche personalizzate, devi prima determinare quali sono le metriche più pertinenti per la tua applicazione specifica. Una volta che sai quali metriche vuoi utilizzare, configura i backend in modo da iniziare a generare un flusso costante di queste metriche per il bilanciatore del carico. Google Cloud ti consente di generare report sulle metriche nell'header di ogni risposta HTTP inviata dai backend al bilanciatore del carico. Queste metriche sono incapsulate in un'intestazione di risposta HTTP personalizzata e devono rispettare lo standard Open Request Cost Aggregation (ORCA).

Le metriche possono essere configurate a due livelli:

  • A livello di backend, per influenzare la selezione del backend (MIG o NEG)
  • A livello di servizio di backend, per influenzare la selezione di istanze VM o endpoint

Le sezioni seguenti descrivono il funzionamento delle metriche personalizzate.

Determina quali metriche personalizzate devono influenzare le decisioni di bilanciamento del carico

Determinare quali metriche personalizzate devono influenzare le decisioni di bilanciamento del carico è molto soggettivo e dipende dalle esigenze delle tue applicazioni. Ad esempio, se le tue applicazioni hanno latenze di elaborazione del backend nell'ordine di alcuni secondi, ti consigliamo di bilanciare il carico delle richieste in base ad altre metriche personalizzate anziché alle latenze di rete standard.

Una volta stabilite le metriche da utilizzare, devi anche determinare la soglia di utilizzo massima per ogni metrica. Ad esempio, se vuoi utilizzare l'utilizzo della memoria come metrica, devi anche determinare la soglia massima di utilizzo della memoria per ogni backend.

Ad esempio, se configuri una metrica denominata example-custom-metric con la sua soglia di utilizzo massima impostata su 0,8, il bilanciatore del carico regola dinamicamente la distribuzione del traffico tra i backend per mantenere la metrica example-custom-metric registrata dal backend inferiore a 0,8, il più possibile.

Puoi utilizzare due tipi di metriche personalizzate:

  • Metriche riservate. Esistono cinque nomi di metriche riservati, che sono riservati perché corrispondono ai campi predefiniti di primo livello nell'API ORCA.

    • orca.cpu_utilization
    • orca.mem_utilization
    • orca.application_utilization
    • orca.eps
    • orca.rps_fractional
  • Metriche con nome: si tratta di metriche univoche per la tua applicazione che puoi specificare utilizzando il campo ORCA named_metrics nel seguente formato:

    orca.named_metrics.METRIC_NAME
    

    Tutte le metriche personalizzate definite dall'utente vengono specificate utilizzando questa mappanamed_metrics nel formato di coppie di nome e valore.

Metriche obbligatorie

Per consentire al bilanciatore del carico di utilizzare metriche personalizzate per la selezione del gruppo di istanze VM o del gruppo di endpoint di rete di backend, devi specificare almeno una delle seguenti metriche di utilizzo dal seguente elenco nel report sul carico ORCA inviato al bilanciatore del carico:

  • orca.cpu_utilization oppure
  • orca.application_utilization oppure
  • orca.mem_utilization oppure
  • orca.named_metrics, che è una mappa di metriche definite dall'utente sotto forma di coppie di nome e valore.

Inoltre, per consentire al bilanciatore del carico di utilizzare metriche personalizzate per influenzare ulteriormente la selezione dell'istanza o dell'endpoint VM di backend, devi fornire tutte le seguenti metriche nel report sul carico ORCA inviato al bilanciatore del carico. Il bilanciatore del carico utilizza i pesi calcolati da queste metriche registrate per assegnare il carico ai singoli backend.

  • orca.rps_fractional (richieste al secondo),
  • orca.eps (errori al secondo) e
  • una metrica di utilizzo con il seguente ordine di precedenza:
    • orca.application_utilization
    • orca.cpu_utilization
    • Metriche definite dall'utente nella mappa orca.named_metrics

Note aggiuntive:

  • Esiste un limite di due metriche personalizzate per backend. Tuttavia, puoi eseguire test dryRun con un massimo di 3 metriche personalizzate.

    Se vengono fornite due metriche, il bilanciatore del carico le tratta in modo indipendente. Ad esempio, se definisci due dimensioni: custom-metric-util1 e custom-metric-util2, il bilanciatore del carico le tratta in modo indipendente. Se un backend è in esecuzione a un livello di utilizzo elevato in termini di custom-metric-util1, il bilanciatore del carico evita di inviare traffico a questo backend. In genere, il bilanciatore del carico cerca di mantenere in esecuzione tutti i backend con lo stesso livello di utilizzo. La pienezza viene calcolata come currentUtilization / maxUtilization. In questo caso, il bilanciatore del carico utilizza il valore più alto dei due valori di saturazione registrati dalle due metriche per prendere decisioni di bilanciamento del carico.

  • Esiste un limite di 2 metriche personalizzate per servizio di backend. Tuttavia, puoi eseguire test dryRun con un massimo di tre metriche personalizzate. Questo limite non include le metriche orca.eps e orca.rps_fractional obbligatorie. Questo limite è indipendente anche dalle metriche configurate a livello di backend.

  • Sia le metriche riservate sia quelle denominate possono essere utilizzate insieme. Ad esempio, orca.cpu_utilization = 0.5 e una metrica personalizzata come orca.named_metrics.queue_depth_util = 0.2 possono essere forniti in un singolo report sul caricamento.

  • I nomi delle metriche personalizzate non devono contenere informazioni regolamentate, sensibili, identificabili o altre informazioni riservate che non devono essere visualizzate da persone esterne alla tua organizzazione.

Codifiche disponibili per la specifica delle metriche personalizzate

  • JSON

    Codifica JSON di esempio di un report sul caricamento:

    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 binario

    Per il codice compatibile con Protocol Buffers, si tratta di un protobuf OrcaLoadReport con codifica base64 e serializzazione binaria in endpoint-load-metrics-bin o in endpoint-load-metrics: BIN.

  • HTTP nativo

    Coppie chiave-valore separate da virgole in endpoint-load-metrics. Questa è una representation text appiattita di 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

    La specifica gRPC richiede che le metriche vengano fornite utilizzando i metadati finali con la chiave endpoint-load-metrics-bin.

Configurazione del backend per generare report sulle metriche personalizzate

Dopo aver stabilito le metriche che vuoi che vengano utilizzate dal bilanciatore del carico, configurerai i backend per compilare le metriche personalizzate richieste in un report sul caricamento ORCA e registrare i relativi valori in ogni intestazione di risposta HTTP inviata al bilanciatore del carico.

Ad esempio, se hai scelto orca.cpu_utilization come metrica personalizzata per un backend, questo deve segnalare l'utilizzo corrente della CPU al bilanciatore del carico in ogni pacchetto inviato. Per le istruzioni, consulta la sezione Generare report sulle metriche per il bilanciatore del carico in questa pagina.

Configurazione del bilanciatore del carico per supportare le metriche personalizzate

Per consentire al bilanciatore del carico di utilizzare i valori delle metriche personalizzate registrati dai backend per prendere decisioni sulla distribuzione del traffico, devi impostare la modalità di bilanciamento di ciascun backend su CUSTOM_METRICS e il criterio di località del bilanciamento del carico del servizio di backend su WEIGHTED_ROUND_ROBIN.

Come funzionano le metriche personalizzate con i bilanciatori del carico delle applicazioni.
Come funzionano le metriche personalizzate con i bilanciatori del carico delle applicazioni (fai clic per ingrandire).
  • Modalità di bilanciamento CUSTOM_METRICS. Ogni backend di un servizio di backend deve essere configurato per utilizzare la modalità di bilanciamento CUSTOM_METRICS. Quando un backend è configurato con la modalità di bilanciamento CUSTOM_METRICS, il bilanciatore del carico indirizza il traffico ai backend in base alla soglia di utilizzo massima configurata per ogni metrica personalizzata.

    Ogni backend può specificare un insieme diverso di metriche da segnalare. Se sono configurate più metriche personalizzate per backend, il bilanciatore del carico tenta di distribuire il traffico in modo che tutte le metriche rimangano al di sotto dei limiti di utilizzo massimo configurati.

    Il traffico viene bilanciato sui backend in base all'algoritmo di bilanciamento del carico scelto. Ad esempio, l'algoritmo WATERFALL_BY_REGION predefinito tenta di mantenere tutti i backend in esecuzione con la stessa intensità.

  • WEIGHTED_ROUND_ROBIN policy di bilanciamento del carico per le località. Il criterio di località del bilanciamento del carico del servizio di backend deve essere impostato su WEIGHTED_ROUND_ROBIN. Con questa configurazione, il bilanciatore del carico utilizza anche le metriche personalizzate per selezionare l'istanza o l'endpoint ottimale all'interno del backend per gestire la richiesta.

Configurare le metriche personalizzate

Per consentire ai bilanciatori del carico delle applicazioni di prendere decisioni di bilanciamento del carico in base a metriche personalizzate, svolgi i seguenti passaggi:

  1. Determina le metriche personalizzate che vuoi utilizzare.
  2. Configura i backend per generare report sulle metriche personalizzate per il bilanciatore del carico. Devi stabilire uno stream di dati che può essere inviato al bilanciatore del carico per essere utilizzato per le decisioni di bilanciamento del carico. Queste metriche devono essere compilate e codificate in un report sul carico ORCA e poi registrate nel bilanciatore del carico utilizzando le intestazioni di risposta HTTP.
  3. Configura il bilanciatore del carico in modo che utilizzi i valori delle metriche personalizzate registrati dai backend.

Determina le metriche personalizzate

Questo passaggio è molto soggettivo in base alle esigenze delle tue applicazioni. Una volta stabilite le metriche da utilizzare, devi anche determinare la soglia di utilizzo massima per ogni metrica. Ad esempio, se vuoi utilizzare l'utilizzo della memoria come metrica, devi anche determinare la soglia massima di utilizzo della memoria per ogni backend.

Prima di procedere alla configurazione del bilanciatore del carico, assicurati di aver esaminato i tipi di metriche personalizzate a tua disposizione (riservate e con nome) e i requisiti per la selezione delle metriche nella sezione Come funzionano le metriche personalizzate.

Configura i backend per generare report sulle metriche per il bilanciatore del carico

Le metriche personalizzate vengono registrate nei bilanciatori del carico nell'ambito di ogni risposta HTTP dei backend dell'applicazione utilizzando lo standard ORCA. Questa sezione mostra come compilare le metriche personalizzate in un report sul carico ORCA e come riportarle in ogni intestazione di risposta HTTP inviata al bilanciatore del carico.

Ad esempio, se utilizzi la codifica di testo HTTP, l'intestazione deve registrare le metriche nel seguente formato.

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

Indipendentemente dal formato di codifica utilizzato, assicurati di rimuovere il prefisso orca. dal nome della metrica quando crei il report sul caricamento.

Ecco uno snippet di codice che mostra come aggiungere due metriche personalizzate (customUtilA e customUtilB) alle intestazioni HTTP. Questo snippet di codice mostra sia la codifica di testo HTTP nativa sia la codifica Base64. Tieni presente che questo esempio hardcode i valori di customUtilA e customUtilB solo per semplicità. Il bilanciatore del carico deve ricevere i valori delle metriche che hai stabilito debbano influire sul bilanciamento del carico.

...
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{"", ""}
        }
}
...

Configurare il bilanciatore del carico in modo che utilizzi metriche personalizzate

Affinché il bilanciatore del carico utilizzi queste metriche personalizzate durante la selezione di un backend, devi impostare la modalità di bilanciamento per ogni backend su CUSTOM_METRICS. Inoltre, se vuoi che le metriche personalizzate influenzino anche la selezione degli endpoint, imposta il criterio di località per il bilanciamento del carico su WEIGHTED_ROUND_ROBIN.

I passaggi descritti in questa sezione presuppongono che tu abbia già eseguito il deployment di un bilanciatore del carico con backend NEG a livello di zona. Tuttavia, puoi utilizzare gli stessi parametri --custom-metrics mostrati qui per aggiornare qualsiasi backend esistente utilizzando il comando gcloud compute backend-services update.

  1. Puoi impostare la modalità di bilanciamento di un backend su CUSTOM_METRICS quando lo aggiungi al servizio di backend. Utilizza il flag --custom-metrics per specificare la metrica personalizzata e la soglia da utilizzare per le decisioni di bilanciamento del carico.

    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'
    

    Sostituisci quanto segue:

    • BACKEND_METRIC_NAME: i nomi delle metriche personalizzate utilizzati qui devono corrispondere ai nomi delle metriche personalizzate riportate dal report ORCA del backend.
    • MAX_UTILIZATION_FOR_METRIC: l'utilizzo massimo che gli algoritmi di bilanciamento del carico devono avere come target per ogni metrica.

    Ad esempio, se i tuoi backend registrano due metriche personalizzate, customUtilA e customUtilB (come mostrato nella sezione Configurare i backend per registrare le metriche nel bilanciatore del carico), devi utilizzare il seguente comando per configurare il bilanciatore del carico in modo che utilizzi queste metriche:

    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'
    

    In alternativa, puoi fornire un elenco di metriche personalizzate in un file JSON strutturato:

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

    Quindi, allega il file delle metriche in formato JSON al backend come segue:

    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'
    

    Se vuoi verificare se le metriche vengono registrate senza influire sul bilanciatore del carico, puoi impostare il flag dryRun su true quando configuri la metrica come segue:

    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'
    

    Quando una metrica è configurata con dryRun impostato su true, viene riportata a Monitoring, ma non viene effettivamente utilizzata dal bilanciatore del carico.

    Per annullare questa operazione, aggiorna il servizio di backend con il flag dryRun impostato su 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'
    

    Se tutte le metriche personalizzate sono configurate con dryRun impostato su true, l'impostazione della modalità di bilanciamento su CUSTOM_METRICS o del criterio di bilanciamento del carico per le località su WEIGHTED_ROUND_ROBIN non avrà alcun effetto sul bilanciatore del carico.

  2. Per configurare il bilanciatore del carico in modo che utilizzi le metriche personalizzate per influenzare la selezione degli endpoint, imposta il criterio di località del bilanciamento del carico del servizio di backend su WEIGHTED_ROUND_ROBIN.

    Ad esempio, se hai un servizio di backend già configurato con i backend appropriati, configura il criterio di località del bilanciamento del carico come segue:

    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
    

    Come dimostrato in precedenza per le metriche a livello di backend, puoi anche fornire un elenco di metriche personalizzate in un file JSON strutturato a livello di servizio di backend. Utilizza il campo --custom-metrics-file per allegare il file delle metriche al servizio di backend.

Passaggi successivi