Introduzione
High Availability Proxy (HAProxy), è una popolare soluzione open-source di proxying e bilanciatore di carico TCP/HTTP in grado di essere eseguita su Solaris, FreeBSD, e Linux. È comunemente utilizzato per migliorare l'affidabilità e le prestazioni di un ambiente server fornendo una distribuzione bilanciata del carico di lavoro su più server. Questo tipo di strumento è utilizzato in molti ambienti di alto profilo come Instagram, GitHub, Twitter e Imgur.
Questa guida ti introdurrà a HAProxy, ti farà familiarizzare con la terminologia del bilanciamento del carico e fornirà esempi di come potrebbe essere sfruttato per rafforzare sia le prestazioni che l'affidabilità degli ambienti server.
Termini essenziali di HAProxy
Prima di entrare nei dettagli del bilanciamento del carico e del proxying, ci sono alcuni termini e concetti importanti con cui familiarizzare. Inizieremo esaminando questi concetti nelle sezioni seguenti.
ACL (Access Control List)
Quando si parla di bilanciamento del carico, le ACL vengono utilizzate per verificare una particolare condizione ed eseguire un'azione in base al risultato. Ciò offre la capacità di inoltrare il traffico in modo ottimale in base a fattori quali le connessioni backend e il pattern matching, oltre a molti altri. Ecco un esempio di ACL in uso:
|
1 |
acl url_blog path_beg /blog |
In questo caso, l'ACL corrisponde se il percorso richiesto dall'utente inizia con /blog. Ad esempio, questa richiesta di corrispondenza punterebbe a http://yourdomain.com/blog/blog-entry-1. Il Manuale di configurazione di HAProxy contiene una guida dettagliata sull'uso delle ACL.
Il Backend
Le richieste inoltrate vengono ricevute da un insieme di server denominato backend. Le richieste sono definite nella sezione backend della configurazione di HAProxy. In termini estremamente semplici, un backend può essere definito dagli algoritmi di bilanciamento del carico da utilizzare e da un elenco di porte e server. Un backend può essere costituito da un singolo server o da più server. Man mano che vengono aggiunti altri server al backend, la capacità di carico potenziale aumenta, con l'elaborazione distribuita su più server. Se alcuni server di backend vanno offline, gli altri fungeranno da backup per gestire l'elaborazione delle richieste.
Diamo un’occhiata a un esempio di configurazione di due backend. In questo caso, si tratta di un blog-backend e di un web-backend. Ciascuno ha due server web, in ascolto sulla porta 80:
|
1 2 3 4 5 6 7 8 9 10 |
backend web-backend balance roundrobin server web1 web1.yourdomain.com:80 check server web2 web2.yourdomain.com:80 check backend blog-backend balance roundrobin node http server blog1 blog1.yourdomain.com:80 check server blog2 blog2.yourdomain.com:80 check |
La riga balance roundrobin ha lo scopo di specificare l'algoritmo di bilanciamento del carico. I dettagli possono essere trovati nella successiva sezione Algoritmi per il bilanciamento del carico, mentre mode http imposta l'uso del proxying di livello 7. Lo spiegheremo nella sezione Tipi di bilanciamento del carico. Inoltre, l'opzione check dopo la direttiva dei server indica che verranno attivati i controlli di integrità su quei particolari server di backend.
Il Frontend
La definizione di come le richieste vengono inoltrate al backend è denominata frontend. Le richieste sono definite nella sezione frontend della configurazione di HAProxy. Sono composte da ACL, una porta, un insieme di indirizzi IP e una regola che definisce quali backend utilizzare a seconda delle condizioni ACL soddisfatte, chiamata regola use_backend. Inoltre, esiste anche una regola default_backend per gestire qualsiasi altro caso. La sezione successiva spiegherà come configurare un frontend per vari tipi di traffico di rete.
Tipi di bilanciamento del carico
Stabilite le componenti di base utilizzate per il bilanciamento del carico, possiamo ora passare ai tipi fondamentali di bilanciamento del carico.
Nessun bilanciamento del carico
Nella sua forma più rudimentale, l'assenza di bilanciamento del carico può essere illustrata come segue:
In questo scenario, un utente si connette direttamente al server web, all'indirizzo yourdomain.com. Non è presente alcun bilanciamento del carico. Poiché esiste un solo server di database, se questo va offline, l'accesso alle informazioni in esso contenute viene completamente interrotto. Se molti utenti tentano di connettersi contemporaneamente a un singolo server web e questo non è in grado di gestire il carico esercitato, tutte le connessioni rallenteranno o non riusciranno a connettersi affatto.
Bilanciamento del carico (livello 4)
Uno dei modi più semplici e pragmatici per bilanciare il traffico di rete su più server consiste nell'utilizzare metodi di bilanciamento a livello di trasporto o livello 4. Questo tipo di bilanciamento del carico reindirizza qualsiasi utente che si connette in base all'intervallo IP in cui rientra il suo indirizzo IP e alla porta. In altre parole, se http://yourdomain.com/anything è la provenienza della richiesta, il backend definito per gestire queste richieste sarà quello che alla fine le gestirà. Inoltrerà tali richieste per yourdomain.com sulla porta 80.
La configurazione di base del bilanciamento del carico di livello 4 si presenta così:
Quando l'utente accede al bilanciatore di carico, le sue richieste vengono inoltrate al gruppo di server web-backend. Il server backend configurato risponderà direttamente alla richiesta dell'utente. Per evitare che l'utente riscontri dati incoerenti, tutti i server web-backend dovrebbero fornire contenuti identici. Come mostrato nel diagramma sopra, entrambi os server web si collegano in ultima analisi allo stesso server di database.
Bilanciamento del carico (Livello 7)
Esiste un altro metodo più complesso per bilanciare il traffico di rete. Si tratta dell'utilizzo del bilanciamento del carico di livello 7, o livello applicazione. Questo approccio consente di inoltrare le richieste degli utenti a diversi server backend a seconda del contenuto delle richieste stesse. Questo metodo permette al bilanciamento del carico di avvenire su più server di applicazioni web attraverso la stessa porta e lo stesso dominio. Per ulteriori dettagli su questo livello, dai un'occhiata alla sottosezione HTTP del nostro The Nitty Gritty of Networking: Learn about Terminology, Interfaces, and Protocols tutorial.
Il seguente diagramma illustra il bilanciamento del carico di livello 7:
In questo caso, un utente richiede yourdomain.com/blog e la sua richiesta viene inoltrata al backend del blog. Si tratta di un set di server backend specificamente allocato per l'esecuzione dell'applicazione blog. Nel frattempo, le altre richieste verranno inoltrate al web-backend. Tuttavia, entrambi i backend portano all'accesso allo stesso server di database.
Un esempio di una piccola parte di configurazione frontend per il bilanciamento del carico di livello 7 sarebbe simile ai seguenti comandi. Essi configurano il frontend http per gestire il traffico in entrata attraverso la porta 80:
|
1 2 3 4 5 6 7 8 |
frontend http bind *:80 node http acl url_blog path_beg /blog use_backend blog.backend if url_blog default_backend web.backend |
Se il percorso della richiesta dell'utente inizia con /blog, il acl url_blog path_beg /blog corrisponderà alla richiesta.
use_backend blog backend if url_blog funge da proxy per il traffico verso blog-backend utilizzando l'ACL.
defaut_backen web_backend indirizza tutti gli altri inoltri di traffico verso web-backend.
Algoritmi per il bilanciamento del carico
Quando si esegue il bilanciamento del carico, è l'algoritmo di bilanciamento del carico che definisce quale server backend verrà selezionato a tale scopo. Esistono diverse opzioni di algoritmo offerte da HAProxy. È inoltre possibile assegnare un parametro di peso ai server per manipolare la frequenza con cui un server viene selezionato rispetto agli altri. Ci sono semplicemente troppi algoritmi disponibili per descriverli tutti. Pertanto, questa guida si concentrerà solo su quelli più comuni. È possibile fare riferimento al HAProxy Documentation Converter per vedere l'elenco completo. Tra quelli più comunemente utilizzati figurano:
- roundrobin: l'algoritmo predefinito che seleziona i server a turno.
- leastconn: viene selezionato automaticamente il server con il minor numero di connessioni attive. Tuttavia, i server all'interno dello stesso backend dovrebbero essere ruotati in modalità round-robin.
- source: l'algoritmo sceglie il server in base all'indirizzo IP da cui proviene la richiesta dell'utente. È un metodo per garantire che l'utente si connetti sempre allo stesso server.
Sticky Sessions
Per alcune applicazioni, è un requisito che gli utenti che si connettono lo facciano collegandosi sempre allo stesso server. Attraverso le 'sticky sessions' e utilizzando il parametro appsession nel backend che lo richiede, è possibile ottenere tale persistenza.
Processing Health Checks
HAProxy ha bisogno di un metodo con cui determinare la capacità di un server backend di elaborare le richieste. Questo sostituisce la rimozione di un server dal backend se questo va offline. Viene eseguito un 'health check' predefinito che tenta di stabilire una connessione TCP. Lo fa mettendosi in ascolto sull'indirizzo IP e sulla porta configurati.
Se l'health check per il server non va a buon fine, il server non è in grado di elaborare le richieste inviate. A quel punto, il server viene disabilitato automaticamente nel backend e il traffico non viene più inoltrato ad esso finché non torna attivo e funzionante (integro). Tuttavia, in alcuni casi, determinare l'integrità del server tramite l'health check predefinito si rivela insufficiente.
Alternate Solutions
HAProxy potrebbe rivelarsi troppo sofisticato per le tue esigenze specifiche. In tal caso, esistono un paio di valide alternative che potrebbero rivelarsi più efficienti:
- Nginx: si tratta di un server web affidabile e veloce che può essere sfruttato per scopi di bilanciamento del carico e proxy. Di fatto, Nginx viene comunemente utilizzato in tandem con HAProxy, che ne sfrutta le capacità di compressione e caching.
- Linux Virtual Servers (LVS): si tratta di un semplice bilanciatore di carico di livello 4 incluso in molti sistemi Linux.
High Availability
Finora abbiamo parlato di bilanciamento del carico di livello 4 e livello 7. Entrambi utilizzano un bilanciatore di carico per determinare quale dei molti server backend avrà il compito di rispondere alla richiesta dell’utente. Ma è importante tenere a mente i limiti di un bilanciatore di carico. Vale a dire, che si tratta di un single point of failure. Ciò significa che se dovesse andare fuori servizio o essere sovraccaricato dalle richieste degli utenti, si verificherebbero rispettivamente tempi di inattività o latenza nell’elaborazione delle richieste. Tuttavia, una configurazione HA (high availability) presenta un’infrastruttura priva di un singolo punto di guasto. Ciò evita che si verifichino interruzioni del servizio dovute al guasto di un server, introducendo la ridondanza a ogni livello dell’architettura del sistema. Sebbene il bilanciatore di carico aiuti a facilitare la ridondanza del backend, anche i bilanciatori di carico stessi devono esercitare la ridondanza.
Il seguente diagramma mostra una forma base di una configurazione ad alta affidabilità:

Questa infrastruttura ha diversi bilanciatori di carico (uno attivo, i restanti passivi) collegati a un indirizzo IP statico. Questo indirizzo IP può essere rimappato su un server diverso se la situazione lo richiede. La richiesta dell’utente viaggia attraverso l’indirizzo IP esterno fino al bilanciatore di carico attualmente attivo. Se il bilanciatore di carico è offline in quel momento, il meccanismo di sicurezza (failsafe) ne rileverà lo stato, riassegnando l’indirizzo IP al server o ai server passivi.
Conclusion
La comprensione fondamentale del bilanciamento del carico e la conoscenza di alcuni dei modi in cui HAProxy può soddisfare le esigenze di bilanciamento del carico per il tuo sistema dovrebbero fornirti una solida base per iniziare a ottimizzare l'affidabilità e le prestazioni dei tuoi attuali ambienti server. Puoi anche consultare il nostro tutorial Nginx HTTP Proxying, Load Balancing, Buffering, and Caching: una panoramica per saperne di più sulle proprietà di bilanciamento del carico di Nginx.
Buon computing!



Commenti
Ancora nessun commento. Scrivi il primo.