«

»

Août 07 2014

[Tuto]HA: Introduction à HaProxy sous Debian 7

Bonjour à tous, dans ce nouveau tutoriel consacré à la haute disponibilité, je vais vous parler d’ HaProxy :)

Qu’est-ce que HaProxy?

Développée par le français Willy Tarreau en 2002, HAProxy est une solution libre, fiable et très performante de répartition de charge de niveau 4 (TCP) et 7 (HTTP).
Elle est particulièrement adaptée aux sites web fortement chargés qui nécessitent de la disponibilité.

Dans ce tutoriel, nous allons mettre en place trois serveurs

  • Un serveur de répartition de charge avec HaProxy
  • Deux serveurs web avec Apache et PHP

Voici la topologie que nous allons mettre en place:

Topologie

Topologie

 Installation du Load Balancer.

Une fois les cartes réseau de notre serveur de répartition de charge configurés correctement, nous allons pouvoir installer et configurer HaProxy.

Config IP du serveur

# The primary network interface
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.2.100
netmask 255.255.255.0
gateway 192.168.2.1

auto eth1
iface eth1 inet static
address 10.1.0.1
netmask 255.255.255.0

Malheureusement, HaProxy n’est pas dans les dépôts principaux de Debian, nous allons devoir utiliser les dépôts Backports pour l’installer.

echo "deb http://ftp.debian.org/debian/ wheezy-backports main" >> /etc/apt/sources.list
apt-get update
apt-get install haproxy

Une fois l’installation terminée, nous devons éditer la valeur ENABLED=0 à ENABLED=1 dans les fichiers /etc/default/haproxy et /etc/init.d/haproxy.

Vouc pouvez le faire avec les commandes suivantes:

sed -i "s/ENABLED=0/ENABLED=1/g" /etc/default/haproxy
sed -i "s/ENABLED=0/ENABLED=1/g" /etc/init.d/haproxy

Configuration de HaProxy

La configuration de HaProxy est assez simple et se fait dans un seul fichier de configuration, ce fichier se trouve dans /etc/haproxy/haproxy.cfg.

global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        user haproxy
        group haproxy
        daemon

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        contimeout 5000
        clitimeout 50000
        srvtimeout 50000
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http

#Configuration du balancement
listen cluster_web 192.168.2.100:80
        #Web
        mode http

		#Mode de balancement Round Robin
        balance roundrobin

		#Options
        option httpclose
        option forwardfor

		#Les serveurs Web
        server web1 10.1.0.21:80 check
        server web2 10.1.0.22:80 check

        #Stats
        stats enable
        stats hide-version
        stats refresh 30s
        stats show-node
        stats auth admin:admin
        stats uri  /stats

Je vais analyser ce fichier de configuration:

listen cluster_web 192.168.2.100:80: Cette directive nous permet de spécifier sur quelle adresse IP HaProxy va fonctionner, nous allons accéder au contenu web depuis cette adresse IP.
mode http: permet de spécifier que le balancement de charge est utilisé pour du contenu web http, dans le cas contraire on peut utiliser le mode tcp (pour du myql par exemple ;) )
balance roundrobin: permet de spécifier l’algorithme de répartitionde charge. Il en existe plusieurs

  • RoundRobin: La méthode Round-robin est une répartition équitable de la charge entre les serveurs d’un cluster. Chaque serveur traite le même nombre de requêtes, mais cela nécessite d’avoir des serveurs homogènes en termes de capacité de traitement.
  • Source: Le mode de balancement « source » signifie qu’un client en fonction de son adresse IP sera toujours dirigé vers le même serveur web. Cette option est nécessaire lorsque les sites Internet utilisent des sessions PHP.
  • Least connection: Le serveur renvoie vers le serveur le moins chargé. Si en théorie il semble le plus adapté, en réalité dans le cadre du Web dynamique, un serveur peut être considéré comme chargé alors que les processus sont en attente d’une requête vers une base de données.
  • First Response: Les requêtes clients sont envoyées simultanément à tous les serveurs et le premier qui répond sera chargé de la connexion. Difficile à mettre en oeuvre et rarement employé.

server web1 10.1.0.21:80 check: permet déclarer les différents serveurs web qui vont êtres utilisé pour la répartitiont de charge

Enfin stats, permet de configurer la page de statistiques de HaProxy, dans cette configuration,la page de statistiques sera disponibles via l’adresse suivante http://192.168.2.100/stats avec les identifiants admin/admin.

Maintenant vous pouvez enregistrer le fichier et démarrez Haproxy avec la commande suivante:

/etc/init.d/haproxy start

Vous pouvez maintenant accéder à l’interface de statistiques de HaProxy via l’addresse: http://192.168.2.100/stats

Vous pouvez voir sur l’image suivante que les deux serveurs Web sont affichés comme DOWN, c’est normal parce que nous ne les avons pas encore configurés.

Ha Stats DOWN

Ha Stats DOWN

Avant de mettre en place les serveurs Web, nous allons mettre en place l’IP forwarding sur le serveur LB pour que les serveurs Web aient accès à internet et aussi quelques rêgles iptables por mettre en place du NAT afin de pouvoir accéder aux serveurs Web via SSH.

Créer un fichier firewall dans le dossier /etc/init.d/ et copiez ceci dedans:

#!/bin/bash
##Denis ROSENKRANZ
##denisrosenkranz.com

start() {
    echo -n "Application des regles IpTables: "
    #Suppresion des anciennes rêgles
    iptables -F
    iptables -X
    iptables -t nat -F

    #Activation de l'IP Forwardings
	echo 1 > /proc/sys/net/ipv4/ip_forward
	iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

    ##NAT pour SSH sur les Web
    #Web
    iptables -t nat -A PREROUTING -p tcp -d 192.168.2.100 --dport 2221 -j DNAT --to-destination 10.1.0.21:22
    iptables -t nat -A PREROUTING -p tcp -d 192.168.2.100 --dport 2222 -j DNAT --to-destination 10.1.0.22:22

    echo " [terminé]"
    echo
}

stop() {
    echo -n "Flush des regles IpTables: "
    iptables -F
    iptables -X
    iptables -t nat -F
    echo " [termine]"
    echo
}

case $1 in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
    ;;
    status)
        /sbin/iptables -L
        /sbin/iptables -t nat -L
    ;;
    *)
        echo "Usage: firewall {start|stop|restart|status}"

esac
exit

Enregistrez le fichier et faites les commandes suivantes afin de rendre le fichier exécutable et de pouvoir le lancer au démarrage:

chmod +x /etc/init.d/firewall
update-rc.d firewall defaults

Puis mettez en place les règles

/etc/init.d/firewall start

Configuration des serveurs web.

Maintenant que le serveur  est configuré, nous allons pouvoir commencer à configurer les serveurs Web.

En ce qui concerne les adresses des deux serveurs Web, n’oubliez pas d’utiliser comme passerelle l’IP du serveur haproxy.

Voici la configuration IP de web1:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 10.1.0.21
netmask 255.255.255.0
gateway 10.1.0.1

Si web1 et web2 sont bien configurée, vous pouvez maintenant accéder à ces serveurs via SSH

  • ssh root@192.168.2.100 -p 2221 pour web1
  • ssh root@192.168.2.100 -p 2222 pour web2

Une fois sur ces deux serveurs, vous pouvez installer apache et PHP avec la commande suivante:

apt-get install apache2 php5

Une fois l’installation de apache et PHP terminée sur les deux serveurs, accédez à http://192.168.2.100/stats et vous verrez maintenant que tout est vert. Cela veut dire que HaProxy fonctionne maintenant.

HA Stat UP

HA Stat UP

Vous pouvez accéder maintenant à http://192.168.2.100 et vous verrez la page par défaut d’Apache, mais vous ne savez pas sur quel serveur Web vous êtes.

Page apache défaut

Page apache défaut

Test de la répartition de charge

Pour tester que la répartition de charge fonctionne, nous allons créer une page en PHP sur les deux serveurs web, cette page affichera le hostname de la machine.

Donc sur les deux serveurs Web, créez un fichier index.php dans le dossier /var/www/ et copiez ceci dedans:

<?php
    echo "Un coucou de ".gethostname()."\n"
?>

]

Supprimez aussi le fichier index.html présent dans ce dossier.

rm /var/www/index.html

Maintenant accédez à http://192.168.2.100 et vous verrez ceci:

Coucou de web1

Coucou de web1

Rafraîchissez la page vous de devez voir ceci:

Coucou de web2

Coucou de web2

Cela veut dire que la répartition de charge entre les deux serveurs fonctionne :)

Ce qui est intéressant avec HaProxy, si apache est stoppé sur l’un des deux serveurs, HaProxy va arrêter d’utiliser ce serveur.

Si par exemple vous arrêtez Apache sur web2, vous verrez sur la page de stats que web2 est marqué comme DOWN, si vous rafraîchissez la page http://192.168.2.100 seul Un coucou de web1 s’affichera, HaProxy a décidé de lui même de ne plus utiliser Web2.

Ha Stat un serveur down

Ha Stat un serveur down

Voila ce qui met fin à ce tuto sur HaProxy, nous allons voir dans un prochain tuto comment mettre en place un second serveur de répartition de charge passif au cas ou le serveur principal deviendrais défaillant.

(5 commentaires)

Passer au formulaire de commentaire

  1. nico

    Merci pour ce tuto très instructif :)

  2. Olivier

    Merci pour ce petit tuto rapide !

  3. Bernard Kb

    Bonjour,
    Je vous avez déjà contacté concernant un autre article sur les clusters. J’ai fini par installer un cluster actif/actif sur 2 serveurs et j’ai utilisé mon serveur bi-xeon pour y installer un datacenter Vmware.
    Sur le cluster, Apache fonctionne sans problème en actif/actif ainsi que mes 3 VG (de 2TO,3TO,3 TO). Maintenant je souhaiterai mettre en place un cluster Mysql en actif/actif (1 serveur HAproxy en VM) pour mes 2 serveurs en cluster actif/actif.
    Pourriez-vous me conseiller ?
    Merci d’avance pour votre réponse (et si cela est possible pour vous, de me répondre par mail, je vous le laisse: adm@bktech.fr)
    Cordialement,
    Bernard

  4. Caldagues

    Bonjour, je souhaiterai faire un cluster pour cacti, et intégrer du load balancing. Pensez-vous que HaProxy soit adapté?

  5. Boubacar

    Bonjour Denis,

    J’aimerai savoir quel outil tu utilise pour faire la topologie sur le tutoriel HaProxy ? c’est de l’open source ? Merci de me repondre à l’adresse: boubacarly1983@gmail.com

    Merci pour ce tuto très interessant.
    Cordialement.
    Boubacar LY

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Lire les articles précédents :
Tux-G2
Bientôt :)

Bonjour à tous, Je vous écrit ce petit billet pour vous avertir que je vais bientôt publier une série de...

Fermer