Introductie
HAProxy, wat staat voor High Availability Proxy, is een populaire open source software TCP/HTTP Load Balancer en proxy-oplossing die kan worden uitgevoerd op Linux, macOS en FreeBSD. Het meest voorkomende gebruik ervan is het verbeteren van de prestaties en betrouwbaarheid van een serveromgeving door de werklast over meerdere servers te verdelen (bijv. web, applicatie, database). Het wordt gebruikt in veel prominente omgevingen, waaronder: GitHub, Imgur, Instagram en Twitter.
In deze gids krijgt u een algemeen overzicht van wat HAProxy is, een herziening van load-balancingterminologie, en voorbeelden van hoe het gebruikt zou kunnen worden om de prestaties en betrouwbaarheid van uw eigen serveromgeving te verbeteren.
HAProxy-terminologie
Er zijn veel termen en concepten die belangrijk zijn bij het bespreken van load balancing en proxying. U gaat over veelgebruikte termen in de volgende subsecties.
Voordat u ingaat op de basissoorten load balancing, moet u beginnen met een herziening van ACL’s, back-ends en front-ends.
Toegangsbeheerlijst (ACL)
Met betrekking tot load balancing worden ACL’s gebruikt om een bepaalde voorwaarde te testen en een actie uit te voeren (bijv. een server selecteren of een verzoek blokkeren) op basis van het testresultaat. Het gebruik van ACL’s maakt flexibele doorsturing van netwerkverkeer mogelijk op basis van verschillende factoren zoals patroonherkenning en het aantal verbindingen naar een backend, bijvoorbeeld.
Voorbeeld van een ACL:
acl url_blog path_beg /blog
Deze ACL komt overeen als het pad van het verzoek van een gebruiker begint met /blog
. Dit zou bijvoorbeeld overeenkomen met een verzoek van http://uwdomain.com/blog/blog-entry-1
.
Voor een gedetailleerde handleiding over het gebruik van ACL’s, bekijk de HAProxy Configuration Manual.
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:
- welk load balancing algoritme te gebruiken
- 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.
Hier is een voorbeeld van een configuratie met twee backends, web-backend
en blog-backend
met elk twee webservers, luisterend op poort 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
balance roundrobin
regel specificeert het load balancing algoritme, dat gedetailleerd wordt beschreven in de Load Balancing Algorithms sectie.
mode http
specificeert dat er gebruik zal worden gemaakt van layer 7 proxying, wat wordt uitgelegd in de Types of Load Balancing sectie.
De check
optie aan het einde van de server
directives specificeert dat gezondheidscontroles moeten worden uitgevoerd op die backend servers.
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.)
- ACLs
use_backend
regels, die bepalen welke backends moeten worden gebruikt afhankelijk van welke ACL-voorwaarden overeenkomen, en/of eendefault_backend
regel die alle andere gevallen afhandelt
A frontend can be configured to various types of network traffic, as explained in the next section.
Types of Load Balancing
Nu u een begrip heeft van de basiscomponenten die worden gebruikt in load balancing, kunt u zich verdiepen in de basisvormen van load balancing.
Geen Load Balancing
A simple web application environment with no load balancing might look like the following:

In dit voorbeeld verbindt de gebruiker zich rechtstreeks met uw webserver, op uw domein.com
en is er geen load balancing. Als uw enkele webserver uitvalt, kan de gebruiker uw webserver niet meer bereiken. Bovendien, als veel gebruikers tegelijkertijd proberen toegang te krijgen tot uw server en deze de belasting niet aankan, kunnen ze een trage ervaring hebben of helemaal geen verbinding kunnen maken.
Layer 4 Load Balancing
De eenvoudigste manier om netwerkverkeer naar meerdere servers te verdelen, is door gebruik te maken van layer 4 (transportlaag) load balancing. Op deze manier zal load balancing gebruikersverkeer doorsturen op basis van IP-bereik en poort (bijv. als een verzoek binnenkomt voor http://uw domein.com/alles
, wordt het verkeer doorgestuurd naar de backend die alle verzoeken voor uw domein.com
op poort 80
verwerkt). Voor meer details over layer 4, bekijk de TCP subsectie van onze Inleiding tot Netwerken.
Hier is een diagram van een eenvoudig voorbeeld van layer 4 load balancing:

De gebruiker heeft toegang tot de load balancer, die het verzoek van de gebruiker doorstuurt naar de web-backend-groep van backend-servers. Welke backend-server er ook wordt geselecteerd, zal rechtstreeks reageren op het verzoek van de gebruiker. Over het algemeen zouden alle servers in de web-backend identieke inhoud moeten serveren, anders zou de gebruiker inconsistente inhoud kunnen ontvangen. Let op dat beide webservers verbinding maken met dezelfde database-server.
Layer 7 Load Balancing
Een andere, complexere manier om het netwerkverkeer te verdelen, is door laag 7 (toepassingslaag) load balancing te gebruiken. Door laag 7 te gebruiken, kan de load balancer verzoeken naar verschillende backend-servers doorsturen op basis van de inhoud van het verzoek van de gebruiker. Deze vorm van load balancing maakt het mogelijk om meerdere webtoepassingsservers onder hetzelfde domein en poort te laten draaien. Voor meer details over laag 7, bekijk de HTTP-subsectie van onze Inleiding tot Netwerken.
Hier is een diagram van een eenvoudig voorbeeld van laag 7 load balancing:

In dit voorbeeld, als een gebruiker uw domein.com/blog
aanvraagt, worden ze doorgestuurd naar de blog-backend, die een set servers is die een blogtoepassing draaien. Andere verzoeken worden doorgestuurd naar web-backend, die mogelijk een andere toepassing draait. Beide back-ends gebruiken dezelfde database-server, in dit voorbeeld.
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
Dit configureert een frontend genaamd http
, die al het inkomende verkeer op poort 80 afhandelt.
acl url_blog path_beg /blog
komt overeen met een verzoek als het pad van het verzoek van de gebruiker begint met /blog
.
use_backend blog-backend if url_blog
gebruikt de ACL om het verkeer naar blog-backend
te proxyen.
default_backend web-backend
specificeert dat al het andere verkeer doorgestuurd zal worden naar web-backend
.
Load Balancing Algoritmes
Het load balancing algoritme dat gebruikt wordt bepaalt welke server, in een backend, geselecteerd zal worden tijdens het load balancen. HAProxy biedt verschillende opties voor algoritmes. Naast het load balancing algoritme kunnen servers een gewicht parameter toegewezen krijgen om te manipuleren hoe vaak de server geselecteerd wordt, vergeleken met andere servers.
A few of the commonly used algorithms are as follows:
roundrobin
Round Robin selecteert servers om de beurt. Dit is het standaard algoritme.
leastconn
Selecteert de server met het minste aantal verbindingen. Dit wordt aanbevolen voor langere sessies. Servers in dezelfde backend worden ook op een round-robin manier geroteerd.
bron
Dit selecteert welke server te gebruiken op basis van een hash van het bron-IP-adres waarvandaan gebruikers verzoeken maken. Deze methode zorgt ervoor dat dezelfde gebruikers verbinding maken met dezelfde servers.
Sticky Sessions
Sommige toepassingen vereisen dat een gebruiker blijft verbinden met dezelfde backend-server. Dit kan worden bereikt via sticky sessions, met behulp van de appsession
-parameter in de backend die dit vereist.
Health Check
HAProxy gebruikt gezondheidscontroles om te bepalen of een backend-server beschikbaar is om verzoeken te verwerken. Dit vermijdt dat een server handmatig wordt verwijderd uit de backend als deze niet beschikbaar is. De standaard gezondheidscontrole is proberen een TCP-verbinding met de server tot stand te brengen.
Als een server niet slaagt voor een gezondheidscontrole en daardoor niet in staat is om verzoeken te verwerken, wordt deze automatisch uitgeschakeld in de backend, en wordt het verkeer niet naar deze server doorgestuurd totdat deze weer gezond is. Als alle servers in een backend falen, wordt de service onbeschikbaar totdat minstens een van die backend-servers weer gezond wordt.
Voor bepaalde soorten back-ends, zoals databaseservers, is de standaard gezondheidscontrole niet per se bedoeld om te bepalen of een server nog steeds gezond is.
De Nginx-webserver kan ook worden gebruikt als een op zichzelf staande proxyserver of load balancer, en wordt vaak gebruikt in combinatie met HAProxy vanwege zijn caching- en compressiemogelijkheden.
Hoge Beschikbaarheid
De layer 4 en 7 load balancing setups die in deze tutorial worden beschreven, gebruiken beide een load balancer om het verkeer naar een van de vele backend-servers te leiden. Uw load balancer is echter een enkelvoudig storingspunt in deze setups; als deze uitvalt of overweldigd wordt door verzoeken, kan dit hoge latentie of downtime veroorzaken voor uw service.
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.
Hier is een diagram van een high availability setup:
In dit voorbeeld heb je meerdere load balancers (één actief en één of meer passieve) achter een statisch IP-adres dat kan worden toegewezen van de ene server naar de andere. Wanneer een gebruiker uw website bezoekt, gaat het verzoek via het externe IP-adres naar de actieve load balancer. Als die load balancer uitvalt, zal uw failover-mechanisme dit detecteren en automatisch het IP-adres toewijzen aan een van de passieve servers. Er zijn verschillende manieren om een actief/passief HA-opstelling te implementeren. Voor meer informatie, lees Hoe u gereserveerde IP’s kunt gebruiken.
Conclusie
Nu je een begrip hebt van load balancing, en weet hoe je HAProxy kunt gebruiken, heb je een solide basis om te beginnen met het verbeteren van de prestaties en betrouwbaarheid van je eigen serveromgeving.
Als je geïnteresseerd bent in het opslaan van de output van HAProxy voor latere weergave, bekijk dan Hoe u HAProxy-logging configureert met Rsyslog op CentOS 8 [Quickstart]
Als je een probleem wilt oplossen, bekijk dan Veelvoorkomende HAProxy-fouten. Als er nog meer probleemoplossing nodig is, bekijk dan Hoe Veelvoorkomende HAProxy-fouten op te lossen.