HAproxy est un load balancer TCP. Il peut donc répartir la charge entre différents serveurs écoutant en TCP en backend.
HAproxy peut par exemple être utilisé pour load-balancer des reverse proxys, des site webs, des bases de données, etc… Bref c'est un outil puissant et très utilisé.
Voici l'architecture que nous allons réaliser :
Voici l'ip publique de HAproxy sur laquelle on va écouter avec HAproxy : 157.159.40.136
Et son ip privée : 192.168.103.136
Voici les ips de nos deux serveurs webs : 192.168.103.166
192.168.103.167
Là, c'est d'une simplicité enfantine :
On commence par installer HAproxy :
cat "deb http://ftp.debian.org/debian/ wheezy-backports main" >> /etc/apt/source.list.d apt-get update apt-get install haproxy
Ensuite on modifie le fichier /etc/default/haproxy
:
Remplacez
ENABLED=0
par
ENABLED=1
Maintenant attaquons la configuration.
Le fichier de conf est même simple à comprendre :
Si je ne respect pas cet ordre et mélange frontend et backend, j'obtiens une erreur…
Par exemple dans mon cas ça donne :
global daemon defaults maxconn 10000 timeout connect 2s timeout client 10s timeout server 2s frontend site_http mode http bind 157.159.40.136:80 default_backend site_http_b frontend site_https mode tcp bind 157.159.40.136:443 default_backend ssh_https_b backend site_http_b mode http balance roundrobin server site1 192.168.103.166:80 check inter 10s server site2 192.168.103.167:80 check inter 10s backend ssh_https_b mode tcp balance roundrobin server ssh1 192.168.103.166:443 check inter 10s server ssh2 192.168.103.167:443 check inter 10s
Passons pas trop de temps sur les options globales, c'est pas très intéressant.
De même pour frontend, on ne fait que spécifier un mode (non obligatoire mais plus propre), donner une adresse sur laquelle écouter, et donner un backend.
Dans le backend, on doit remettre le même mode que dans le frontend correspondant. Ensuite on précise le mode de load balancing. Roundrobin est le plus utilisé à la vue des confs disponibles sur internet. Enfin, on précise l'ensemble des serveurs distants ainsi qu'un intervalle de vérification ( ici 2 secondes ). Dès qu'un nœud est “abîmé”, il est retiré. Dès qu'il est à nouveau “en bonne santé”, il est réutilisé.
J'ai réalisé cette archi en DEV et là pour moi ça marche…
Si vous accordez une importance au couple client serveur, vous pouvez commencer par remplacer :
balance roundrobin
par
balance source
Si en plus vous bossez en http, vous pouvez mettre en place des cookies pour améliorez le binding…
listen http_proxy :80 mode http cookie SERVERID balance source server web1 192.168.103.166 cookie server01 server web2 192.168.103.167 cookie server02
Attention néanmoins, les cookies sont un mécanisme de couche 7, il est donc coûteux de s'en servir sur un load-balancer…
Personnellement, j'aurais tendance à considérer les mécanismes de couche 4 tel que balance source
suffisant.
hatop est un petit utilitaire permettant d'obtenir en temps réel l'état et le nombre de connection en frontend ainsi qu'en backend.
Pour pouvoir l'utiliser, éditez /etc/haproxy/haproxy.cfg
, et ajoutez en option globale :
stats socket /var/run/haproxy.sock
Installez hatop :
apt-get install hatop
Et enfin utilisez hatop :
hatop -s /var/run/haproxy.sock