Bilanciamento del carico
- 15 minuti
La necessità di bilanciare il carico di elaborazione deriva da due requisiti di base: In primo luogo, la disponibilità elevata può essere migliorata dalla replica. In secondo luogo, le prestazioni possono essere migliorate tramite l'elaborazione parallela. La disponibilità elevata è la proprietà di un servizio disponibile per quasi il 100% del tempo in cui un client tenta di accedervi. La qualità del servizio (QoS) per un particolare servizio presuppone in genere diverse considerazioni, ad esempio i requisiti di velocità effettiva e latenza.
Che cos'è il bilanciamento del carico?
La forma più nota di bilanciamento del carico è il "DNS round robin", usato da molti servizi Web di grandi dimensioni per bilanciare il carico delle richieste tra più server. Nello specifico, più server Web front-end, ognuno con un indirizzo IP univoco, condividono un nome DNS. Per bilanciare il numero di richieste su ognuno di questi server Web, le grandi aziende come Google gestiscono e curano un pool di indirizzi IP associati a una singola voce DNS. Quando un client effettua una richiesta, ad esempio al dominio www.google.com, il DNS di Google seleziona uno degli indirizzi disponibili dal pool e lo invia al client. La strategia più facile per inviare indirizzi IP consiste nell'usare una coda round robin semplice in cui, dopo ogni risposta DNS, l'elenco di indirizzi viene permutato.
Prima dell'avvento del cloud, il bilanciamento del carico DNS era un modo semplice per affrontare il problema di latenza delle connessioni a lunga distanza. Il dispatcher nel server DNS era programmato per rispondere con l'indirizzo IP del server geograficamente più vicino al client. Gli schemi più semplici per questa operazione tentavano di rispondere con l'indirizzo IP del pool numericamente più vicino all'indirizzo IP del client. Ovviamente questo metodo non era affidabile, perché gli indirizzi IP non vengono distribuiti in una gerarchia globale. Le tecniche attuali sono più sofisticate e si basano su un mapping software tra indirizzi IP e posizioni basato su mappe fisiche di provider di servizi Internet (ISP). Poiché questo mapping viene implementato come una costosa ricerca software, questo metodo produce risultati migliori, ma con un notevole impegno delle risorse di calcolo. Tuttavia, il costo di una ricerca lenta viene ammortizzato poiché la ricerca del DNS viene eseguita solo quando il client effettua la prima connessione a un server. Tutte le comunicazioni successive avvengono direttamente tra il client e il server a cui appartiene l'indirizzo IP inviato. Nella figura seguente è illustrato un esempio di schema di bilanciamento del carico DNS.
Figura 4: Bilanciamento del carico in un ambiente di hosting cloud
Lo svantaggio di questo metodo è che, in caso di errore del server, il passaggio a un indirizzo IP diverso dipende dalla configurazione della durata (TTL) della cache DNS. È risaputo che le voci DNS sono di lunga durata e che la propagazione degli aggiornamenti su Internet richiede più di una settimana. È pertanto difficile "nascondere" rapidamente al client un errore del server. La situazione può essere migliorata riducendo la validità (TTL) di un indirizzo IP nella cache, ma a discapito delle prestazioni e con un aumento del numero di ricerche.
Spesso, con il termine "bilanciamento del carico moderno" ci si riferisce all'uso di un'istanza dedicata (o di una coppia di istanze) che indirizza il traffico in ingresso ai server back-end. Per ogni richiesta in ingresso su una porta specificata, il servizio di bilanciamento del carico reindirizza il traffico a uno dei server back-end in base a una strategia di distribuzione. Così facendo, il servizio di bilanciamento del carico conserva i metadati della richiesta, incluse informazioni quali le intestazioni del protocollo applicativo, ad esempio le intestazioni HTTP. In questa situazione il problema delle informazioni non aggiornate non sussiste, perché ogni richiesta passa attraverso il servizio di bilanciamento del carico.
Anche se tutti i tipi di servizi di bilanciamento del carico di rete inoltrano semplicemente le informazioni dell'utente ai server back-end insieme a qualunque contesto, quando si tratta di restituire la risposta al client, possono impiegare una delle due strategie di base:1
- Intermediazione (proxy): in questo approccio, il servizio di bilanciamento del carico riceve la risposta dal back-end e la inoltra al client. Il servizio di bilanciamento del carico si comporta come un proxy Web standard ed è coinvolto in entrambe le fasi di una transazione di rete, ovvero l'inoltro della richiesta al client e la restituzione della risposta.
- Handoff TCP: in questo approccio, la connessione TCP con il client viene passata al server back-end, che quindi invia la risposta direttamente al client, senza passare attraverso il servizio di bilanciamento del carico.
Figura 5: Meccanismo di handoff TCP dal dispatcher al server back-end
Impatto sulla disponibilità e sulle prestazioni
Il bilanciamento del carico è una strategia importante per mascherare gli errori in un sistema. Se il client è esposto a un unico endpoint che bilancia il carico tra più risorse, gli errori nelle singole risorse possono essere mascherati dal client semplicemente servendo la richiesta con un'altra risorsa. È tuttavia importante notare che in questo caso il servizio di bilanciamento del carico è un singolo punto di errore per il servizio. Se per qualsiasi motivo si verifica un errore, anche se tutti i server back-end continuano a funzionare, non potrà essere gestita alcuna richiesta client. Di conseguenza, per ottenere la disponibilità elevata, i servizi di bilanciamento del carico vengono spesso implementati in coppia.
Il bilanciamento del carico consente a un servizio di distribuire i carichi di lavoro tra più risorse di calcolo nel cloud. L'uso di un'unica istanza di calcolo nel cloud comporta diverse limitazioni. In precedenza si è discusso della limitazione fisica delle prestazioni, laddove sono necessarie maggiori risorse per affrontare l'aumento dei carichi di lavoro. Usando il bilanciamento del carico, i volumi più grandi di carichi di lavoro vengono distribuiti tra più risorse. Ognuna di esse potrà così soddisfare le richieste di sua pertinenza in modo indipendente e in parallelo, migliorando la velocità effettiva dell'applicazione. Ciò migliora anche i tempi di servizio medi perché sono presenti più server per gestire il carico di lavoro.
I servizi di controllo e monitoraggio sono fondamentali per consentire il successo delle strategie di bilanciamento del carico. Un servizio di bilanciamento del carico deve assicurare che ogni richiesta venga soddisfatta garantendo la disponibilità di ogni nodo delle risorse. In caso contrario, il traffico non viene indirizzato a quel nodo specifico. Il monitoraggio Ping Echo è una delle tattiche più diffuse per verificare l'integrità di un nodo di risorse specifico. Oltre all'integrità di un nodo, alcune strategie di bilanciamento del carico richiedono informazioni aggiuntive quali la velocità effettiva, la latenza e l'utilizzo della CPU allo scopo di valutare la risorsa più appropriata per indirizzare il traffico.
I servizi di bilanciamento del carico devono spesso garantire una disponibilità elevata. Il modo più semplice per farlo è creare più istanze di bilanciamento del carico (ciascuna con un indirizzo IP univoco) e collegare ciascuna a un solo indirizzo DNS. Ogni volta che, per qualsiasi motivo, un'istanza di bilanciamento del carico riscontra un errore, viene sostituita con un'altra e tutto il traffico viene passato all'istanza di failover, con un impatto minimo sulle prestazioni. Simultaneamente, è possibile configurare una nuova istanza del servizio di bilanciamento del carico per sostituire quella in errore e i record DNS devono essere aggiornati immediatamente.
Strategie per il bilanciamento del carico
Nel cloud vengono adottate diverse strategie di bilanciamento del carico.
Equa distribuzione
Questo è un approccio statico al bilanciamento del carico in cui viene usato un algoritmo round robin semplice per dividere il traffico tra tutti i nodi in modo uniforme. Non viene preso in considerazione l'utilizzo di un singolo nodo di risorse nel sistema o il tempo di esecuzione delle richieste. Questo approccio tenta di mantenere impegnato ogni nodo del sistema ed è uno dei più semplici da implementare. Un importante svantaggio consiste nel fatto che le richieste client pesanti possono aggregarsi e raggiungere gli stessi data center, causando il sovraccarico di alcuni nodi e lasciandone altri sottoutilizzati. Questo richiede tuttavia un modello di carico molto specifico e ha una bassa probabilità di verificarsi in pratica su un numero elevato di client e server con una distribuzione e una capacità di connessione piuttosto uniformi. Questo approccio rende comunque difficile l'implementazione nel data center di strategie di memorizzazione nella cache che tengano conto di considerazioni come la località spaziale (in cui si precaricano e memorizzano i dati in prossimità dei dati recuperati), dal momento che la richiesta successiva eseguita dallo stesso client potrebbe essere inoltrata a un server diverso.
AWS usa questo approccio nell'offerta ELB (Elastic Load Balancer). AWS ELB effettua il provisioning di servizi di bilanciamento del carico che bilanciano il traffico tra le istanze di EC2 collegate. I servizi di bilanciamento del carico sono essenzialmente istanze di EC2 con uno specifico servizio per l'instradamento del traffico. Quando il numero di istanze delle risorse dietro il servizio di bilanciamento del carico viene aumentato, gli indirizzi IP delle nuove risorse vengono aggiornati nel record DNS del servizio di bilanciamento del carico. Il completamento di questo processo richiede diversi minuti, perché comporta un tempo di monitoraggio e un tempo di provisioning. Questo periodo, ovvero il tempo di attesa che deve trascorrere prima che il servizio di bilanciamento del carico possa gestire il carico superiore, è detto "riscaldamento" del servizio di bilanciamento del carico.
I servizi di bilanciamento del carico ELB di AWS monitorano anche ogni risorsa collegata per la distribuzione del carico di lavoro per mantenere un controllo di integrità. Viene usato un meccanismo Ping Echo per verificare che tutte le risorse siano integre. Gli utenti di ELB possono configurare i parametri del controllo integrità specificando i ritardi e il numero di tentativi.
Distribuzione basata su hash
Questo approccio tenta di assicurare che, in qualsiasi momento, le richieste effettuate da un client tramite la stessa connessione vengano sempre inoltrate allo stesso server. Inoltre, per bilanciare il traffico delle richieste, la distribuzione viene eseguita in ordine casuale. Questo approccio presenta diversi vantaggi rispetto a quello basato su un algoritmo round robin, in quanto è utile per le applicazioni in grado di riconoscere la sessione, in cui le strategie di memorizzazione nella cache e persistenza dello stato possono essere molto più semplici. È anche meno vulnerabile ai modelli di traffico che comportano l'intasamento in un singolo server poiché la distribuzione è casuale, ma il rischio sussiste. Tuttavia, per ogni richiesta devono essere valutati i metadati della connessione per l'instradamento a un server pertinente e questo ha l'effetto di introdurre una piccola quantità di latenza per ogni richiesta.
Azure Load Balancer usa un meccanismo di distribuzione basato su hash per distribuire il carico. Questo meccanismo crea per ogni richiesta un hash basato su IP di origine, porta di origine, IP di destinazione, porta di destinazione e tipo di protocollo al fine di garantire che ogni pacchetto della stessa sessione raggiunga sempre lo stesso server. La funzione hash viene scelta in modo che la distribuzione delle connessioni ai server sia piuttosto casuale.
Azure offre controlli di integrità tramite tre tipi di probe: Probe dell'agente guest (in macchine virtuali PaaS), probe HTTP personalizzati e probe TCP personalizzati. Tutti e tre forniscono un controllo di integrità per i nodi di risorse tramite un meccanismo Ping Echo.
Altre strategie comuni
Sono disponibili altre strategie che consentono di bilanciare il carico tra più risorse. Ognuno di esse prevede l'uso di metriche diverse per misurare il nodo di risorse più appropriato per una determinata richiesta:
- Strategie basate sul tempo di esecuzione delle richieste: queste strategie adottano un algoritmo di pianificazione prioritario, in base al quale vengono usati i tempi di esecuzione delle richieste per valutare l'ordine più appropriato di distribuzione del carico. La sfida principale che pone l'uso di questo approccio consiste nel prevedere accuratamente il tempo di esecuzione di una determinata richiesta.
- Strategie basate sull'utilizzo delle risorse: queste strategie si basano sull'utilizzo della CPU in ogni nodo di risorse per bilanciare l'utilizzo tra i nodi. I servizi di bilanciamento del carico gestiscono un elenco ordinato di risorse in base al relativo utilizzo e quindi indirizzano le richieste al nodo con il carico minore.
Altri vantaggi
Un servizio di bilanciamento del carico centralizzato si presta a diverse strategie che possono migliorare le prestazioni del servizio. È tuttavia importante notare che queste strategie funzionano solo se il servizio di bilanciamento del carico non è sottoposto a un carico insormontabile, altrimenti è lo stesso servizio a diventare il collo di bottiglia. Di seguito sono elencate alcune di queste strategie:
- Offload SSL: le transazioni di rete tramite SSL comportano un costo aggiuntivo poiché richiedono risorse di calcolo per la crittografia e l'autenticazione. Invece di gestire tutte le richieste tramite SSL (Secure Sockets Layer), la connessione client al servizio di bilanciamento del carico può essere effettuata tramite SSL, mentre le richieste di reindirizzamento a ogni singolo server possono essere effettuate tramite HTTP. Questa strategia riduce considerevolmente il carico sui server. Inoltre, la sicurezza viene mantenuta purché le richieste di reindirizzamento non vengano eseguite su una rete aperta.
- Buffering TCP: questa è una strategia per l'offload dei client con connessioni lente al servizio di bilanciamento del carico per alleggerire i server che gestiscono le risposte a tali client.
- Memorizzazione nella cache: in alcuni scenari il servizio di bilanciamento del carico può gestire una cache per le richieste più comuni (o per le richieste che possono essere gestite senza passare dai server, come il contenuto statico) in modo da ridurre il carico sui server.
- Traffic shaping: per alcune applicazioni, è possibile usare un servizio di bilanciamento del carico per ritardare o riassegnare la priorità al flusso di pacchetti in modo che sia possibile modellare il traffico in base alla configurazione dei server. L'operazione influisce sulla qualità del servizio (QoS) per alcune richieste, ma assicura la capacità di gestire il carico in ingresso.
Riferimenti
- Aron Mohit, Darren Sanders, Peter Druschel e Willy Zwaenepoel (2000). Distribuzione di richieste con supporto di contenuto scalabile nei server di rete basati su cluster Documentazione della conferenza tecnica USENIX annuale 2000
Verificare le conoscenze
Commenti e suggerimenti
Questa pagina è stata utile?
No
Serve aiuto con questo argomento?
Provare a usare Ask Learn per chiarire o guidare l'utente in questo argomento?