Cos'è HAProxy?
HAProxy (High Availability Proxy) è un sistema di bilanciamento del carico open source in grado di bilanciare il carico di qualsiasi servizio TCP. HAProxy è una soluzione gratuita, molto veloce e affidabile che offre bilanciamento del carico, alta disponibilità e proxy per applicazioni basate su TCP e HTTP. È particolarmente adatto per siti Web ad alto traffico e alimenta molti di quelli più visitati al mondo.
Sin dalla sua esistenza, è diventato il sistema di bilanciamento del carico open source standard de facto. Sebbene non si pubblicizzi da solo, ma è ampiamente utilizzato. Di seguito è riportato un diagramma di base di come appare la configurazione:
Installazione di HAProxy
Sto usando Ubuntu 14.04 e lo installo da:
apt-get install haproxy
Puoi controllare la versione:
haproxy -v
Dobbiamo abilitare HAProxy per essere avviato dallo script init /etc/default/haproxy. Imposta l'opzione ABILITATA su 1 come:
ENABLED=1
Per verificare se questa modifica è stata eseguita correttamente, eseguire lo script init di HAProxy senza alcun parametro. Dovresti vedere quanto segue:
$ service haproxy <press_tab_key>
reload restart start status stop
HAProxy è ora installato. Creiamo ora una configurazione in cui abbiamo 2(due) istanze del server Web Apache e 1(una) istanza HAProxy. Di seguito sono riportate le informazioni sulla configurazione:
Utilizzeremo tre sistemi, generati virtualmente tramite VirtualBox:
Istanza 1 - Load Balancer
Nome host:haproxy
Sistema operativo:Ubuntu
IP privato:192.168.205.15
Istanza 2 - Server Web 1
Nome host:webser01
OS:Ubuntu con LAMP
IP privato:192.168.205.16
Istanza 2 - Web Server 2
Hostname:webserver02
OS:Ubuntu con LAMP
IP privato:192.168.205.17
Ecco il diagramma di come appare la configurazione:
Ora configuriamo HAProxy.
Configurazione di HAProxy
Eseguire il backup del file originale rinominandolo:
mv /etc/haproxy/haproxy.cfg{,.original}
Creeremo il nostro file haproxy.cfg. Usando il tuo editor di testo preferito crea il file /etc/haproxy/haproxy.cfg come:
global log /dev/log local0 log 127.0.0.1 local1 notice maxconn 4096 user haproxy group haproxy daemon defaults log global mode http option httplog option dontlognull retries 3 option redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000 listen webfarm 0.0.0.0:80 mode http stats enable stats uri /haproxy?stats balance roundrobin option httpclose option forwardfor server webserver01 192.168.205.16:80 check server webserver02 192.168.205.17:80 check
Spiegazione:
global log /dev/log local0 log 127.0.0.1 local1 notice maxconn 4096 user haproxy group haproxy daemon
La direttiva log menziona un server syslog a cui verranno inviati i messaggi di log.
La direttiva maxconn specifica il numero di connessioni simultanee sul front-end. Il valore predefinito è 2000 e deve essere ottimizzato in base alla configurazione del sistema.
Le direttive utente e gruppo modificano il processo HAProxy nell'utente/gruppo specificato. Questi non dovrebbero essere modificati.
defaults log global mode http option httplog option dontlognull retries 3 option redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000
La sezione precedente ha i valori predefiniti. L'opzione redispatch abilita la ridistribuzione della sessione in caso di errori di connessione. Pertanto, la stabilità della sessione viene ignorata se un'istanza del server Web si interrompe.
La direttiva sui tentativi imposta il numero di tentativi da eseguire su un'istanza del server Web dopo un errore di connessione.
I valori da modificare sono le varie direttive di timeout. L'opzione contimeout specifica il tempo massimo di attesa affinché un tentativo di connessione a un'istanza del server Web abbia esito positivo.
Clitimeout e srvtimeout si applicano quando si prevede che il client o il server riconosca o invii dati durante il processo TCP. HAProxy consiglia di impostare i timeout del client e del server sullo stesso valore.
listen webfarm 0.0.0.0:80 mode http stats enable stats uri /haproxy?stats balance roundrobin option httpclose option forwardfor server webserver01 192.168.205.16:80 check server webserver02 192.168.205.17:80 check
Il blocco sopra contiene la configurazione sia per il frontend che per il backend. Stiamo configurando HAProxy per l'ascolto sulla porta 80 per la webfarm, che è solo un nome per identificare un'applicazione.
Le direttive statistiche abilitano la pagina delle statistiche di connessione. Questa pagina può essere visualizzata con l'URL menzionato in stats uri, quindi in questo caso è http://192.168.205.15/haproxy?stats una demo di questa pagina può essere visualizzata qui.
La direttiva balance specifica il bilanciamento del carico algoritmo da utilizzare. Le opzioni dell'algoritmo disponibili sono:
- Round Robin (round robin),
- Round Robin statico (static-rr),
- Least Connections (leastconn),
- Fonte (fonte),
- URI (uri) e
- Parametro URL (url_param).
Le informazioni su ciascun algoritmo possono essere ottenute dalla documentazione ufficiale.
La direttiva server dichiara un server back-end, la sintassi è:
server <server_name> <server_address>[:port] [param*]
Il nome che menzioniamo qui apparirà nei registri e negli avvisi. Ci sono altri parametri supportati da questa direttiva e useremo il parametro check in questo articolo. L'opzione di controllo abilita i controlli di integrità sull'istanza del server Web, altrimenti l'istanza del server Web è ?sempre considerata disponibile.
Una volta terminata la configurazione, avviare il servizio HAProxy:
sudo service haproxy start
Test del bilanciamento del carico e del failover
Aggiungeremo il nome del server in entrambi i file index.html predefiniti che si trovano per impostazione predefinita in /var/www/index.html
Sull'istanza 2 - Web Server 1 (webserver01 con IP- 192.168.205.16), aggiungere la riga seguente come:
sudo sh -c "echo \<h1\>Hostname: webserver01 \(192.168.205.16\)\<\/h1\> >> /var/www/index.html"
Sull'istanza 3 - Web Server 2 (webserver02 con IP- 192.168.205.17), aggiungere la riga seguente come:
sudo sh -c "echo \<h1\>Hostname: webserver02 \(192.168.205.17\)\<\/h1\> >> /var/www/index.html"
Ora apri il browser web sul computer locale e sfoglia l'IP haproxy, ad esempio http://192.168.205.15
Ogni volta che aggiorni la scheda, vedrai che il carico viene distribuito a ciascun server web. Di seguito è riportato lo screenshot del mio browser:
Per la prima volta quando visito http://192.168.205.15 , ottengo:
E per la seconda volta, ovvero quando aggiorno la pagina, ottengo:
Puoi anche controllare le statistiche haproxy visitando http://192.168.205.15/haproxy?stats
C'è di più che puoi fare per questa configurazione. Alcune idee includono:
- porta offline uno o entrambi i server web per testare cosa succede quando accedi a HAProxy
- configura HAProxy per servire una pagina di manutenzione personalizzata
- configurare l'interfaccia web in modo da poter monitorare visivamente le statistiche HAProxy
- modifica lo scheduler in qualcosa di diverso dal round robin
- configurare priorità/pesi per server particolari
Questo è tutto!