L'équilibrage de charge, ou Load Balancing (LB), est un composant critique pour garantir la haute disponibilité et la performance des infrastructures modernes. Son rôle principal est de distribuer intelligemment le trafic réseau entre plusieurs serveurs afin d'éviter la saturation d'un nœud unique et d'assurer une redondance efficace.
- Panorama des solutions de répartition de charge
Classification par support
- Solutions Matérielles : Des équipements dédiés (comme F5 Big-IP ou A10) offrant des performances extrêmes (millions de requêtes par seconde) grâce à des puces spécialisées, mais à un coût d'acquisition et de maintenance élevé.
- Solutions Logicielles : Des outils comme Nginx, HAProxy ou LVS. Ils sont flexibles, économiques et s'installent sur du matériel standard ou des instances cloud.
Classification par couche réseau (Modèle OSI)
La répartition peut s'opérer à différents niveaux :
- Couche 7 (Application) : Analyse le contenu des requêtes HTTP/HTTPS. Cela inclut le Proxy Inverse (Nginx), l'équilibrage via DNS ou la redirection HTTP.
- Couche 4 (Transport) : Se base sur les adresses IP et les ports TCP/UDP. Le LVS (Linux Virtual Server) est la référence ici, offrant une latence très faible en modifiant directement les paquets au niveau du noyau Linux.
- Algorithmes de distribution
Le choix de l'algorithme détermine comment le trafic est orienté vers les serveurs cibles :
- Round Robin (Tourniquet) : Distribution séquentielle et égale. Idéal si les serveurs ont des capacités identiques.
- Weighted Round Robin (Pondéré) : Attribue un poids aux serveurs. Un serveur plus puissant recevra statistiquement plus de requêtes.
- Least Connections : Dirige la requête vers le serveur ayant le moins de connexions actives.
- IP Hash : Utilise l'adresse IP du client pour garantir que celui-ci soit toujours dirigé vers le même serveur (persistance de session).
- Consistent Hashing : Version avancée du hachage limitant la redistribution massive de clés lors de l'ajout ou de la suppression d'un serveur dans la grappe.
- Pratique : Configuration Nginx
Configuration par défaut (Round Robin)
Nginx utilise par défaut le mode Round Robin. Si un serveur échoue, il est automatiquement retiré de la rotation.
upstream cluster_web {
server srv1.infra.local:8080;
server srv2.infra.local:8080;
server srv3.infra.local:8080;
}
server {
listen 80;
server_name www.mon-service.com;
location / {
proxy_pass http://cluster_web;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Gestion des priorités (Weight)
Pour privilégier une machine plus robuste, on utilise le paramètre weight.
upstream cluster_pondere {
server backend_premium:8080 weight=5;
server backend_standard:8080 weight=2;
server backend_test:8080 weight=1;
}
Persistance de session (IP Hash)
Indispensable pour les applications stockant des sessions locales non partagées.
upstream cluster_session {
ip_hash;
server node1.app.local:9000;
server node2.app.local:9000;
}
Moindres connexions (Least Conn)
Efficace pour les requêtes dont le temps de traitement varie fortement.
upstream cluster_dynamique {
least_conn;
server worker1.pool.internal:8443;
server worker2.pool.internal:8443;
}
- Modules tiers et extensions avancées
L'algorithme "Fair" (Temps de réponse minimal)
Ce module distribue les requêtes en fonction de la réactivité réelle des backends. Il nécessite une compilation personnalisée de Nginx.
Installation :
# Téléchargement des sources
git clone https://github.com/gnosek/nginx-upstream-fair.git
# Compilation avec le module
./configure --add-module=/chemin/vers/nginx-upstream-fair
make && make install
Note technique : En cas d'erreur de compilation liée à default_port sur les versions récentes de Nginx, remplacez les occurrences de ce terme par no_port dans le fichier source ngx_http_upstream_fair_module.c via la commande sed.
Utilisation de Consistent Hash
Pour les systèmes de cache distribué, l'usage du Consistent Hashing permet d'optimiser le taux de réussite du cache (cache hit ratio).
upstream cluster_cache {
consistent_hash $request_uri;
server cache01.local:11211;
server cache02.local:11211;
server cache03.local:11211;
}
- Résilience et sécurité
L'utilisation de Nginx en tant que répartiteur de charge permet également d'implémenter des mécanismes de sécurité comme la terminaison SSL/TLS, le filtrage d'IP malveillantes et la protection contre les attaques DoS basiques via des directives de limitation de débit (limit_req).