Il bilanciamento di carico è una soluzione molto utilizzata per la distribuzione di applicazioni Web orizzontalmente su più host, fornendo agli utenti un singolo punto di accesso al servizio HAProxy è uno dei più popolari software di bilanciamento del carico open source, che offre anche funzionalità di alta affidabilità e reverse proxy.
HAProxy mira a ottimizzare l’utilizzo delle risorse, massimizzare il throughput, minimizzare i tempi di risposta ed evitare il sovraccarico di ogni singola risorsa. A differenza di altri software per il bilanciamento di carico, come ad esempio LVS, HAProxy lavora ad un layer del modello ISO/OSI più alto, rendendo di fatto possibile l’ispezione dei pacchetti in arrivo e il loro filtraggio. Questo può essere utile nel caso di bilanciamento di un sito internet, mentre lo è meno nel caso di altri servizi, come mail server o dns. Queste funzionalità aggiuntive però si traducono in una minore scalabilità rispetto a LVS e ad un utilizzo della CPU più alto.
Il modello di bilanciamento di HAProxy
HAProxy è particolarmente adatto per siti Web con traffico molto elevato ed è quindi spesso utilizzato per migliorare l’affidabilità e le prestazioni del servizio Web per le configurazioni multi-server. Nell’immagine sopra possiamo vedere un setup standard in alta affidabilità per i server web che erogano un sito internet.
In questa guida vedremo come installare correttamente e configurare HAProxy su Debian come bilanciatore di carico, che poi indirizza il traffico verso i frontend.
Come pre-requisito per i migliori risultati, è necessario disporre di almeno due server Web e un server per il bilanciamento del carico. I server Web devono eseguire almeno il servizio Web di base come Apache2 o Nginx per testare il bilanciamento del carico tra di loro. Non è lo scopo di questa guida illustrarvi come installare correttamente un Web Server.
Installazione di HAProxy
come prima cosa ci colleghiamo via SSH al nostro server bilanciatore e aggiorniamo la lista pacchetti:
apt-get update
Poi aggiorniamo il nostro server con gli ultimi pacchetti disponibili:
apt-get upgrade
infine installiamo HAProxy:
apt-get install haproxy
La configurazione di HAProxy per il bilanciamento del carico è un processo abbastanza semplice. Fondamentalmente, tutto quello che devi fare è dire a HAProxy su quale porta ascoltare e dove deve reindirizzare il traffico in arrivo.
Questo viene fatto creando un file di configurazione /etc/haproxy/haproxy.cfg. Puoi leggere le opzioni di configurazione nella pagina di documentazione HAProxy se desideri saperne di più.
Una configurazione standard può essere questa:
frontend http_front bind *:80 stats uri /haproxy?stats default_backend http_back backend http_back balance roundrobin server1 :80 check server2 :80 check
Con queste semplici regole, diciamo ad HAProxy che tutte le connessioni in arrivo sulla porta 80 devono essere reindirizzate a server1 e server2 utilizzando un algoritmo di round robin.
Diversi algoritmi di bilanciamento del carico
Gli algoritmi di bilanciamento sono utilizzati per decidere quale server sul back-end viene trasferito ogni connessione. Alcune delle opzioni utili includono quanto segue:
- Roundrobin: ogni server viene utilizzato in turni in base al loro peso. Questo è l’algoritmo più fluido ed equo quando il tempo di elaborazione dei server rimane equamente distribuito e consente di regolare al volo i pesi del server.
- Leastconn: viene scelto il server con il numero più basso di connessioni. Round robin viene eseguito tra server con lo stesso carico. L’utilizzo di questo algoritmo è consigliato con sessioni lunghe, come LDAP, SQL, TSE, ecc., Ma non è molto adatto per sessioni brevi come HTTP.
- First: il primo server con gli slot di connessione disponibili riceve la connessione. I server vengono scelti dall’identificatore numerico più basso al più alto. Quando il server raggiunge il valore maxconn, viene utilizzato il server successivo.
- Origin: l’indirizzo IP di origine viene sottoposto a hash e diviso per il peso totale dei server in esecuzione per indicare quale server riceverà la richiesta. In questo modo lo stesso indirizzo IP del client raggiungerà sempre lo stesso server mentre i server rimangono gli stessi.
Come personalizzare il bilanciamento con HAProxy
Come abbiamo detto, HAProxy ha la possibilità di ispezionare il pacchetto e apporvi dei filtri, o decidere, in base a regole precedentemente configurate, a chi inoltrare la richiesta in arrivo. Questo ci può essere molto utile nel caso le parti della nostra applicazione web siano divise su differenti macchine. Ad esempio, abbiamo una parte backend e una parte frontend in 2 macchine separate e non sincronizzate.
Apriamo il file di configurazione di HAProxy:
vim /etc/haproxy/haproxy.cfg
Configuriamo quindi HAProxy come segue:
frontend http_front bind *:80 stats uri /haproxy?stats acl url_admin path_beg /admin use_backend admin_back if url_admin default_backend http_back backend http_back balance roundrobin server :80 check server :80 check backend admin_back server :80 check
Il frontend dichiara una regola ACL denominata url_admin che si applica a tutte le connessioni con percorsi che iniziano con / admin. use_backend definisce che le connessioni che corrispondono alla condizione url_admin devono essere fornite dal back-end denominato admin_back, mentre tutte le altre richieste sono gestite dal back-end predefinito.
Sul lato backend, la configurazione imposta due gruppi di server, http_back come prima e il nuovo chiamato admin_back che i server specificamente collegano a example.com/admin.
Dopo aver fatto le modifiche richieste, riavviamo il servizio:
systemictl reload haproxy
Testare la configurazione
Grazie al parametro stats uri abbiamo detto ad HAProxy di servire le statistiche alla url
http://<IP pubblico bilanciatore>/haproxy?stats
Aprendo questo link di ritroveremo davanti una schermata così:
Le statistiche contengono delle informazioni utili per il debug e il controllo dei nostri servizi in alta affidabilità.
Avere la pagina delle statistiche semplicemente aperta nel frontend, tuttavia, potrebbe non essere una buona idea. Possiamo quindi impostarle su una porta dedicata – magari protetta dal firwall – e accessibile dopo un’autenticazione.
Per fare questo dobbiamo modificare il nostro file di configurazione come segue:
listen stats bind *:8181 stats enable stats uri / stats realm Haproxy\ Statistics stats auth username:password
ed eliminando la precedente istruzione sulle statistiche in porta 80.
Dopo aver riavviato, potete controllare che le statistiche siano servite in porta 8181 aprendo con il browser:
http: //<IP pubblico bilanciatore>:8181
Verifica che i tuoi server continuino a riportare tutto in verde quindi prova ad aprire la url di destinazione della tua webapp:
http: //<IP pubblico bilanciatore>/
Se i tuoi server di back-end hanno pagine di destinazione leggermente diverse, noterai che ogni volta che ricarichi la pagina ricevi la risposta da un altro host (questo per l’algoritmo roundrobin).
Puoi provare diversi algoritmi di bilanciamento nella sezione di configurazione o dare un’occhiata alla documentazione completa.
Conclusioni
Congratulazioni per aver configurato con successo HAProxy!
Con una configurazione di bilanciamento del carico di base, è possibile aumentare notevolmente le prestazioni e la disponibilità delle applicazioni Web. Questa guida è tuttavia solo un’introduzione al bilanciamento del carico con HAProxy, che è in grado di fare molto di più ed aiutarci nelle nostre configurazioni in alta affidabilità.
Si consiglia di sperimentare diverse configurazioni con l’aiuto dell’ampia documentazione disponibile per HAProxy e quindi iniziare a pianificare il bilanciamento del carico per l’ambiente di produzione.