Principe de la répartition de charge
Initialement, un seul serveur suffisait pour les applications web. Avec la croissance du trafic et la complexité des services, le besoin de scalabilité horizontale et de haute disponibilité a rendu nécessaire la distribution des requêtes sur plusieurs serveurs.
Mécanismes de répartition
Deux approches existent :
- Scalabilité verticale : Amélioration des capacités matérielles d'un serveur
- Scalabilité horizontale : Ajout de machines supplémentaires
Composants clés
- Cluster applicatif : Groupe de serveurs hébergeant la même application
- Répartiteur de charge : Dispositif distribuant les requêtes selon un algorithme défini
Avantages principaux
- Gestion de la haute charge
- Continuité de service (failover)
- Extensibilité élastique
- Renforcement de la sécurité
Méthodes courantes
Choix manuel
Interface proposant différents serveurs, laissant à l'utilisateur le choix de la connexion.
Rotation DNS
Répartition basique via enregistrements DNS multiples. Limités par :
- Fiabilité réduite (délais de propagation)
- Distribution inégale (cache local, absence de pondération)
Répartition couche 4/7
Couche 4 (Transport) : Basée sur IP/Port
Couche 7 (Application) : Basée sur contenu (URL, en-têtes)
Différences clés :
- Performance supérieure en couche 4
- Décision plus fine en couche 7
<!-- Exemple d'architecture courante -->
LVS (Couche 4) + Nginx (Couche 7)
Répartition couche 7 avec Nginx
Utilise le module proxy_pass pour rediriger vers un groupe de serveurs upstream.
Configuration de base
upstream app_servers {
server 10.0.1.10:8080;
server 10.0.1.11:8080;
}
server {
listen 80;
location / {
proxy_pass http://app_servers;
}
}
États des serveurs
| État | Description |
|---|---|
| down | Serveur exclu temporairement |
| backup | Serveur de secours |
| max_conns | Connexions simultanées maximales |
| max_fails | Échecs consécutifs avant désactivation |
Stratégies de répartition
| Stratégie | Commande | Cas d'usage |
|---|---|---|
| Rotation | (par défaut) | Serveurs homogènes |
| Pondérée | weight | Serveurs hétérogènes |
| Persistence IP | ip_hash | Sessions utilisateur |
| Connexions min | least_conn | Requêtes longues |
| Hachage URL | hash $uri | Optimisation cache |
Exemples pratiques
Répartition par ressource
upstream video_servers {
server 10.0.2.10:9000;
}
upstream file_servers {
server 10.0.2.20:9000;
}
location /videos/ {
proxy_pass http://video_servers;
}
location /documents/ {
proxy_pass http://file_servers;
}
Réécriture d'URL
location /static/ {
rewrite ^(/static/.*) /resources/$1 last;
}
location / {
proxy_pass http://app_servers;
}
Répartition couche 4 avec Nginx
Nécessite le module stream (compilation avec --with-stream).
Exemple pour services TCP
stream {
upstream db_cluster {
server db1.example.com:3306;
server db2.example.com:3306;
}
server {
listen 3306;
proxy_pass db_cluster;
}
}
Procédure d'activation
- Sauvegarder le binaire Nginx existant
- Recompiler avec ./configure --with-stream
- Remplacer le binaire et redémarrer