Linux:LoadBalancing et Haute Disponibilité avec HAProxy

De Djjnet
Aller à : Navigation, rechercher

Sommaire

Ancienne doc basée sur la branche 1.2

HAProxy permet de répartir les connexions sur un port sur plusieurs serveurs. Il permet aussi de détecter l'indisponibilité d'un des serveurs.
Il a l'avantage d'être très performant et tenir des charges très importantes comme plusieurs milliers de connexions par seconde. Les ressources matérielles nécessaires sont très faible.

HAProxy sait gérer plusieurs "proxy" à la fois. Il est possible de faire du load balancing sur le port http et le port smtp en même temps. Il est aussi possible de faire du load balancing sur le port 80 pour plusieurs IP.

HAProxy est disponible à cette adresse : http://haproxy.1wt.eu/download/

Ce mini tutorial est basé sur la stable : 1.2.17.

Compilation

Il est nécessaire d'avoir les librairies de développement de libpcre, exemple pour Debian :

apt-get install libpcre3-dev

Compilation :

make TARGET=linux26 CPU=i686 REGEX=static-pcre

Sur un serveur 64 bit et une version plus récente d'haproxy (1.4.24 par exemple), utiliser :

make TARGET=linux2628 USE_STATIC_PCRE=1

Installation

Copier le binaire compilé dans /usr/sbin.
Créer l'utilisateur haproxy :

adduser --system --no-create-home --home /var/chroot/haproxy --disabled-password --disabled-login --group haproxy

Script de démarrage basé sur l'exemple fourni à créer : /etc/init.d/haproxy :

#!/bin/sh
# This is our service name
BASENAME=haproxy
[ -f /etc/$BASENAME/$BASENAME.cfg ] || exit 1
RETVAL=0
start() {
 /usr/sbin/$BASENAME -c -q -f /etc/$BASENAME/$BASENAME.cfg
 if [ $? -ne 0 ]; then
   echo "Errors found in configuration file, check it with '$BASENAME check'."
   return 1
 fi
 echo -n "Starting $BASENAME: "
 /usr/sbin/$BASENAME -D -f /etc/$BASENAME/$BASENAME.cfg
 RETVAL=$?
 echo
 [ $RETVAL -eq 0 ] && touch /var/lock/$BASENAME
 return $RETVAL
}
stop() {
 echo -n "Shutting down $BASENAME: "
 kill $(</var/run/haproxy.pid)
 RETVAL=$?
 echo
 [ $RETVAL -eq 0 ] && rm -f /var/lock/$BASENAME
 [ $RETVAL -eq 0 ] && rm -f /var/run/$BASENAME.pid
 return $RETVAL
}
restart() {
 /usr/sbin/$BASENAME -c -q -f /etc/$BASENAME/$BASENAME.cfg
 if [ $? -ne 0 ]; then
   echo "Errors found in configuration file, check it with '$BASENAME check'."
   return 1
 fi
 /usr/sbin/$BASENAME -D -f /etc/$BASENAME/$BASENAME.cfg -st $(</var/run/haproxy.pid)
}
check() {
 /usr/sbin/$BASENAME -c -q -V -f /etc/$BASENAME/$BASENAME.cfg
}
condrestart() {
 [ -e /var/lock/$BASENAME ] && restart || :
}
# See how we were called.
case "$1" in
 start)
   start
   ;;
 stop)
   stop
   ;;
 restart)
   restart
   ;;
 reload)
   restart
   ;;
 condrestart)
   condrestart
   ;;
 check)
   check
   ;;
 *)
   echo $"Usage: $BASENAME {start|stop|restart|reload|condrestart|check}"
   RETVAL=1
esac
exit $RETVAL

Configuration

Créer le fichier /etc/haproxy/haproxy.cfg :

#Dans la section global sont les options du daemon HAProxy
global
       #connexion max pour tous les proxy
       maxconn 20000
       #ulimit-n = 2 * maxconn + nbproxy + nbserveurs + 1
       ulimit-n 65536
       #pas de droits sur le dossier pour l'utilisateur
       chroot /var/chroot/haproxy
       # uid et gid de l'utilisateur haproxy créé précédemment.
       uid 103
       gid 107
       daemon
       #debug
       #quiet
       pidfile /var/run/haproxy.pid
#Dans la section defaults sont les options par défaut pour tous les proxy. Elles peuvent être redéfinies.
defaults
       log     global
       balance roundrobin
       retries 3
       redispatch
       contimeout      5000
       clitimeout      50000
       srvtimeout      50000
#Définition d'un proxy :
# listen nomproxy IP:PORT
#Le nom est utilisé dans l'interface de statistiques
listen  siteweblb 192.168.0.2:80
       log 127.0.0.1   local0
       mode    http
       cookie  NOMCOOKIE insert nocache
       balance roundrobin
       #si non précisé, valeur par défaut (2000)
       maxconn 10000
       option forwardfor
       option httpchk
       option dontlognull
       # server nomserver IP:PORT cookie CONTENUCOOKIE check inter 10000 rise 1 fall 3 weight  POIDSDUSERVER
       #Le nom est utilisé dans l'interface de statistiques
       server front1 192.168.0.51:80 cookie front1 check inter 10000 rise 1 fall 3 weight  64
       server front2 192.168.0.52:80 cookie front2 check inter 10000 rise 1 fall 3 weight  20
       server front3 192.168.0.53:80 cookie front3 check inter 10000 rise 1 fall 3 weight  20
       #option de monitoring du proxy
       #pour certaines IP retourner 'HTTP/1.0 200 OK'
       #monitor-net 192.168.0.252/31
       #ou sur une uri spéciale
       #monitor-uri /haproxy_test
#pour vérifier etat service sur port spécifique
#retourne 'HTTP/1.0 200 OK'
listen http_health_check 192.168.0.2:8080
       mode health
       option httpchk
#Interface de statistiques d'utilisation d'HAProxy :
listen admin_page 192.168.0.2:12345
       mode http
       stats uri /
       stats realm Statistiques
       stats auth LOGIN:PASSWORD

Log Apache

Afin d'avoir l'ip des clients et non du serveur HAProxy dans les logs Apache, il faut installer le module rpaf.
Il faut modifier les fichiers de configuration afin d'y avoir l'ip du serveur HAproxy :
/etc/apache2/mod-available/rpaf.conf :

<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 192.168.0.2
</IfModule>

/etc/apache2/mod-available/rpaf.load :

LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so

Passage en version 1.3.15.1

L'option de compilation est légèrement différente :

make TARGET=linux26 CPU=i686 USE_STATIC_PCRE=1

Pour le fichier de configuration une syntaxe est différente :
Partie defaults, modifier redispatch en

option redispatch

Quelques exemples sur version plus récente

Changement de backend selon url

Frontend avec acl sur l'url :

frontend solr 0.0.0.0:8984
       acl update      path_dir        update
       use_backend     solr-rw          if update
       default_backend solr-ro

Backends :

backend solr-rw
        server server1 172.16.1.5:8983 check inter 5s
backend solr-ro
        server server1 172.16.1.5:8983 check inter 5s weight 2
        server server2 172.16.1.6:8983 check inter 5s weight 2