samedi 20 février 2010

Répartition de charge #apache , #nginx et #tomcat

On dispose de plusieurs solutions pour répartir le trafic HTTP sur plusieurs serveurs WEB.


  • Par DNS
C'est la solution la plus simple, la moins onéreuse mais aussi la moins efficace.
En faisant correspondre plusieurs adresses IP à une entrée DNS, une répartition de type round-robin (tourniquet) sera réalisée par le serveur DNS. Mais cette répartition ne tient pas compte des stratégies de cache des DNS intermédiaires et du cache client. De plus la gestion des pannes d'un des serveurs n'est pas prévue.
  • Par un frontal Apache.
Il est courant de placer devant plusieurs serveur WEB un Apache fonctionnant en reverse proxy. Cette architecture peut avoir plusieurs objectifs : répartir la charge entre les serveurs applicatifs et servir de frontal à des serveur des servlets hébergés par TOMCAT.



Le module d'apache mod_proxy_balancer est actuellement le système le plus abouti pour réaliser cette tache.
Il propose une répartition allant du simple round-robin jusqu'à des algorithmes basés sur la charge réelle, la pondération des serveurs et des tables d'association.
Il permet aussi l'affinité des sessions: je commence sur un serveur et je reste collé sur ce serveur durant toute ma session (mode sticky sessions)

Un page d'administration est proposée par ce module:



Site de référence ici.


  • Par un frontal NGiNX.

Le serveur NGiNX se positionne comme une alternative à Apache. Ce serveur est très compact, il fait appel à un code C très optimisé. Il est le 3eme serveur web utilisé dans le monde:

Apache 664,576 66.89% 665,593 66.98% 0.09
Microsoft 175,278 17.64% 172,983 17.41% -0.23
nginx 40,084 4.03% 42,105 4.24% 0.20


Il est original par sa conception même : il basé sur un traitement asynchrone des requêtes, une requête n'étant pas traitée par un process mais par plusieurs en parallèle.

Il propose des modules tiers permettant de mettre en place du load-balancing.

Des modules messageries (imap,pop, SMTP) le transforme en proxy mail très efficace.

  • Par un répartiteur de charge opensource HAproxy



Ce projet est porté par le francais Willy Tarreau.
Cette solution est utilisée par des Banques et des administrations.

  • Par un répartiteur de charge commercial.

Des boitiers dédiés de type ALTEON placés en frontaux vous offrent differentes stratégies de répartitions: round-robin, par table associative (hash) , par poids des serveurs, par charges etc. avec toujours l'option d'affinité pour les sessions.

  • Conclusion.
Il existe d'autres solutions comme par exemple 'pound' qui est une système minimaliste écrit en 'C' mais qui date un peu.
Il y a aussi des fonctions de répartition prévues par mod_jk



Il est là aussi possible de définir l'option d'affinité des sessions. Toutefois, il est préférable d'utiliser mod_proxy_balancer qui est plus récent que mod_jk.

D'une manière générale l'affinité des sessions se gère par un cookie placé par le serveur applicatif web et propre à chaque serveur. Ce cookie est intercepté par le frontal qui s'en sert pour savoir à quel serveur envoyer la requête.

1 commentaire:

Anonyme a dit…

Il y a beaucoup plus efficace: haproxy !