Equilibrage de charge avec haProxy
Article du 23/10/2008
Problématique
Lorsque la charge d'un système évolue, deux solutions sont possibles :
- Installer la solution sur une machine plus puissante
- Installer la solution sur une grappe de serveurs.
Aujourd'hui la deuxième solution est la plus performante et la moins coûteuse. De plus ce genre d'infrastructure permet aussi d'améliorer la qualité de service grace à une plus grande tolérance aux pannes.
Solutions du marché
Pour répondre à cette problématique diverses solutions sont à notre disposition :
Des solutions de type appliances (boitier spécialisés) de type BigIP ou Alteon.
Des solutions logicielles de type le mod_jk apache ou haproxy.
La première catégorie bien que très adaptée et simple à mettre en oeuvre nécessite cependant un investissement supplémentaire.
La deuxième catégorie peut être mise en place sur un serveur dédié ou sur un ou plusieurs serveurs de la grappe. Dans ce cas on s'assurera d'accéder à ce serveur via une IP-FailOver afin de ne pas avoir de « Single Point of Failure ».
Pour le clustering tomcat, le mod_jk est assez simple à mettre en oeuvre, cependant nous avons remarqué que lors de fortes charges des problèmes de stabilité peuvent apparaître.
Une solution du style haproxy permet de fonctionner avec n'importe quel type de serveur d'application étant donné qui peut agir de manière totalement transparente.
HaProxy, un logiciel très performant
Lors de nos tests et même en production ce produit nous a agréablement surpris. En effet non seulement il tient formidablement bien la charge et de plus il est très stable. En plus d'un an de production il n'est jamais tombé. Pourtant cette solution tourne pour un de nos client qui a de fortes contraintes de charges : (2 Millions de visiteurs par mois) avec des pics de 1000 connexions simultanées.
Installation
Afin d'installer la solution, il vous suffit de récupérer la dernière version stable de HaProxy. Il s'agit de la version 1.2.18.
Il vous suffit ensuite de créer le fichier de configuration /etc/haproxy.conf comme suit :
global daemon nbproc 1 listen application 192.168.0.100:80 mode http cookie SERVERID insert nocache balance roundrobin server serveur1 192.168.0.101:8080 cookie CK1 weight 1 check server serveur2 192.168.0.102:8080 cookie CK2 weight 1 check option httpclose redispatch stats uri /monUrlSecreteDeMonitoring clitimeout 60000 srvtimeout 60000 contimeout 60000Modifiez les champs serveur en fonction de vos adresses IP.
Dans cette configuration haproxy rajoutera un cookie nommé SERVERID et lui attribuera CK1 ou CK2 en fonction du serveur sur lequel il est redirigé. En cas de panne d'un des deux service haproxy redirigera de manière transparente sur le deuxième serveur.
Attention cependant aux sessions qui seront perdues si vous n'avez pas configuré vos serveurs Tomcat en mode cluster.
HaProxy vous donne aussi des statistiques sur vos serveurs, pensez à changer l'URL définie dans stats uri pour une Url personnalisée.
HaProxy offre une multitude de fonctionnalité, toutes ne peuvent pas être décrites ici pour plus d'information consultez la documentation qui est très complète. La version 1.3 est aussi très prometteuse en terme de nouvelles fonctionnalités.
Lancement de haProxy
Afin de lancer haproxy, lancez la commande suivante (n'oubliez pas de le lancer en mode nohup )
haproxy-1.2.18-linux-i586 -f /etc/haproxy.conf
HaProxy vous offre la possibilité de relire le fichier de configuration sans interruption de service. Pour cela relevez le PID du process (commande ps -eafH) et remplacez le dans la commande suivante :
haproxy-1.2.18-linux-i586 -f /etc/haproxy.conf -sf PID