Ottimizzazioni del bilanciamento del carico avanzate

Questa pagina descrive come utilizzare un criterio di bilanciamento del carico dei servizi per supportare ottimizzazioni avanzate di costi, latenza e resilienza per i seguenti bilanciatori del carico:

  • Bilanciatore del carico delle applicazioni esterno globale
  • Bilanciatore del carico delle applicazioni interno tra regioni
  • Bilanciatore del carico di rete proxy esterno globale
  • Bilanciatore del carico di rete proxy interno tra regioni

Traffic Director supporta inoltre le ottimizzazioni avanzate del bilanciamento del carico. Per i dettagli, consulta la Panoramica sul bilanciamento del carico avanzato nella documentazione di Traffic Director.

Un criterio di bilanciamento del carico del servizio (serviceLbPolicy) è una risorsa associata al servizio di backend del bilanciatore del carico. Un criterio di bilanciamento del carico del servizio consente di personalizzare i parametri che influenzano la distribuzione del traffico all'interno dei backend associati a un servizio di backend:

  • Personalizza l'algoritmo di bilanciamento del carico utilizzato per determinare in che modo il traffico viene distribuito all'interno di una determinata regione o zona.
  • Abilita lo svuotamento automatico della capacità in modo che il bilanciatore del carico possa scaricare rapidamente il traffico dai backend in stato non integro.
  • Imposta una soglia di failover per determinare quando un backend è considerato non integro. In questo modo il traffico può eseguire il failover su un backend diverso per evitare backend in stato non integro.

Inoltre, puoi designare backend specifici come backend preferiti. Questi backend devono essere utilizzati al massimo per poter inviare le richieste ai backend rimanenti.

Il seguente diagramma mostra in che modo Cloud Load Balancing valuta il routing, il bilanciamento del carico e la distribuzione del traffico.

In che modo Cloud Load Balancing prende le decisioni di routing e distribuzione del traffico.
In che modo Cloud Load Balancing prende le decisioni di routing e distribuzione del traffico.

Prima di iniziare

Prima di esaminare i contenuti di questa pagina, esamina attentamente il processo di distribuzione delle richieste descritto nella pagina di riepilogo del bilanciatore del carico delle applicazioni esterno. Per i bilanciatori del carico che sono sempre di livello Premium, tutti gli algoritmi di bilanciamento del carico descritti in questa pagina supportano il scorping da una regione all'altra se una regione di prima scelta è già piena.

Backend supportati

I criteri di bilanciamento del carico dei servizi e i backend preferiti possono essere configurati solo su bilanciatori del carico che utilizzano i backend supportati, come indicato nella tabella seguente.

Backend Supportato?
Gruppi di istanze
  • Non gestito
  • Gestita a livello di zona
MIG a livello di area geografica
NEG a livello di zona (GCE_VM_IP_PORT endpoint)
NEG ibridi (NON_GCP_PRIVATE_IP_PORT endpoint)
NEG serverless
NEG Internet
NEG Private Service Connect

Algoritmi di bilanciamento del carico

Questa sezione descrive gli algoritmi di bilanciamento del carico che puoi configurare in un criterio di bilanciamento del carico dei servizi. Se non configuri un algoritmo o se non configuri affatto un criterio di bilanciamento del carico del servizio, il bilanciatore del carico utilizza WATERFALL_BY_REGION per impostazione predefinita.

A cascata per regione

WATERFALL_BY_REGION è l'algoritmo di bilanciamento del carico predefinito. Con questo algoritmo, in forma aggregata, tutti i Google Front End (GFE) in una regione tentano di riempire i backend in proporzione alle capacità target configurate (modificate dai rispettivi scaler della capacità).

Ogni singolo GFE di secondo livello preferisce selezionare istanze o endpoint di backend in una zona il più vicina possibile (definita dal tempo di round trip della rete) al GFE di secondo livello. Poiché WATERFALL_BY_REGION riduce al minimo la latenza tra le zone, a bassi tassi di richieste, ogni GFE di secondo livello potrebbe inviare richieste esclusivamente ai backend nella zona preferita del GFE di secondo livello.

Spray a regione

L'algoritmo SPRAY_TO_REGION modifica il comportamento singolo di ogni GFE di secondo livello a condizione che ciascun GFE di secondo livello non abbia preferenze per la selezione di istanze o endpoint di backend che si trovano in una zona il più vicina possibile al GFE di secondo livello. Con SPRAY_TO_REGION, ciascun GFE di secondo livello invia richieste a tutte le istanze o endpoint di backend, in tutte le zone dell'area geografica, senza preferenza per un tempo di round trip più breve tra il GFE di secondo livello e gli endpoint o le istanze di backend.

Come WATERFALL_BY_REGION, in forma aggregata, tutti i GFE di secondo livello nella regione riempiono i backend in proporzione alle capacità di destinazione configurate (modificate dai rispettivi utenti che scalano la capacità).

Mentre SPRAY_TO_REGION fornisce una distribuzione più uniforme tra i backend in tutte le zone di una regione, soprattutto con tassi di richieste bassi, questa distribuzione uniforme prevede le seguenti considerazioni:

  • Quando i backend non sono disponibili (ma continuano a superare i controlli di integrità), vengono interessati più GFE di secondo livello, anche se l'impatto individuale è meno grave.
  • Poiché ciascun GFE di secondo livello non ha preferenze per una zona rispetto a un'altra, i GFE di secondo livello creano più traffico tra zone. A seconda del numero di richieste da elaborare, ogni GFE di secondo livello potrebbe creare più connessioni TCP con i backend.

A cascata per zona

L'algoritmo WATERFALL_BY_ZONE modifica il comportamento singolo di ogni GFE di secondo livello in modo che ogni GFE di secondo livello abbia una forte preferenza di selezionare le istanze o gli endpoint di backend che si trovano nella zona più vicina possibile al GFE di secondo livello. Con WATERFALL_BY_ZONE, ciascun GFE di secondo livello invia solo richieste a istanze o endpoint di backend in altre zone della regione quando il GFE di secondo livello ha riempito (o riempito proporzionalmente) istanze o endpoint di backend nella sua zona preferita.

Come WATERFALL_BY_REGION, in forma aggregata, tutti i GFE di secondo livello nella regione riempiono i backend in proporzione alle capacità di destinazione configurate (modificate dai rispettivi utenti che scalano la capacità).

L'algoritmo WATERFALL_BY_ZONE riduce al minimo la latenza con le seguenti considerazioni:

  • WATERFALL_BY_ZONE non riduce al minimo le connessioni tra zone. L'algoritmo è gestito solo dalla latenza.
  • WATERFALL_BY_ZONE non garantisce che ogni GFE di secondo livello riempia sempre la zona preferita prima di riempire le altre zone. Gli eventi di manutenzione possono causare temporaneamente l'invio temporaneo di tutto il traffico da un GFE di secondo livello a istanze o endpoint di backend in un'altra zona.
  • WATERFALL_BY_ZONE può comportare una distribuzione meno uniforme delle richieste tra tutte le istanze o gli endpoint di backend all'interno della regione nel suo complesso. Ad esempio, le istanze o gli endpoint di backend nella zona preferita del GFE secondo livello potrebbero essere riempiti fino alla capacità, mentre i backend in altre zone non vengono riempiti fino alla capacità.

Confrontare gli algoritmi di bilanciamento del carico

La tabella seguente mette a confronto i diversi algoritmi di bilanciamento del carico.

Comportamento A cascata per regione Spray a regione A cascata per zona
Utilizzo uniforme della capacità all'interno di una singola regione No
Utilizzo uniforme della capacità in più regioni No No No
Suddivisione del traffico uniforme dal bilanciatore del carico No No
Distribuzione del traffico tra zone Sì. Il traffico viene distribuito uniformemente tra le zone di una regione ottimizzando la latenza di rete. Se necessario, il traffico può essere inviato tra zone diverse. Sì. Il traffico arriva prima alla zona più vicina fino a raggiungere la capacità massima. Quindi, passa alla zona più vicina.
Sensibilità ai picchi di traffico in una zona locale Media; dipende dalla quantità di traffico già spostata per bilanciare le varie zone. Inferiore; i picchi di zona singola sono distribuiti in tutte le zone della regione. Maggiore: è probabile che i picchi in una singola zona vengano gestiti interamente dalla stessa zona finché il bilanciatore del carico non riesce a reagire.

Svuotamento automatico della capacità

Quando un backend non è integro, di solito conviene escluderlo dalle decisioni di bilanciamento del carico il più rapidamente possibile. L'esclusione dei backend in stato non integro ottimizza la latenza complessiva inviando il traffico solo ai backend integri.

Quando abiliti la funzionalità di svuotamento automatico della capacità, il bilanciatore del carico scala automaticamente la capacità di un backend fino a zero quando meno del 25% delle istanze o degli endpoint del backend supera i controlli di integrità. Il backend in stato non integro viene rimosso dal pool di bilanciamento del carico globale. Questa azione equivale a impostare backendService.capacityScaler su 0 per un backend quando vuoi evitare di indirizzare il traffico a quel backend.

Se il 35% (10% sopra la soglia) delle istanze o degli endpoint di un backend sottoposto a svuotamento automatico in precedenza supera i controlli di integrità per 60 secondi, il backend viene automaticamente annullato e aggiunto di nuovo al pool di bilanciamento del carico. Ciò garantisce che il backend sia veramente integro e non flip-flop tra uno stato svuotato e non svuotato.

Anche se lo svuotamento automatico della capacità è abilitato, il bilanciatore del carico non svuota più del 50% dei backend collegati a un servizio di backend, indipendentemente dallo stato di integrità di un backend. Mantenere il 50% dei backend collegati riduce il rischio di sovraccarico dei backend integri.

Un caso d'uso dello svuotamento automatico della capacità è quello di utilizzarlo per ridurre al minimo il rischio di sovraccarico dei tuoi backend preferiti. Ad esempio, se un backend è contrassegnato come preferito, ma la maggior parte delle sue istanze o dei suoi endpoint è in stato non integro, lo svuotamento automatico della capacità rimuove il backend dal pool di bilanciamento del carico. Invece di sovraccaricare le istanze o gli endpoint integri rimanenti nel backend preferito, lo svuotamento automatico della capacità sposta il traffico verso altri backend.

Puoi abilitare lo svuotamento automatico della capacità come parte del criterio di bilanciamento del carico del servizio. Per maggiori dettagli, consulta Configurare un criterio di bilanciamento del carico del servizio.

La capacità automatica non è supportata con backend che non utilizzano una modalità di bilanciamento. Sono inclusi backend come NEG internet, NEG serverless e NEG PSC.

Soglia di failover

Il bilanciatore del carico determina la distribuzione del traffico tra i backend in modo multilivello. In stato stabile, invia il traffico ai backend selezionati in base a uno degli algoritmi di bilanciamento del carico descritti in precedenza. Questi backend, denominati backend primari, sono considerati ottimali in termini di latenza e capacità.

Il bilanciatore del carico tiene inoltre traccia degli altri backend che possono essere utilizzati se i backend principali non sono integri e non sono in grado di gestire il traffico. Questi backend sono chiamati backend di failover. Questi sono in genere backend vicini con la capacità rimanente.

Se le istanze o gli endpoint nel backend principale sono in stato non integro, il bilanciatore del carico non sposta immediatamente il traffico verso altri backend. Il bilanciatore del carico sposta prima il traffico ad altre istanze o endpoint in stato integro nello stesso backend per stabilizzare il carico del traffico. Se troppi endpoint in un backend principale non sono integri e gli endpoint rimanenti nello stesso backend non sono in grado di gestire il traffico aggiuntivo, il bilanciatore del carico utilizza la soglia di failover per determinare quando iniziare a inviare il traffico a un backend di failover. Il bilanciatore del carico tollera lo stato non integro nel backend principale fino alla soglia di failover. Successivamente, il traffico viene spostato dal backend principale.

La soglia di failover è un valore compreso tra 1 e 99, espresso come percentuale di endpoint in un backend che deve essere integro. Se la percentuale di endpoint integri scende al di sotto della soglia di failover, il bilanciatore del carico tenta di inviare il traffico a un backend di failover. Per impostazione predefinita, la soglia di failover è pari a 70.

Se la soglia di failover è impostata su un valore troppo elevato, possono verificarsi sversamenti di traffico non necessari a causa di modifiche temporanee allo stato. Se la soglia di failover è impostata su un valore troppo basso, il bilanciatore del carico continua a inviare traffico ai backend primari anche se sono presenti molti endpoint non integri.

Le decisioni di failover vengono localizzate. Ogni Google Front End (GFE) locale si comporta in modo indipendente dall'altro. È tua responsabilità assicurarti che i backend di failover possano gestire il traffico aggiuntivo.

Il traffico di failover può causare il sovraccarico dei backend. Anche se un backend non è integro, il bilanciatore del carico potrebbe comunque inviare traffico lì. Per escludere i backend in stato non integro dal pool di backend disponibili, abilita la funzionalità di svuotamento automatico della capacità.

Backend preferiti

I backend preferiti sono quelli di cui vuoi utilizzare completamente la capacità prima di distribuire il traffico ad altri backend. Tutto il traffico che supera la capacità configurata dei backend preferiti viene instradato ai restanti backend non preferiti. L'algoritmo di bilanciamento del carico distribuisce quindi il traffico tra i backend non preferiti di un servizio di backend.

Puoi configurare il bilanciatore del carico in modo da preferire e utilizzare completamente uno o più backend collegati a un servizio di backend prima di eseguire il routing delle richieste successive ai backend rimanenti.

Considera le seguenti limitazioni quando utilizzi i backend preferiti:

  • I backend configurati come backend preferiti potrebbero essere distanti dai client e comportare una latenza media maggiore per le richieste dei client. Questo avviene anche se esistono altri backend più vicini che avrebbero potuto servire i client con una latenza più bassa.
  • Alcuni algoritmi di bilanciamento del carico (WATERFALL_BY_REGION, SPRAY_TO_REGION e WATERFALL_BY_ZONE) non si applicano ai backend configurati come backend preferiti.

Per scoprire come impostare i backend preferiti, consulta Impostare i backend preferiti.

configura un criterio di bilanciamento del carico del servizio

La risorsa del criterio di bilanciamento del carico del servizio consente di configurare i seguenti campi:

  • Algoritmo di bilanciamento del carico
  • Svuotamento automatico della capacità
  • Soglia di failover

Per impostare un backend preferito, consulta Impostare i backend preferiti.

Crea un criterio

Per creare e configurare un criterio di bilanciamento del carico del servizio, completa questi passaggi:

  1. Crea una risorsa del criterio di bilanciamento del carico del servizio. Puoi farlo utilizzando un file YAML o direttamente, usando i parametri gcloud.

    • Con un file YAML. Puoi specificare i criteri di bilanciamento del carico del servizio in un file YAML. Ecco un file YAML di esempio che mostra come configurare un algoritmo di bilanciamento del carico, abilitare lo svuotamento automatico della capacità e impostare una soglia di failover personalizzata:

      name: projects/PROJECT_ID/locations/global/serviceLbPolicies/SERVICE_LB_POLICY_NAME
      autoCapacityDrain:
          enable: True
      failoverConfig:
          failoverHealthThreshold: FAILOVER_THRESHOLD_VALUE
      loadBalancingAlgorithm: LOAD_BALANCING_ALGORITHM
      

      Sostituisci quanto segue:

      • PROJECT_ID: l'ID progetto.
      • SERVICE_LB_POLICY_NAME: nome del criterio di bilanciamento del carico del servizio.
      • FAILOVER_THRESHOLD_VALUE: il valore della soglia di failover. Deve essere un numero compreso tra 1 e 99.
      • LOAD_BALANCING_ALGORITHM: l'algoritmo di bilanciamento del carico da utilizzare. Può essere SPRAY_TO_REGION, WATERFALL_BY_REGION o WATERFALL_BY_ZONE.

      Dopo aver creato il file YAML, importalo in un nuovo criterio di bilanciamento del carico del servizio.

      gcloud beta network-services service-lb-policies import SERVICE_LB_POLICY_NAME \
       --source=PATH_TO_POLICY_FILE \
       --location=global
      
    • Senza un file YAML. In alternativa, puoi configurare le funzionalità dei criteri di bilanciamento del carico del servizio senza usare un file YAML.

      Per impostare l'algoritmo di bilanciamento del carico e abilitare il svuotamento automatico, utilizza i seguenti parametri:

      gcloud beta network-services service-lb-policies create SERVICE_LB_POLICY_NAME \
       --load-balancing-algorithm=LOAD_BALANCING_ALGORITHM \
       --auto-capacity-drain \
       --failover-health-threshold=FAILOVER_THRESHOLD_VALUE \
       --location=global
      

      Sostituisci quanto segue:

      • SERVICE_LB_POLICY_NAME: nome del criterio di bilanciamento del carico del servizio.
      • LOAD_BALANCING_ALGORITHM: l'algoritmo di bilanciamento del carico da utilizzare. Può essere SPRAY_TO_REGION, WATERFALL_BY_REGION o WATERFALL_BY_ZONE.
      • FAILOVER_THRESHOLD_VALUE: il valore della soglia di failover. Deve essere un numero compreso tra 1 e 99.
  2. Aggiorna un servizio di backend in modo che il campo --service-lb-policy faccia riferimento alla risorsa del criterio di bilanciamento del carico del servizio appena creata. Un servizio di backend può essere associato a una sola risorsa dei criteri di bilanciamento del carico del servizio.

    gcloud beta compute backend-services update BACKEND_SERVICE_NAME \
      --service-lb-policy=SERVICE_LB_POLICY_NAME \
      --global
    

    Puoi associare un criterio di bilanciamento del carico del servizio a un servizio di backend durante la creazione del servizio di backend.

    gcloud beta compute backend-services create BACKEND_SERVICE_NAME \
        --protocol=PROTOCOL \
        --port-name=NAMED_PORT_NAME \
        --health-checks=HEALTH_CHECK_NAME \
        --load-balancing-scheme=LOAD_BALANCING_SCHEME \
        --service-lb-policy=SERVICE_LB_POLICY_NAME \
        --global
    

Rimuovere un criterio

Per rimuovere un criterio di bilanciamento del carico del servizio da un servizio di backend, utilizza questo comando:

gcloud beta compute backend-services update BACKEND_SERVICE_NAME \
    --no-service-lb-policy \
    --global

Imposta backend preferiti

Puoi configurare i backend preferiti utilizzando Google Cloud CLI o l'API.

gcloud

Aggiungi un backend preferito

Per impostare un backend preferito, usa il comando gcloud beta compute backend-services add-backend per impostare il flag --preference quando aggiungi il backend al servizio di backend.

gcloud beta compute backend-services add-backend BACKEND_SERVICE_NAME \
    ...
    --preference=PREFERENCE \
    --global

Sostituisci PREFERENCE con il livello di preferenza che vuoi assegnare al backend. Il valore può essere PREFERRED o DEFAULT.

Il resto del comando dipende dal tipo di backend in uso (gruppo di istanze o NEG). Per tutti i parametri richiesti, vedi il comando gcloud beta compute backend-services add-backend.

Aggiorna la preferenza di un backend

Per aggiornare il parametro --preference di un backend, utilizza il comando gcloud beta compute backend-services update-backend.

gcloud beta compute backend-services update-backend BACKEND_SERVICE_NAME \
    ...
    --preference=PREFERENCE \
    --global

Il resto del comando dipende dal tipo di backend in uso (gruppo di istanze o NEG). Il comando di esempio seguente aggiorna la preferenza di un gruppo di istanza di backend e la imposta su PREFERRED:

gcloud beta compute backend-services update-backend BACKEND_SERVICE_NAME \
    --instance-group=INSTANCE_GROUP_NAME \
    --instance-group-zone=INSTANCE_GROUP_ZONE \
    --preference=PREFERRED \
    --global

API

Per impostare un backend preferito, imposta il flag preference su ogni backend utilizzando la risorsa backendServices globale.

Ecco un esempio che mostra come configurare la preferenza di backend:

  name: projects/PROJECT_ID/locations/global/backendServices/BACKEND_SERVICE_NAME
  ...
  - backends
      name: BACKEND_1_NAME
      preference: PREFERRED
      ...
  - backends
      name: BACKEND_2_NAME
      preference: DEFAULT
      ...

Sostituisci quanto segue:

  • PROJECT_ID: l'ID progetto
  • BACKEND_SERVICE_NAME: il nome del servizio di backend
  • BACKEND_1_NAME: il nome del backend preferito
  • BACKEND_2_NAME: il nome del backend predefinito

Risoluzione dei problemi

I pattern di distribuzione del traffico possono cambiare quando colleghi un nuovo criterio di bilanciamento del carico del servizio a un servizio di backend.

Per eseguire il debug dei problemi di traffico, utilizza Cloud Monitoring per osservare il flusso del traffico tra il bilanciatore del carico e il backend. Inoltre, i log e le metriche di Cloud Load Balancing possono aiutarti a comprendere il comportamento del bilanciamento del carico.

Questa sezione riassume alcuni scenari comuni che potresti notare nella configurazione appena esposta.

Il traffico proveniente da una singola sorgente viene inviato a troppi backend distinti

Questo è il comportamento previsto dell'algoritmo SPRAY_TO_REGION. Tuttavia, potresti riscontrare problemi causati da una più ampia distribuzione del traffico. Ad esempio, le percentuali di successo della cache potrebbero diminuire perché i backend visualizzano il traffico da una selezione più ampia di client. In questo caso, valuta la possibilità di utilizzare altri algoritmi come WATERFALL_BY_REGION.

Il traffico non viene inviato ai backend con molti endpoint in stato non integro

Questo è il comportamento previsto quando autoCapacityDrain è abilitato. I backend con molti endpoint in stato non integro vengono svuotati e rimossi dal pool di bilanciamento del carico. Se non vuoi questo comportamento, puoi disattivare il download automatico della capacità. Tuttavia, questo significa che il traffico può essere inviato a backend con molti endpoint non integri e le richieste possono non riuscire.

Il traffico viene inviato a backend più lontani prima di quelli più vicini

Questo è il comportamento previsto se i tuoi backend preferiti sono lontani da quelli predefiniti. Se non vuoi che questo comportamento si verifichi, aggiorna di conseguenza le impostazioni delle preferenze per ogni backend.

Il traffico non viene inviato ad alcuni backend quando si utilizzano backend preferiti

Questo è il comportamento previsto quando i backend preferiti non hanno ancora raggiunto la capacità. I backend preferiti vengono assegnati per primi in base alla latenza di tempo di round trip per questi backend.

Se vuoi che il traffico venga inviato ad altri backend, puoi eseguire una delle seguenti operazioni:

  • Aggiorna le impostazioni delle preferenze per gli altri backend.
  • Configura un'impostazione di capacità target inferiore per i tuoi backend preferiti. La capacità target viene configurata utilizzando i campi max-rate o max-utilization a seconda della modalità di bilanciamento del servizio di backend.

Il traffico viene inviato a un backend remoto durante le modifiche di integrità temporanei

Questo è il comportamento previsto quando la soglia di failover è impostata su un valore alto. Se vuoi che il traffico continui verso i backend primari in caso di modifiche temporanee allo stato, imposta questo campo su un valore più basso.

Gli endpoint integri sono sovraccarichi quando altri endpoint non sono integri

Questo è il comportamento previsto quando la soglia di failover è impostata su un valore basso. Quando gli endpoint non sono integri, il traffico destinato a questi endpoint non integri viene invece distribuito tra gli endpoint rimanenti nello stesso backend. Se vuoi che il comportamento di failover venga attivato prima, imposta questo campo su un valore superiore.

Limitazioni

  • Ogni servizio di backend può essere associato a una sola risorsa del criterio di bilanciamento del carico del servizio.