Qu'est-ce que HAProxy ?
HAProxy (High Availability Proxy) est un équilibreur de charge open source qui peut équilibrer la charge de n'importe quel service TCP. HAProxy est une solution gratuite, très rapide et fiable qui offre un équilibrage de charge, une haute disponibilité et un proxy pour les applications basées sur TCP et HTTP. Il est particulièrement bien adapté aux sites Web à très fort trafic et alimente bon nombre des sites les plus visités au monde.
Depuis son existence, il est devenu de facto l'équilibreur de charge open source standard. Bien qu'il ne se fasse pas de publicité, il est largement utilisé. Vous trouverez ci-dessous un schéma de base de l'apparence de la configuration :
Installer HAProxy
J'utilise Ubuntu 14.04 et je l'installe en :
apt-get install haproxy
Vous pouvez vérifier la version en :
haproxy -v
Nous devons permettre à HAProxy d'être démarré par le script d'initialisation /etc/default/haproxy. Définissez l'option ENABLED sur 1 comme :
ENABLED=1
Pour vérifier si cette modification est effectuée correctement, exécutez le script d'initialisation de HAProxy sans aucun paramètre. Vous devriez voir ce qui suit :
$ service haproxy <press_tab_key>
reload restart start status stop
HAProxy est maintenant installé. Créons maintenant une configuration dans laquelle nous avons 2 (deux) instances de serveur Web Apache et 1 (une) instance HAProxy. Vous trouverez ci-dessous les informations de configuration :
Nous utiliserons trois systèmes, générés virtuellement via VirtualBox :
Instance 1 - Équilibreur de charge
Nom d'hôte :haproxy
Système d'exploitation :Ubuntu
IP privée :192.168.205.15
Instance 2 - Serveur Web 1
Nom d'hôte :webser01
SE :Ubuntu avec LAMP
IP privée :192.168.205.16
Instance 2 - Web Server 2
Nom d'hôte :webserver02
OS :Ubuntu avec LAMP
IP privée :192.168.205.17
Voici le schéma de la configuration :
Configurons maintenant HAProxy.
Configurer HAProxy
Sauvegardez le fichier d'origine en le renommant :
mv /etc/haproxy/haproxy.cfg{,.original}
Nous allons créer notre propre fichier haproxy.cfg. À l'aide de votre éditeur de texte préféré, créez le fichier /etc/haproxy/haproxy.cfg en tant que :
global log /dev/log local0 log 127.0.0.1 local1 notice maxconn 4096 user haproxy group haproxy daemon defaults log global mode http option httplog option dontlognull retries 3 option redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000 listen webfarm 0.0.0.0:80 mode http stats enable stats uri /haproxy?stats balance roundrobin option httpclose option forwardfor server webserver01 192.168.205.16:80 check server webserver02 192.168.205.17:80 check
Explication :
global log /dev/log local0 log 127.0.0.1 local1 notice maxconn 4096 user haproxy group haproxy daemon
La directive log mentionne un serveur syslog auquel les messages de log seront envoyés.
La directive maxconn spécifie le nombre de connexions simultanées sur le front-end. La valeur par défaut est 2000 et doit être ajustée en fonction de la configuration de votre système.
Les directives utilisateur et groupe modifient le processus HAProxy pour l'utilisateur/groupe spécifié. Ceux-ci ne doivent pas être modifiés.
defaults log global mode http option httplog option dontlognull retries 3 option redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000
La section ci-dessus contient les valeurs par défaut. L'option redispatch permet la redistribution de session en cas d'échec de connexion. Ainsi, la permanence de la session est annulée si une instance de serveur Web tombe en panne.
La directive retries définit le nombre de tentatives à effectuer sur une instance de serveur Web après un échec de connexion.
Les valeurs à modifier sont les différentes directives de timeout. L'option contimeout spécifie le temps d'attente maximal pour qu'une tentative de connexion à une instance de serveur Web aboutisse.
Les paramètres clitimeout et srvtimeout s'appliquent lorsque le client ou le serveur doit accuser réception ou envoyer des données pendant le processus TCP. HAProxy recommande de définir les délais d'expiration du client et du serveur sur la même valeur.
listen webfarm 0.0.0.0:80 mode http stats enable stats uri /haproxy?stats balance roundrobin option httpclose option forwardfor server webserver01 192.168.205.16:80 check server webserver02 192.168.205.17:80 check
Le bloc ci-dessus contient la configuration pour le frontend et le backend. Nous configurons HAProxy pour écouter sur le port 80 pour webfarm qui est juste un nom pour identifier une application.
Les directives stats activent la page des statistiques de connexion. Cette page peut être consultée avec l'URL mentionnée dans l'uri des statistiques. Dans ce cas, il s'agit de http://192.168.205.15/haproxy?stats une démo de cette page peut être consultée ici.
La directive balance spécifie l'équilibrage de charge algorithme à utiliser. Les options d'algorithme disponibles sont :
- Round Robin (roundrobin),
- Tourniquet statique (static-rr),
- Moins de connexions (leastconn),
- Source (source),
- URI (uri) et
- Paramètre d'URL (url_param).
Des informations sur chaque algorithme peuvent être obtenues à partir de la documentation officielle.
La directive server déclare un serveur backend, la syntaxe est :
server <server_name> <server_address>[:port] [param*]
Le nom que nous mentionnons ici apparaîtra dans les journaux et les alertes. Il existe d'autres paramètres pris en charge par cette directive et nous utiliserons le paramètre de vérification dans cet article. L'option de vérification active les vérifications de l'état de l'instance du serveur Web. Dans le cas contraire, l'instance du serveur Web est « toujours considérée comme disponible ».
Une fois la configuration terminée, démarrez le service HAProxy :
sudo service haproxy start
Tester l'équilibrage de charge et le basculement
Nous ajouterons le nom du serveur dans le fichier index.html par défaut situé par défaut à /var/www/index.html
Sur l'instance 2 - Web Server 1 (webserver01 avec IP-192.168.205.16), ajoutez la ligne ci-dessous comme :
sudo sh -c "echo \<h1\>Hostname: webserver01 \(192.168.205.16\)\<\/h1\> >> /var/www/index.html"
Sur l'instance 3 - Web Server 2 (webserver02 avec IP-192.168.205.17), ajoutez la ligne ci-dessous comme :
sudo sh -c "echo \<h1\>Hostname: webserver02 \(192.168.205.17\)\<\/h1\> >> /var/www/index.html"
Ouvrez maintenant le navigateur Web sur la machine locale et parcourez l'adresse IP haproxy, c'est-à-dire http://192.168.205.15
Chaque fois que vous actualisez l'onglet, vous verrez que la charge est distribuée à chaque serveur Web. Ci-dessous, une capture d'écran de mon navigateur :
Pour la première fois lorsque je visite http://192.168.205.15 , j'obtiens :
Et pour la deuxième fois, c'est-à-dire lorsque je rafraichis la page, j'obtiens :
Vous pouvez également consulter les statistiques d'haproxy en visitant http://192.168.205.15/haproxy?stats
Vous pouvez faire plus pour cette configuration. Voici quelques idées :
- mettez un ou les deux serveurs Web hors ligne pour tester ce qui se passe lorsque vous accédez à HAProxy
- configurer HAProxy pour servir une page de maintenance personnalisée
- configurer l'interface Web afin de pouvoir surveiller visuellement les statistiques HAProxy
- modifier le planificateur à autre chose qu'à tour de rôle
- configurer la hiérarchisation/les pondérations pour des serveurs particuliers
C'est tout !