Ottimizzazioni del bilanciamento del carico avanzate

In questa pagina viene descritto come utilizzare un criterio di bilanciamento del carico del servizio 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

Cloud Service Mesh supporta anche le ottimizzazioni del bilanciamento del carico avanzate. Per maggiori dettagli, consulta Panoramica del bilanciamento del carico avanzato nella documentazione di Cloud Service Mesh.

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 modalità di 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 svuotare rapidamente il traffico dai backend in stato non integro.
  • Imposta una soglia di failover per determinare quando un backend è considerato non integro. Ciò consente il failover del traffico verso un backend diverso per evitare backend in stato non integro.

Inoltre, puoi designare backend specifici come backend preferiti. Questi backend devono essere utilizzati fino alla capacità massima prima che le richieste vengano inviate 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 relative al routing e alla distribuzione del traffico.
In che modo Cloud Load Balancing prende le decisioni relative al routing e alla distribuzione del traffico.

Prima di iniziare

Prima di esaminare i contenuti di questa pagina, esamina attentamente il processo di distribuzione della richiesta descritto nella pagina di panoramica 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 trasferimento tra regioni se una regione di prima scelta è già completa.

Backend supportati

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

Backend Supportata?
Gruppi di istanze
  • Non gestito
  • Gestito a livello di zona
MIG a livello di area geografica
NEG a livello di zona (GCE_VM_IP_PORT endpoint)
NEG ibrido (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 del servizio. 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 di backend o endpoint 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 basse percentuali di richieste, ogni GFE di secondo livello potrebbe inviare richieste in modo esclusivo 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 nella misura in cui ogni GFE di secondo livello non ha preferenze per la selezione di istanze di backend o endpoint che si trovano in una zona il più vicino possibile al GFE di secondo livello. Con SPRAY_TO_REGION, ogni GFE di secondo livello invia richieste a tutte le istanze di backend o endpoint, in tutte le zone dell'area geografica, senza preferenza per un tempo di round trip più breve tra il GFE di secondo livello e le istanze o gli endpoint di backend.

Come nel caso di WATERFALL_BY_REGION, in forma aggregata, tutti i GFE di secondo livello della regione riempiono i backend in proporzione alle capacità target configurate (modificate dai rispettivi scaler della capacità).

Sebbene SPRAY_TO_REGION fornisca una distribuzione più uniforme tra i backend in tutte le zone di una regione, soprattutto con tariffe basse di richieste, questa distribuzione uniforme prevede le seguenti considerazioni:

  • Quando i backend smettono di funzionare (ma continuano a superare i controlli di integrità), vengono interessati più GFE di secondo livello, sebbene l'impatto individuale sia meno grave.
  • Poiché ogni 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 elaborate, ogni GFE di secondo livello potrebbe creare anche più connessioni TCP ai backend.

A cascata per zona

L'algoritmo WATERFALL_BY_ZONE modifica il comportamento singolo di ogni GFE di secondo livello nella misura in cui ogni GFE di secondo livello ha una preferenza molto forte per la selezione di istanze di backend o endpoint che si trovano nella zona più vicina possibile al GFE di secondo livello. Con WATERFALL_BY_ZONE, ogni secondo livello GFE invia solo richieste a istanze di backend o endpoint in altre zone della regione quando il GFE di secondo livello ha riempito (o proporzionalmente sovraccarico) istanze di backend o endpoint nella zona preferita.

Come nel caso di WATERFALL_BY_REGION, in forma aggregata, tutti i GFE di secondo livello della regione riempiono i backend in proporzione alle capacità target configurate (modificate dai rispettivi scaler della capacità).

L'algoritmo WATERFALL_BY_ZONE riduce al minimo la latenza in base alle seguenti considerazioni:

  • WATERFALL_BY_ZONE non minimizza intrinsecamente le connessioni tra zone. L'algoritmo è guidato solo dalla latenza.
  • WATERFALL_BY_ZONE non garantisce che ogni GFE di secondo livello riempi sempre la sua zona preferita prima di riempire le altre zone. Gli eventi di manutenzione possono causare temporaneamente l'invio di tutto il traffico da un GFE di secondo livello a istanze di backend o endpoint in un'altra zona.
  • WATERFALL_BY_ZONE può comportare una distribuzione meno uniforme delle richieste tra tutte le istanze di backend o gli endpoint all'interno della regione nel suo complesso. Ad esempio, le istanze di backend o gli endpoint nella zona più preferita del GFE di secondo livello possono essere riempiti alla capacità, mentre i backend in altre zone non possono essere riempiti 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 uniforme del traffico dal bilanciatore del carico No No
Distribuzione del traffico tra zone Sì. Il traffico viene distribuito in modo uniforme tra le zone di una regione, ottimizzando al contempo la latenza di rete. Il traffico potrebbe essere inviato attraverso le zone, se necessario. Sì. Il traffico arriva prima alla zona più vicina fino al raggiungimento della capacità massima. Quindi va alla zona più vicina successiva.
Sensibilità ai picchi di traffico in una zona locale Media: dipende dalla quantità di traffico già spostata per bilanciare le varie zone. Minore: i picchi a zona singola sono distribuiti in tutte le zone della regione. Maggiore; è probabile che i picchi a zona singola vengano gestiti interamente dalla stessa zona finché il bilanciatore del carico non è in grado di reagire.

Svuotamento automatico della capacità

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

Quando si abilita la funzionalità di svuotamento della capacità automatica, 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à. Questo rimuove il backend in stato non integro dal pool di bilanciamento del carico globale. Questa azione equivale a impostare backendService.capacityScaler su 0 per un backend quando vuoi evitare di instradare il traffico a quel backend.

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

Anche con 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. Se mantieni il 50% dei backend collegati, riduci il rischio di sovraccaricare i backend integri.

Un caso d'uso dello svuotamento automatico della capacità è utilizzarlo per ridurre al minimo il rischio di sovraccaricare i backend preferiti. Ad esempio, se un backend è contrassegnato come preferito, ma la maggior parte delle istanze o degli endpoint non è integro, lo svuotamento automatico della capacità rimuove il backend dal pool di bilanciamento del carico. Anziché sovraccaricare le istanze o gli endpoint in stato integro rimanenti nel backend preferito, lo svuotamento della capacità automatica trasferisce il traffico su altri backend.

Puoi abilitare lo svuotamento della capacità automatica 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 i backend che non utilizzano una modalità di bilanciamento. Ciò include 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 principali, sono considerati ottimali in termini di latenza e capacità.

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

Se le istanze o gli endpoint del backend principale non sono integri, il bilanciatore del carico non sposta immediatamente il traffico su altri backend. Il bilanciatore del carico trasferisce prima il traffico su altre istanze o endpoint in stato integro nello stesso backend per contribuire a stabilizzare il carico del traffico. Se in un backend principale sono troppi endpoint in stato non integro 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 traffico a un backend di failover. Il bilanciatore del carico tollera l'integrità del backend principale fino alla soglia di failover. In seguito, 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 è inferiore alla soglia di failover, il bilanciatore del carico tenta di inviare traffico a un backend di failover. Per impostazione predefinita, la soglia di failover è 70.

Se la soglia di failover è impostata troppo elevata, possono verificarsi fuoriuscite di traffico non necessarie a causa di cambiamenti di integrità temporanei. 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 in stato non integro.

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

Il traffico di failover può causare backend sovraccarichi. Anche se un backend non è integro, il bilanciatore del carico potrebbe comunque inviare traffico lì. Per escludere i backend non integri dal pool dei 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 trasferire il traffico ad altri backend. Tutto il traffico che supera la capacità configurata dei backend preferiti viene instradato ai backend non preferiti rimanenti. 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 più lontani dai client e generare una latenza media più elevata per le richieste dei client. Questo si verifica anche se ci sono altri backend più vicini che potrebbero aver gestito i client con una latenza inferiore.
  • 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 informazioni su 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. Creare una risorsa del criterio di bilanciamento del carico del servizio. Puoi farlo utilizzando un file YAML o direttamente tramite 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: il 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, importa il file 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, configura 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 caricamento 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: il 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 del criterio 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 stesso.

    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 da un servizio di backend, utilizza il seguente comando:

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

Imposta i backend preferiti

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

gcloud

Aggiungi un backend preferito

Per impostare un backend preferito, utilizza 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. 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 obbligatori, consulta 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: 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 esaminare il flusso del traffico tra il bilanciatore del carico e il backend. I log e le metriche di Cloud Load Balancing possono anche aiutarti a comprendere il comportamento di bilanciamento del carico.

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

Il traffico proveniente da un'unica sorgente viene inviato a troppi backend distinti

Questo è il comportamento previsto dell'algoritmo SPRAY_TO_REGION. Tuttavia, potrebbero verificarsi problemi causati da una più ampia distribuzione del traffico. Ad esempio, le percentuali di successo della cache potrebbero diminuire perché i backend rilevano 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 a 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 disabilitare il svuotamento automatico della capacità. Tuttavia, ciò significa che il traffico può essere inviato a backend con molti endpoint in stato non integro e le richieste potrebbero non riuscire.

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

Questo è il comportamento previsto se i tuoi backend preferiti sono più lontani rispetto a quelli predefiniti. Se non vuoi che si verifichi questo comportamento, aggiorna di conseguenza le impostazioni di preferenza per ogni backend.

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

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

Se vuoi che il traffico venga inviato ad altri backend, puoi procedere in uno dei seguenti modi:

  • Aggiorna le impostazioni delle preferenze per gli altri backend.
  • Configura un'impostazione di capacità target più bassa per i tuoi backend preferiti. La capacità di destinazione 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 cambiamenti di integrità temporanei

Questo è il comportamento previsto quando la soglia di failover è impostata su un valore elevato. Se vuoi che il traffico continui verso i backend primari in caso di cambiamenti di integrità temporanei, imposta questo campo su un valore inferiore.

Gli endpoint in stato integro sono sovraccaricati 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 viene distribuito tra gli endpoint rimanenti nello stesso backend. Se vuoi che il comportamento di failover venga attivato prima, imposta questo campo su un valore più elevato.

Limitazioni

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