Linux:LoadBalancing et Haute Disponibilité avec HAProxy
Un article de Djjnet.
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.
Sommaire |
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
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


