Ucarp : failover avec partage d'IP virtuelles
Ucarp est un outil de « haute disponibilité » permettant l'usage d'adresses IP virtuelles communes à plusieurs ordinateurs offrant un même service redondant sur un réseau.
Chaque élément du « cluster » (à partir de 2 serveurs) émet ainsi sur le réseau des signes de vie de façon à ce que les autres éléments ayant la même adresse IP virtuelle, prennent le relais lorsque l'élément défaillant (ou en maintenance) ne donne plus ces signes de vie. Ucarp est en système de « failover » automatique sécurisé, simple et efficace.
Pré-requis
- Disposer des droits d'administration.
- Disposer d'une connexion à Internet configurée et activée.
Installation
Configuration
Créer les répertoires utiles à ucarp :
sudo mkdir -p /etc/ucarp/interface
Paramètres généraux
Créer le fichier /etc/default/ucarp contenant les paramètres généraux à ucarp et y insérer les lignes :
# Location of the ucarp executable UCARP_EXEC=/usr/sbin/ucarp IFCONFIG=/sbin/ifconfig # # ucarp options # -z run shudown script on exit # -P force perferred master #OPTIONS="-z -P" OPTIONS="-z"
Paramètres d'adressage virtuel
Pour chaque adresse virtuelle nous allons créer une interface réseau virtuelle.
Créer le fichier /etc/ucarp/interface/ucarp0 et y insérer :
# # Location of the ucarp pid file UCARP_PIDFILE=/var/run/ucarp0.pid # # ucarp base, lower number will be perfered master # set to same to have master stay alive as long as possible UCARP_BASE=1 # # Interface for Ipaddress INTERFACE=eth0:carp0 # # Instance id # any number from 1 to 255 # Master and Backup need to be the same INSTANCE_ID=42 # # Password so servers can trust who they are talking to PASSWORD=<password> # # The Application Address that will failover VIRTUAL_ADDRESS=192.168.0.32 VIRTUAL_BROADCAST=192.168.0.255 VIRTUAL_NETMASK=255.255.255.0 # # The Maintanence Address of the local machine SOURCE_ADDRESS=192.168.0.1
Fichier de service
De façon à pouvoir activer les adresses virtuelles simplement, nous allons créer un fichier de service /etc/init.d/ucarp et y insérer :
- etc/init.d/ucarp
#!/bin/sh #/etc/init.d/ucarp: start ucarp daemon. ### BEGIN INIT INFO # Provides: ucarp # Short-Description: Start software ucarp daemon # Required-Start: $local_fs $remote_fs $syslog # Required-Stop: $local_fs $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 ### END INIT INFO PATH=/bin:/usr/bin:/sbin:/usr/sbin # For configuration of the init script use the file # /etc/default/ucarp, do not edit this init script. # Set run_ucarp to 1 to start ucarp or 0 to disable it. run_ucarp=1 R_INTERFACE=/etc/ucarp/interface start() { if [ $run_ucarp = 1 ] then echo -n "Starting $NAME daemon: " for fichier in $( find $R_INTERFACE -type f -name '*' | sort ) do [ -e $fichier ] && . $fichier $IFCONFIG $INTERFACE $VIRTUAL_ADDRESS netmask $VIRTUAL_NETMASK \ broadcast $VIRTUAL_BROADCAST UCARP_OPTS="$OPTIONS -b $UCARP_BASE -i $INTERFACE \ -v $INSTANCE_ID -p $PASSWORD -a $VIRTUAL_ADDRESS -s $SOURCE_ADDRESS" start-stop-daemon --start --background --make-pidfile \ --pidfile ${UCARP_PIDFILE} --quiet --exec ${UCARP_EXEC} -- ${UCARP_OPTS} echo ucarp. done fi } stop() { if [ $run_ucarp = 1 ] then echo -n "Stopping $NAME daemon: " for fichier in $( find $R_INTERFACE -type f -name '*' | sort ) do [ -e $fichier ] && . $fichier $IFCONFIG $INTERFACE down if start-stop-daemon --stop --quiet --pidfile ${UCARP_PIDFILE} then echo ucarp. else echo fi done fi } [ -e /etc/default/ucarp ] && . /etc/default/ucarp test -x ${UCARP_EXEC} || exit 0 NAME=ucarp case "$1" in start) start "$2" ;; stop) stop "$2" ;; restart) stop "$2" start "$2" ;; force-reload) stop "$2" start "$2" ;; *) echo "Usage: /etc/init.d/ucarp {start|stop|restart|force-reload}" exit 1 esac exit 0
Il faut alors rendre le script exécutable :
sudo chmod 744 /etc/init.d/ucarp
et lancer le service :
sudo /etc/init.d/ucarp start
En lançant ifconfig
dans un terminal, on obtient alors :
eth0 Link encap:Ethernet HWaddr 00:15:C5:5D:89:77 inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:385003 errors:671 dropped:0 overruns:0 frame:671 TX packets:99652 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:48549065 (46.2 MiB) TX bytes:40492320 (38.6 MiB) Base address:0xecc0 Memory:fe9e0000-fea00000 eth0:carp0 Link encap:Ethernet HWaddr 00:15:C5:5D:89:77 inet addr:192.168.0.32 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Base address:0xecc0 Memory:fe9e0000-fea00000