⚖️ Load Balancer (Équilibrage) – HA, L4/L7 & Algorithmes
Guide complet IDEO-Lab sur la répartition de charge, la haute disponibilité et le reverse proxy.
Concept & Objectifs
Définition, Haute Disponibilité (HA) & Scalabilité.
Load Balancer HA ScalabilitéTerminologie Clé
VIP (IP Virtuelle), Pool (Ferme), Membres (Nœuds).
VIP Pool MemberType : L4 (Network)
Couche 4 (TCP/UDP). Rapide. (ex: NLB, HAProxy TCP).
Couche 4 TCP/UDPType : L7 (Application)
Couche 7 (HTTP/S). "Intelligent" (Routage URL, Headers).
Couche 7 HTTP ALBAlgo : Round Robin
Simple (1-2-3-1-2-3). Weighted (Pondéré).
Round Robin WeightedAlgo : Least Connections
Le plus "juste". Envoie au serveur le moins chargé.
Least Connections IntelligentHealth Checks (Sondes)
Actif (Ping, TCP, HTTP) vs Passif (Erreurs 5xx).
Health Check ProbeSession Persistence
"Sticky Sessions" (IP Hash, Cookie Injection).
Sticky Cookie IP HashSSL Offloading
Terminaison SSL sur le LB (HTTPS -> HTTP).
SSL Offloading TLSType : Hardware (Appliance)
ADC (F5 BIG-IP, Citrix NetScaler). Très performant.
F5 Citrix ADCType : Software (Nginx)
upstream, proxy_pass. Excellent L7 (Reverse Proxy).
Type : Software (HAProxy)
backend, server. Excellent L4/L7. Très rapide.
Type : Cloud (AWS, GCP)
Managé. AWS (NLB, ALB), GCP, Azure LB.
Cloud AWS ALB/NLBHA : Le Problème (SPOF)
Le LB est un Point de Défaillance Unique (SPOF).
HA SPOF RedondanceHA : Solution (VRRP)
VRRP / CARP / HSRP. Actif/Passif, IP Flottante.
VRRP IP FlottanteFonction : WAF
Web Application Firewall (Sécurité L7, OWASP).
WAF SécuritéFonction : Caching
Mise en cache (Reverse Proxy) de contenu statique.
Caching VarnishCheat-sheet
Résumé L4 vs L7 & Algorithmes.
Checklist RésuméDéfinition (Répartiteur de Charge)
Un Load Balancer (LB), ou "Répartiteur de Charge", est un appareil (matériel ou logiciel) qui agit comme un Reverse Proxy (un "contrôleur aérien" pour le trafic entrant).
Il se place en "façade" d'un groupe de serveurs (une "ferme") et distribue les requêtes des clients (ex: trafic web) entre ces serveurs back-end, en suivant un algorithme spécifique.
[ Clients (Internet) ]
│
│ (Trafic vers www.ideolab.com)
▼
[ LOAD BALANCER (VIP) ]
(IP Publique)
│ │ │
├──────┼──────┤
▼ ▼ ▼
[ Srv 1] [ Srv 2] [ Srv 3]
(Pool de Serveurs Back-end)
Les Deux Objectifs Principaux
| Objectif | Description |
|---|---|
| Haute Disponibilité (HA) / Redondance | Si [Srv 1] tombe en panne (ex: crash, maintenance), le LB (via ses Health Checks) le détecte et arrête automatiquement de lui envoyer du trafic. Il distribue 100% du trafic sur [Srv 2] et [Srv 3]. Résultat : Zéro interruption de service (Downtime) pour l'utilisateur. |
| Scalabilité (Horizontale) | Si le trafic augmente (pic de Noël), au lieu de remplacer [Srv 1] par un *plus gros* serveur (Scalabilité Verticale, coûteuse), on ajoute simplement [Srv 4] et [Srv 5] au pool. Résultat : La charge est répartie, la performance est maintenue. |
Le jargon du Load Balancing :
| Terme | Description | Exemple |
|---|---|---|
| VIP (Virtual IP) | L'adresse IP unique (l'IP "virtuelle") du Load Balancer. C'est l'IP que le client (DNS) cible. | 80.1.2.3 |
| Pool / Farm / Backend | Le groupe de serveurs "réels" (back-end) qui font le travail. | "Pool Web", "Pool API" |
| Member / Node (Nœud) | Un serveur individuel "réel" à l'intérieur du pool. | 192.168.1.101 |
| Health Check (Sonde) | Le mécanisme (Ping, TCP, HTTP) que le LB utilise pour vérifier si un Membre est "UP" ou "DOWN". | GET /healthz |
Un LB de Couche 4 (Transport) opère au niveau TCP / UDP. Il est "rapide et stupide".
Fonctionnement (DNAT)
Il ne lit pas le contenu de la requête (ex: HTTP). Il regarde uniquement les en-têtes L3/L4 (IP Source, Port Source, IP Dest, Port Dest).
Il ne termine pas la connexion. Il se contente de faire du DNAT (Destination NAT) : il réécrit l'IP/Port de destination (le VIP) avec l'IP/Port d'un serveur réel (Membre) et "transmet" (forward) le paquet.
Client -> (Dest: VIP:80) -> [LB L4] -> (Dest: SRV1:80) -> [Serveur 1]
Avantages / Inconvénients
- (+) Très Haute Performance : Latence quasi-nulle (souvent géré en hardware/kernel).
- (+) Agnostique : Peut équilibrer n'importe quel protocole TCP/UDP (MySQL, SMTP, RDP...).
- (-) Non-Intelligent : Ne peut pas router basé sur l'URL (
/api), les en-têtes, ou les cookies. - (-) Problème SSL : Ne peut pas faire de SSL Offloading (car il ne lit pas le L7).
Exemples : AWS NLB, HAProxy (mode tcp), Nginx (stream module).
Un LB de Couche 7 (Application) opère au niveau Applicatif (ex: HTTP, HTTPS, gRPC). Il est "intelligent et plus lent".
Fonctionnement (Full Proxy)
C'est un proxy complet. Il termine la connexion TCP du client, lit la requête L7 (HTTP), prend une décision de routage, puis ouvre une nouvelle connexion TCP vers le serveur back-end choisi.
[Client] <--- (Connexion 1) ---> [LB L7] <--- (Connexion 2) ---> [Serveur 1]
Avantages / Inconvénients
- (+) Routage Intelligent : Peut prendre des décisions basées sur :
- Path (Chemin) :
/images/*-> Pool-Images,/api/*-> Pool-API. - Host (Hôte) :
a.com-> Pool-A,b.com-> Pool-B. - Header/Cookie :
User-Agent: Mobile-> Pool-Mobile.
- Path (Chemin) :
- (+) Fonctions Avancées : Peut faire du SSL Offloading (voir 3.3) et du Caching.
- (-) Plus Lent (Overhead) : Terminer TCP et parser HTTP consomme plus de CPU que le L4.
- (-) Limité : Ne fonctionne que pour les protocoles qu'il comprend (HTTP, gRPC...).
Exemples : AWS ALB, Nginx (http module), HAProxy (mode http), F5.
Round Robin (Tourniquet)
C'est l'algorithme le plus simple et souvent celui par défaut.
Le LB envoie chaque nouvelle requête au serveur suivant dans la liste, puis revient au début.
Pool : [Srv A], [Srv B], [Srv C] Requête 1 -> Srv A Requête 2 -> Srv B Requête 3 -> Srv C Requête 4 -> Srv A Requête 5 -> Srv B ...
- Avantage : Extrêmement simple, prévisible.
- Inconvénient : "Injuste" (Unfair). Si Srv A est "bloqué" par un gros upload (requête 1), il recevra quand même la requête 4, alors que Srv B et C sont peut-être libres.
Weighted Round Robin (Pondéré)
Une variante qui permet d'assigner un "poids" (weight) à chaque serveur, pour gérer un parc hétérogène.
Pool : - Srv A (Machine puissante) : weight=5 - Srv B (Petite VM) : weight=1
Résultat : Le LB enverra 5 requêtes à Srv A pour chaque 1 requête envoyée à Srv B.
Least Connections (Moins de Connexions)
L'algorithme "intelligent" le plus courant. Le LB maintient un compteur du nombre de connexions actives pour chaque serveur du pool.
Il envoie toujours la nouvelle requête au serveur qui a le moins de connexions actives.
État Actuel : - Srv A (rapide) : 10 connexions - Srv B (rapide) : 11 connexions - Srv C (lent) : 25 connexions (bloqué sur un gros fichier) Nouvelle Requête -> Srv A
Avantage : Distribution de charge la plus équitable. Tient compte de la puissance réelle et de la charge des serveurs (un serveur lent aura naturellement plus de connexions actives).
IP Hash (Source IP Hash)
C'est un algorithme utilisé principalement pour la persistance de session (sticky).
Le LB calcule un "hash" (une empreinte) de l'adresse IP source du client. Le résultat de ce calcul désigne toujours le même serveur back-end.
hash(IP 1.2.3.4) -> Srv B hash(IP 5.6.7.8) -> Srv A
Avantage : Garantit que le client 1.2.3.4 retourne toujours sur Srv B.
Inconvénient : Injuste. Si 1000 clients sont derrière un seul NAT (ex: un proxy d'entreprise 1.2.3.4), ils iront tous sur Srv B, saturant ce serveur.
C'est le mécanisme vital qui permet au LB d'assurer la Haute Disponibilité (HA). Le LB teste en permanence ses membres (serveurs) pour savoir s'ils sont "UP" (sains) ou "DOWN" (morts).
Checks Actifs (Sondes)
Le LB envoie activement des requêtes de test (ex: toutes les 5 secondes).
| Niveau | Test | Vérifie quoi ? |
|---|---|---|
| L3 | ICMP (Ping) | "L'OS du serveur (192.168.1.10) est-il UP ?" |
| L4 | TCP Connect | "Y a-t-il un service qui écoute sur le Port 80 ?" (Le service Apache/Nginx est-il démarré ?) |
| L7 | HTTP GET | "Si je fais GET /healthz, le serveur répond-il HTTP 200 OK ?"(Le meilleur check). Vérifie que l'application (PHP/Node) fonctionne. |
Règle : Si le check échoue X fois (ex: 3 échecs), le LB marque le membre "DOWN" et le retire du pool.
Checks Passifs
Le LB n'envoie pas de sonde, il observe le trafic réel des utilisateurs.
Règle : Si le LB envoie 5 requêtes d'utilisateurs au Srv A, et que Srv A répond 5 fois avec HTTP 503 (Service Unavailable), le LB va *passivement* marquer Srv A comme "DOWN" pour une courte période (ex: 30 sec) avant de réessayer.
Problème : Les algorithmes (Round Robin, Least Conn) sont "stateless". Ils envoient les requêtes n'importe où. C'est parfait pour du contenu statique, mais problématique pour les applications "stateful" (ex: un panier e-commerce stocké dans la session PHP/Java du Srv A).
Req 1 (Login) -> [LB] -> Srv A (Crée session "panier") Req 2 (Ajout) -> [LB] -> Srv B (Ne connaît pas la session) -> Erreur !
Solution : Persistence (Stickiness). Forcer un client à toujours retourner sur le même serveur back-end.
Méthode 1 : Source IP Hash
(Voir 2.3) Le LB route basé sur un hash de l'IP client. Simple, fonctionne en L4.
Inconvénient : Ne fonctionne pas si plusieurs clients partagent une IP (NAT) ou si l'IP client change (Mobile).
Méthode 2 : Cookie Injection (L7)
(La meilleure méthode) Nécessite un LB L7.
- Req 1 (Client) -> [LB] -> [Srv A]
- [Srv A] -> [LB] -> (Client) : Le LB injecte un cookie :
Set-Cookie: LBSESSION=SRV_A_ID. - Req 2 (Client) -> [LB] : Le client renvoie le cookie
LBSESSION=SRV_A_ID. - Le LB lit le cookie et route la requête vers [Srv A] (en ignorant l'algorithme de load balancing).
SSL Offloading (ou Terminaison TLS) est une fonction du LB L7 où il gère 100% des opérations de chiffrement/déchiffrement.
Le Flux
Le trafic est chiffré (HTTPS) sur Internet (entre Client et LB), mais en clair (HTTP) sur le LAN interne (entre LB et Serveurs).
[CLIENT] <--- (Connexion 1 : HTTPS - Cryptée) ---> [REVERSE PROXY (Nginx/LB)]
│ (Port 443)
│ (Déchiffre)
│
<--- (Connexion 2 : HTTP - Non cryptée) ---> [Serveur App 1]
│ (Port 80)
│
<--- (Connexion 2 : HTTP - Non cryptée) ---> [Serveur App 2]
(Port 80)Avantages
- Performance (Offloading) : Le chiffrement est lourd (CPU). Les serveurs d'application (PHP, Node) sont "déchargés" de cette tâche. Les LB matériels ont des puces (ASICs) dédiées à cela.
- Centralisation (Gestion) : Un seul endroit où gérer (installer, renouveler) les certificats SSL, au lieu de 20 serveurs.
- Visibilité (L7) : La seule façon pour un LB L7 de lire les URLs, Headers ou Cookies (pour le routage intelligent ou la persistance) est de déchiffrer le trafic d'abord.
Un Load Balancer Matériel (ou ADC - Application Delivery Controller) est un appareil physique dédié (une "boîte noire") conçu spécifiquement pour le load balancing à très haute performance.
Leaders du Marché
- F5 (BIG-IP) : Le leader historique, souvent considéré comme le standard de l'industrie (LTM - Local Traffic Manager).
- Citrix (NetScaler) : Un concurrent majeur, très puissant.
- (Autres : Kemp, A10 Networks...)
Avantages
- Performance Extrême : Utilise des puces spécialisées (ASICs, FPGAs) pour traiter le trafic (L4) et le SSL (Offloading) à la vitesse du matériel (wirespeed), sans impacter le CPU.
- Fiabilité : Matériel redondant (alimentations, ventilateurs).
- Fonctionnalités : Solution "tout-en-un" (LB L4/L7, WAF, Caching, SSL VPN...)
Inconvénients
- Coût : Extrêmement cher (modèle CAPEX - Achat de matériel).
- Rigidité : Propriétaire ("vendor lock-in"), lent à provisionner (il faut commander et installer une boîte).
Nginx (Open Source) est le Reverse Proxy L7 le plus populaire au monde. Il est excellent pour le load balancing HTTP/HTTPS, mais peut aussi gérer le L4 (stream module).
Configuration (Exemple L7 HTTP)
Configuration (nginx.conf) pour répartir la charge (Round Robin) d'un site web sur 2 serveurs back-end.
# 1. Définir le pool (la ferme) de serveurs back-end
upstream backend_servers {
server 192.168.1.10:80; # Serveur 1
server 192.168.1.11:80; # Serveur 2
# server 192.168.1.12:80 weight=3; (Weighted)
# ip_hash; (Pour la persistance IP)
}
server {
listen 80;
server_name www.ideolab.com;
location / {
# 2. Transférer le trafic au pool
proxy_pass http://backend_servers;
# 3. (Important) Passer les bons en-têtes
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}HAProxy (Open Source) est un logiciel dédié au Load Balancing. Il est réputé pour être extrêmement rapide (surtout en L4/TCP) et très stable.
Configuration (Exemple L7 HTTP)
Configuration (haproxy.cfg) similaire à Nginx.
# 1. Définir le "Frontend" (ce que le client voit)
frontend http_frontend
bind *:80
mode http
default_backend web_servers
# 2. Définir le "Backend" (le pool de serveurs)
backend web_servers
mode http
balance roundrobin (Algorithme)
# 3. Ajouter les membres et les health checks
server srv1 192.168.1.10:80 check
server srv2 192.168.1.11:80 check
# 4. (Optionnel) Dashboard de statistiques
listen stats
bind *:8080
stats enable
stats uri /haproxy?statsLes LBs "Cloud" sont des services entièrement managés (SaaS/PaaS). Vous ne gérez pas de VM, vous ne configurez pas Nginx. Vous "commandez" un LB via une API ou une interface web.
Exemple : Écosystème AWS
| Type (AWS) | Couche | Usage |
|---|---|---|
| NLB (Network Load Balancer) | L4 (Réseau) | Trafic TCP/UDP. Très haute performance, latence ultra-faible. IP statique (Elastic IP). |
| ALB (Application Load Balancer) | L7 (Application) | Trafic HTTP/HTTPS, gRPC. Routage avancé (Path, Host). Intégration WAF, SSL. |
| CLB (Classic Load Balancer) | L4 / L7 (Hybride) | (Legacy/Obsolète) Ne pas utiliser pour les nouveaux projets. |
Avantages : Scalabilité automatique (gérée par le Cloud), intégration (IAM, WAF, Certificats), pas de maintenance (HA gérée par le Cloud).
Inconvénients : Coût (OPEX), "vendor lock-in".
Le Load Balancer résout le problème de SPOF (Single Point of Failure) des serveurs back-end. Mais il devient lui-même le nouveau SPOF.
[ Clients (Internet) ]
│
▼
[ LOAD BALANCER (VIP) ] <--- (Si ce serveur crash,
(IP Publique) TOUT LE SITE EST DOWN !)
│ │ │
├──────┼──────┤
▼ ▼ ▼
[ Srv 1] [ Srv 2] [ Srv 3]
(UP) (UP) (UP)
Problème : Un Load Balancer seul n'est pas en Haute Disponibilité (HA).
Solution : Il faut toujours déployer les Load Balancers par paire (Cluster), dans une configuration Active/Passive.
Pour rendre le LB redondant (HA), on utilise un cluster Active/Passive et une IP Flottante (Floating IP), gérée par un protocole comme VRRP.
Architecture HA (Active/Passive)
[ Clients (Internet) ]
│
▼
[ IP Flottante (VIP) ]
(ex: 80.1.2.3)
↗ (Possède le VIP) ↘ (Écoute)
╱ ╲
[ LB 1 (ACTIF) ] <---- (Heartbeat) ----> [ LB 2 (PASSIF) ]
(Priorité 100) (Priorité 90)
│ (Ne fait rien)
└──────────► [ Pool de Serveurs ]
VRRP (Virtual Router Redundancy Protocol)
- LB 1 (Actif) "possède" l'IP Flottante (VIP) car il a la priorité la plus élevée.
- LB 1 et LB 2 s'envoient des "heartbeats" (paquets "je suis vivant") en permanence.
- Scénario de panne : LB 1 (Actif) crash (panne de courant).
- LB 2 (Passif) ne reçoit plus de heartbeats de LB 1.
- LB 2 (Passif) se déclare "Actif", usurpe l'IP Flottante (VIP), et commence à traiter le trafic.
Résultat : Le basculement (failover) est automatique et (presque) instantané (quelques secondes).
Un WAF est un type spécifique de Reverse Proxy (Couche 7) axé sur la sécurité applicative.
Il est souvent intégré directement dans les Load Balancers L7 modernes (Nginx (ModSecurity), F5 (AWF), AWS (AWS WAF)).
Fonctionnement (Inspection L7)
Comme le LB L7 fait du SSL Offloading (déchiffre le trafic), il peut inspecter le contenu des requêtes HTTP (URLs, Headers, Body) à la recherche de signatures d'attaques (ex: OWASP Top 10).
Exemple de règle WAF
Client envoie : GET /login.php?user=' OR '1'='1' 1. [LB (Nginx)] déchiffre le HTTPS. 2. [LB (WAF)] analyse le paramètre "user". 3. [LB (WAF)] détecte la signature d'une Injection SQL. 4. [LB (WAF)] bloque (Drop) la requête (répond 403 Forbidden). (Le trafic n'atteint jamais le serveur applicatif vulnérable).
Les LBs L7 (comme Nginx ou Varnish) peuvent agir comme des caches de Reverse Proxy pour réduire la charge sur les serveurs back-end.
Cache Statique (Nginx)
Le LB peut être configuré pour servir lui-même les fichiers statiques (CSS, JS, Images) depuis son disque local, sans jamais déranger les serveurs d'application (PHP/Node).
Cache Dynamique (Varnish, Nginx)
Mise en cache de la réponse HTML complète d'une page (ex: la page d'accueil) pendant 60 secondes.
1. [User 1] demande "/" 2. [LB] -> [Srv App (PHP)] 3. [Srv App] (génère la page) -> [LB] 4. [LB] stocke le HTML (Cache, TTL 60s) -> [User 1] 5. [User 2] demande "/" (10 sec plus tard) 6. [LB] (Sert la page depuis son cache) -> [User 2] (Le serveur PHP n'est jamais contacté).
L4 vs L7
| Critère | L4 (Network LB) | L7 (Application LB) |
|---|---|---|
| Niveau | Transport (TCP/UDP) | Application (HTTP/HTTPS) |
| Performance | Extrêmement rapide (latence faible) | Plus lent (Overhead CPU) |
| Visibilité | Aveugle (lit IP/Port) | Intelligent (lit URL, Headers, Cookies) |
| SSL Offload | Non (ou L4/Passthrough) | Oui (Standard) |
| Usage | Base de données (MySQL), UDP (Jeux) | Sites Web (API, Microservices) |
Algorithmes
| Algorithme | Usage |
|---|---|
| Round Robin | Simple, prévisible. (Pour des serveurs identiques/stateless). |
| Least Connections | Le meilleur choix (défaut). Le plus équitable pour trafic dynamique. |
| IP Hash | Persistance (Sticky). (Si l'application est stateful et ne gère pas les sessions externes). |
