De load balancer verbergt alle backend-servers voor de buitenwereld; van buitenaf lijkt het alsof één server al het werk doet.

De loadbalancer-module inschakelen

Voor loadbalancing-ondersteuning voor de protocollen HTTP, FTP en AJP13 in Apache heb je een aantal modules nodig:

LoadModule proxy_module mod_proxy.so
LoadModule proxy_http_module mod_proxy_http.so
LoadModule proxy_balancer_module mod_proxy_balancer.so

Vergeet mod_proxy_http niet te laden: laad je die niet, dan krijg je geen enkele foutmelding. De balancer werkt dan gewoon niet.

Proxy uitschakelen

Omdat mod_proxy van Apache ook een (open) proxyserver maakt, voorkom je met ProxyRequests op Off dat Apache als forward proxy gaat werken

ProxyRequests Off
<Proxy \*>
Order deny,allow
Deny from all
</Proxy>

In een normale reverse proxy- of gateway-configuratie hoort deze optie altijd op Off te staan.
Dit schakelt het gebruik van de ProxyPass-directive niet uit.

Voorbeeld van een balancer-configuratie

Hieronder een voorbeeld van loadbalancing tussen twee backend-servers:

<Proxy balancer://clustername>
BalancerMember http://serverA
BalancerMember http://serverB
Order allow,deny
Allow from all
</Proxy>

<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / balancer:// clustername/
ProxyPassReverse / balancer:// clustername/
ServerName server.com
</VirtualHost>

Het scheduler-algoritme van de load balancer

Standaard telt Apache simpelweg het aantal verzoeken en zorgt het ervoor dat elke backend-server evenveel verzoeken doorgestuurd krijgt.

Er zijn drie scheduler-algoritmes beschikbaar. Je stuurt dit aan met de waarde lbmethod in de Balancer-definitie:

Request Counting (hoeveel we van deze worker verwachten)
lbmethod=byrequests

Weighted Traffic (hoeveel verkeer, in bytes, we deze worker willen laten verwerken)
lbmethod=bytraffic

Counting and Pending Request Counting (een nieuw verzoek gaat automatisch naar de worker met de minste actieve verzoeken.)
lbmethod=bybusyness

Stickyness van de load balancer

De balancer ondersteunt stickyness. Gaat een verzoek naar een bepaalde backend, dan horen alle volgende verzoeken van dezelfde gebruiker naar diezelfde backend te gaan.

Deze aanpak is transparant voor clients en backends, maar kent een paar problemen: een ongelijke belastingverdeling als clients zelf achter proxy’s zitten, stickyness-fouten wanneer een client een dynamisch IP-adres gebruikt dat tijdens een sessie verandert, en verlies van stickyness als de mappingtabel volloopt.

Voorbeeld van loadbalancing met stickyness

Header add Set-Cookie “ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/” env=BALANCER_ROUTE_CHANGED
<Proxy balancer://clustername>
BalancerMember http://serverA route=1 loadfactor=1
BalancerMember http://serverB route=2 loadfactor=2
ProxySet lbmethod=byrequests stickysession=ROUTEID timeout=15
</Proxy>

<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / balancer:// clustername/
ProxyPassReverse / balancer:// clustername/
ServerName server.com
</VirtualHost>