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.

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 -B"
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
  • ucarp.txt
  • Dernière modification: Le 16/01/2017, 18:27
  • (modification externe)