Il bilanciamento del carico tra più applicazioni, backend e server fa parte del processo di ottimizzazione delle risorse, miglioramento delle prestazioni e tolleranza agli errori del servizio.
Nginx come bilanciatore di carico
Questo server web è considerato una delle soluzioni più popolari e produttive perché ha la più ampia funzionalità e flessibilità durante la configurazione. Quindi Nginx viene spesso utilizzato per il bilanciamento del carico.
Esistono diversi approcci e implementazioni, ma prima verifica la disponibilità del modulo ngx_http_upstream_module:
# nginx -v
Se manca, dovrai ricostruire Nginx aggiungendo questo modulo. Successivamente, puoi iniziare a configurare il server web. Per abilitare il bilanciamento, aggiungi la direttiva upstream (sezione http) al file di configurazione di Nginx:
upstream backend { server backend1.somesite.com; server backend2.somesite.com; server backend3.somesite.com; }
Ora devi specificare il reindirizzamento del gruppo necessario:
server { location / { proxy_pass http://backend; } }
Inoltre, Nginx supporta parametri aggiuntivi e metodi di bilanciamento del carico.
Scelta di un metodo di bilanciamento
Nginx offre diversi metodi di bilanciamento del carico.
Giro all'italiana
Per impostazione predefinita, il server web distribuisce le richieste in modo uniforme tra i backend (ma tenendo conto dei pesi). Questo è un metodo standard in Nginx, quindi non esiste una direttiva di inclusione.
meno_conn
Le richieste vengono prima inviate al backend con il minor numero di connessioni attive (ma tenendo conto dei pesi):
upstream backend { least_conn; server backend1.somesite.com; server backend2.somesite.com; }
Hash e hash IP
Usando questo metodo, puoi creare una sorta di connessione persistente tra client e back-end. Per ogni richiesta, Nginx calcola un hash composto da testo, variabili del server Web o una loro combinazione, quindi lo mappa ai backend:
upstream backend { hash $scheme$request_uri; server backend1.somesite.com; server backend2.somesite.com; server backend3.somesite.com; }
L'hash IP funziona solo con HTTP, questa è un'opzione predefinita in cui l'hash viene calcolato dall'indirizzo IP del client:
upstream backend { ip_hash; server backend1.somesite.com; server backend2.somesite.com; server backend3.somesite.com; }
Peso backend
Se alcuni backend nello stack sono più potenti di altri, i pesi tornano utili:
upstream backend { server backend1.somesite.com weight=10; server backend2.somesite.com weight=5; server backend3.somesite.com; server 192.0.0.1 backup; }
In questo esempio, su 16 richieste, il primo backend elaborerà 10, il secondo 5 e il terzo 1. In questo caso, il server di backup riceverà le richieste solo se i tre backend principali non sono disponibili.
Monitoraggio
Se Nginx ritiene che il server di backend non sia disponibile, interrompe temporaneamente l'invio di richieste. Due direttive sono responsabili di questo:
- max_fails — imposta il numero di tentativi di connessione falliti, dopodiché il backend è considerato non disponibile per un certo tempo;
- timeout_errore — tempo durante il quale il server è considerato non disponibile.
I parametri si presentano così:
upstream backend { server backend1.somesite.com; server backend2.somesite.com max_fails=3 fail_timeout=30s; server backend3.somesite.com max_fails=2; }
Conclusione
La scelta del metodo di bilanciamento appropriato consentirà di distribuire il carico in modo più uniforme. Non dimenticare i pesi del back-end, il monitoraggio e la tolleranza agli errori del server.