Un’introduzione a HAProxy e concetti di bilanciamento del carico

Introduzione

HAProxy, che sta per High Availability Proxy, è un popolare software open source per il bilanciamento del carico TCP/HTTP e una soluzione di proxy che può essere eseguita su Linux, macOS e FreeBSD. Il suo uso più comune è migliorare le prestazioni e l’affidabilità di un ambiente server distribuendo il carico di lavoro su più server (ad esempio, web, applicazioni, database). È utilizzato in molti ambienti di alto profilo, tra cui: GitHub, Imgur, Instagram e Twitter.

In questa guida, otterrai una panoramica generale di cosa sia HAProxy, esaminerai la terminologia del bilanciamento del carico e gli esempi di come potrebbe essere utilizzato per migliorare le prestazioni e l’affidabilità del tuo ambiente server.

Terminologia di HAProxy

Ci sono molti termini e concetti importanti quando si discute di bilanciamento del carico e di proxy. Esaminerai i termini comunemente utilizzati nelle seguenti sottosezioni.

Prima di passare ai tipi di bilanciamento del carico di base, dovresti iniziare con una revisione delle ACL, dei backend e dei frontend.

Elenco di controllo degli accessi (ACL)

In relazione al bilanciamento del carico, le ACL vengono utilizzate per testare una determinata condizione e eseguire un’azione (ad esempio, selezionare un server o bloccare una richiesta) in base al risultato del test. L’uso delle ACL consente un inoltro flessibile del traffico di rete basato su una varietà di fattori come il matching di pattern e il numero di connessioni a un backend, ad esempio.

Esempio di una ACL:

acl url_blog path_beg /blog

Questa ACL viene abbinata se il percorso della richiesta di un utente inizia con /blog. Questo abbinerebbe una richiesta come http://tuodominio.com/blog/blog-entry-1, ad esempio.

Per una guida dettagliata sull’uso delle ACL, consulta il Manuale di Configurazione di HAProxy.

Backend

A backend is a set of servers that receives forwarded requests. Backends are defined in the backend section of the HAProxy configuration. In its most basic form, a backend can be defined by:

  • quale algoritmo di bilanciamento del carico utilizzare
  • a list of servers and ports

A backend can contain one or many servers in it. Generally speaking, adding more servers to your backend will increase your potential load capacity by spreading the load over multiple servers. Increased reliability is also achieved through this manner, in case some of your backend servers become unavailable.

Ecco un esempio di configurazione a due backend, web-backend e blog-backend con due server web ciascuno, in ascolto sulla porta 80:

backend web-backend
   balance roundrobin
   server web1 web1.yourdomain.com:80 check
   server web2 web2.yourdomain.com:80 check
   
backend blog-backend
   balance roundrobin
   mode http
   server blog1 blog1.yourdomain.com:80 check
   server blog1 blog1.yourdomain.com:80 check

La linea balance roundrobin specifica l’algoritmo di bilanciamento del carico, che viene dettagliato nella sezione Algoritmi di Bilanciamento del Carico.

Il codice mode http specifica che verrà utilizzato il bilanciamento del carico al livello 7, che è spiegato nella sezione Tipi di Bilanciamento del Carico.

L’opzione check alla fine delle direttive server specifica che devono essere eseguiti controlli di salute su quei server di back-end.

Frontend

A frontend defines how requests should be forwarded to backends. Frontends are defined in the frontend section of the HAProxy configuration. Their definitions are composed of the following components:

  • a set of IP addresses and a port (e.g. 10.1.1.7:80, *:443, etc.)
  • ACL
  • Regole use_backend, che definiscono quali back-end utilizzare a seconda delle condizioni ACL corrispondenti e/o una regola default_backend che gestisce tutti gli altri casi.

A frontend can be configured to various types of network traffic, as explained in the next section.

Tipi di Bilanciamento del Carico

Ora che hai compreso i componenti di base utilizzati nel bilanciamento del carico, puoi passare ai tipi di bilanciamento del carico di base.

Nessun Bilanciamento del Carico

A simple web application environment with no load balancing might look like the following:

No Load Balancing

In questo esempio, l’utente si connette direttamente al tuo server web, su yourdomain.com e non c’è bilanciamento del carico. Se il tuo singolo server web va giù, l’utente non potrà più accedere al tuo server web. Inoltre, se molti utenti stanno cercando di accedere al tuo server contemporaneamente e non è in grado di gestire il carico, potrebbero avere un’esperienza lenta o potrebbero non riuscire a connettersi affatto.

Bilanciamento del carico di livello 4

Il modo più semplice per bilanciare il traffico di rete su più server è utilizzare il bilanciamento del carico di livello 4 (livello di trasporto). Bilanciare il carico in questo modo inoltrerà il traffico degli utenti in base all’intervallo di indirizzi IP e alla porta (cioè se arriva una richiesta per http://yourdomain.com/anything, il traffico sarà inoltrato al backend che gestisce tutte le richieste per yourdomain.com sulla porta 80). Per ulteriori dettagli sul livello 4, controlla la sottosezione TCP della nostra Introduzione alle Reti.

Ecco un diagramma di un semplice esempio di bilanciamento del carico di livello 4:

Layer 4 Load Balancing

L’utente accede al bilanciatore di carico, che inoltra la richiesta dell’utente al gruppo di server backend web-backend. Qualsiasi server backend venga selezionato risponderà direttamente alla richiesta dell’utente. In generale, tutti i server nel web-backend dovrebbero servire contenuti identici, altrimenti l’utente potrebbe ricevere contenuti incoerenti. Nota che entrambi i server web si connettono allo stesso server di database.

Bilanciamento del carico al livello 7

Un altro modo, più complesso, di bilanciare il traffico di rete è utilizzare il bilanciamento del carico al livello 7 (livello dell’applicazione). Utilizzando il livello 7, il bilanciatore di carico può inoltrare le richieste a diversi server backend in base al contenuto della richiesta dell’utente. Questa modalità di bilanciamento del carico consente di eseguire più server di applicazioni web sotto lo stesso dominio e porta. Per ulteriori dettagli sul livello 7, consulta la sottosezione HTTP della nostra Introduzione alle reti.

Ecco un diagramma di un esempio semplice di bilanciamento del carico al livello 7:

Layer 7 Load Balancing

In questo esempio, se un utente richiede tuodominio.com/blog, viene inoltrato al backend blog, che è un insieme di server che eseguono un’applicazione di blog. Altre richieste vengono inoltrate a web-backend, che potrebbe eseguire un’altra applicazione. Entrambi i backends utilizzano lo stesso server di database, in questo esempio.

A snippet of the example frontend configuration would look like this:

frontend http
  bind *:80
  mode http

  acl url_blog path_beg /blog
  use_backend blog-backend if url_blog
 
  default_backend web-backend

Questo configura un frontend chiamato http, che gestisce tutto il traffico in ingresso sulla porta 80.

acl url_blog path_beg /blog corrisponde a una richiesta se il percorso della richiesta dell’utente inizia con /blog.

use_backend blog-backend se url_blog utilizza l’ACL per instradare il traffico verso blog-backend.

default_backend web-backend specifica che tutto il resto del traffico verrà inoltrato a web-backend.

Algoritmi di Bilanciamento del Carico

L’algoritmo di bilanciamento del carico utilizzato determina quale server, in un backend, verrà selezionato durante il bilanciamento del carico. HAProxy offre diverse opzioni per gli algoritmi. Oltre all’algoritmo di bilanciamento del carico, ai server può essere assegnato un parametro peso per manipolare con quale frequenza il server viene selezionato rispetto agli altri server.

A few of the commonly used algorithms are as follows:

roundrobin

Round Robin seleziona i server a turno. Questo è l’algoritmo predefinito.

leastconn

Seleziona il server con il minor numero di connessioni. Questo è consigliato per sessioni più lunghe. Anche i server nello stesso backend vengono ruotati in modo round-robin.

origine

Questo seleziona quale server utilizzare in base a un hash dell’indirizzo IP di origine da cui gli utenti effettuano le richieste. Questo metodo garantisce che gli stessi utenti si connettano agli stessi server.

Sessioni Stick

Alcune applicazioni richiedono che un utente continui a connettersi allo stesso server backend. Questo può essere ottenuto attraverso le sessioni stick, utilizzando il parametro appsession nel backend che ne richiede l’utilizzo.

Controllo dello stato di salute

HAProxy utilizza controlli dello stato di salute per determinare se un server backend è disponibile per elaborare le richieste. Ciò evita di dover rimuovere manualmente un server dal backend se diventa non disponibile. Il controllo dello stato di salute predefinito consiste nel tentare di stabilire una connessione TCP al server.

Se un server non supera un controllo di integrità e quindi non è in grado di gestire le richieste, viene automaticamente disabilitato nel backend e il traffico non sarà inoltrato ad esso fino a quando non diventa nuovamente sano. Se tutti i server in un backend falliscono, il servizio diventerà non disponibile fino a quando almeno uno di quei server di backend diventa nuovamente sano.

Per certi tipi di backends, come i server di database, il controllo di integrità predefinito non serve necessariamente a determinare se un server è ancora sano.

Il server web Nginx può anche essere utilizzato come server proxy autonomo o bilanciatore di carico ed è spesso utilizzato in combinazione con HAProxy per le sue capacità di caching e compressione.

Alta disponibilità

I setup di bilanciamento del carico di livello 4 e 7 descritti in questo tutorial utilizzano entrambi un bilanciatore di carico per indirizzare il traffico verso uno dei molti server di backend. Tuttavia, il bilanciatore di carico è un punto singolo di guasto in questi setup; se va giù o viene sopraffatto dalle richieste, può causare un’alta latenza o tempi di inattività per il servizio.

A high availability (HA) setup is broadly defined as infrastructure without a single point of failure. It prevents a single server failure from being a downtime event by adding redundancy to every layer of your architecture. A load balancer facilitates redundancy for the backend layer (web/app servers), but for a true high availability setup, you need to have redundant load balancers as well.

Ecco un diagramma di un setup ad alta disponibilità:

In questo esempio, hai più bilanciatori di carico (uno attivo e uno o più passivi) dietro un indirizzo IP statico che può essere riassegnato da un server all’altro. Quando un utente accede al tuo sito web, la richiesta passa per l’indirizzo IP esterno fino al bilanciatore di carico attivo. Se tale bilanciatore di carico fallisce, il meccanismo di failover lo rileverà e riassegnerà automaticamente l’indirizzo IP a uno dei server passivi. Esistono diverse modalità per implementare una configurazione HA attiva/passiva. Per saperne di più, leggi Come Utilizzare Gli IP Riservati.

Conclusione

Ora che hai compreso il bilanciamento del carico e sai come utilizzare HAProxy, hai una base solida per iniziare a migliorare le prestazioni e l’affidabilità del tuo ambiente server.

Se sei interessato a memorizzare l’output di HAProxy per la visualizzazione successiva, dai un’occhiata a Come Configurare Il Logging di HAProxy con Rsyslog su CentOS 8 [Avvio Rapido]

Se stai cercando di risolvere un problema, dai un’occhiata agli Errori comuni di HAProxy. Se è necessario un ulteriore troubleshooting, dai un’occhiata a Come risolvere i comuni errori di HAProxy.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-haproxy-and-load-balancing-concepts