====== Load balancing TCP avec HAproxy ======
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 :
{{:wiki:divers:ha_proxy.png?600|}}
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''
==== Mise en place ====
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 :
- On a d'abord les option générales
- Puis on a les ports sur lesquels on écoute qu'on map avec un **backend**
- Et enfin les backends, qui sont les groupes de serveurs loadbalancé.
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. [[http://fr.wikipedia.org/wiki/Round-robin_%28informatique%29|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...
==== Binding client serveur en http ====
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.
==== Monitoring avec hatop ====
**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
===== Liens utiles =====
* Des exemples de configuration sur github : https://github.com/exceliance/haproxy/blob/master/configuration_templates/exchange2010_https_services_forward.tpl
* Un détail complet de la configuration : http://haproxy.1wt.eu/download/1.3/doc/haproxy-en.txt
* Un exemple d'utilisation avec l'API d'[[http://openstack.redhat.com/Load_Balance_OpenStack_API|Openstack]]
* Le lien vers [[wiki:divers:keepalived]] afin de redonder votre load balancer.
* Un pointeur sur comment [[https://www.digitalocean.com/community/articles/how-to-use-haproxy-to-set-up-mysql-load-balancing--3|load balancer du MySQL]] avec un HAproxy