====== 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