Ucarp
From AleikoumWiki
Contents |
Objectif
L'objectif de cette page est de présenter l'outil UCARP et une façon de le déployer sur une Debian Lenny.
UCARP en théorie
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.
UCARP en pratique
UCARP peut être utilisé comme un process classique ou bien comme un daemon. C'est le deuxième cas qui nous intéresse et qui sera mis en avant dans cette page.
Dans cette page on va supposer que l'interface virtuelle sera eth0:1 et sera bindée sur eth0. L'IP virtuelle partagée sera 10.75.0.55. 10.75.0.50 sera le master et 10.75.0.51 le backup... allez c'est parti !
installation
L'installation d'UCARP se fait de façon classique :
$ sudo apt-get install ucarp
Si vous faites un dpkg -L ucarp, vous risquez d'être déçu... en effet à part le binaire et les pages de man qui vont bien le contenu est assez pauvre : rien pour le faire fonctionner en mode daemon dès le début. Je suis mauvaise langue UCARP vient aussi avec les scripts pour faire le up et le down d'une interface réseau donnée... bref c'est très léger et dans la suite nous allons présenter une idée de déploiement qui rendra plus simple l'exploitation de cet outil
pour quelques scripts en plus...
/usr/share/ucarp/vip-up_eth0:1
c'est le script qui sera appelé pour monter l'interface virtuelle partagée
$ cat /usr/share/ucarp/vip-up_eth0:1 #!/bin/sh /sbin/ifup eth0:1
/usr/share/ucarp/vip-down_eth0:1
c'est le script qui sera appelé pour éteindre l'interface virtuelle partagée
$ cat /usr/share/ucarp/vip-down_eth0:1 #!/bin/sh /sbin/ifdown eth0:1
/etc/init.d/ucarp-init.sh
Voici un script d'init assez simple et succinct pour utiliser UCARP.
Attention : ce script n'a un intêret que si vous utilisez la configuration proposée plus bas dans la page.
$ cat /etc/init.d/ucarp-init.sh #!/bin/sh ### BEGIN INIT INFO # Provides: ucarp # Required-Start: $syslog # Required-Stop: $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: UCARP - failover IP ### END INIT INFO # v 0.1 - 20100202 # by Erwan 'Labynocle' Ben Souiden # erwan@aleikoum.net UCARP_BIN='/usr/sbin/ucarp' UCARP_PID_FILE='/var/run/ucarp.pid' UCARP_CONF_FILE="/etc/ucarp/ucarp.conf" # some basic checks [ ! -x $UCARP_BIN ] && echo "ERROR - $UCARP_BIN doesn't exist or not executable !" && exit 1 [ ! -x "$UCARP_CONF_FILE" ] && echo "ERROR - $UCARP_CONF_FILE doesn't exist or not executable !" && exit 1 . $UCARP_CONF_FILE case "$1" in start) echo "Starting UCARP as a daemon with $UCARP_CONF_FILE as configuration file..." [ -f $UCARP_PID_FILE ] && echo "ERROR - $UCARP_PID_FILE exists, maybe ucarp is still running" && exit 1 if [ "$UCARP_MASTER" = 'yes' ] then [ $DEBUG_VALUE -ge 1 ] && echo "DEBUG - $UCARP_BIN -i $UCARP_INTERFACE -b $UCARP_ADV -s $UCARP_ADDR_PHY -v $UCARP_VID -o $UCARP_PASSWD_FILE -a $UCARP_ADDR_VIR -u $UCARP_UP_INT_SCRIPT -d $UCARP_DOWN_INT_SCRIPT -z -P -B" $UCARP_BIN -i $UCARP_INTERFACE -b $UCARP_ADV -s $UCARP_ADDR_PHY -v $UCARP_VID -o $UCARP_PASSWD_FILE -a $UCARP_ADDR_VIR -u $UCARP_UP_INT_SCRIPT -d $UCARP_DOWN_INT_SCRIPT -z -P -B else [ $DEBUG_VALUE -ge 1 ] && echo "DEBUG - $UCARP_BIN -i $UCARP_INTERFACE -b $UCARP_ADV -s $UCARP_ADDR_PHY -v $UCARP_VID -o $UCARP_PASSWD_FILE -a $UCARP_ADDR_VIR -u $UCARP_UP_INT_SCRIPT -d $UCARP_DOWN_INT_SCRIPT -z -B -k $UCARP_ADVSKEW" $UCARP_BIN -i $UCARP_INTERFACE -b $UCARP_ADV -s $UCARP_ADDR_PHY -v $UCARP_VID -o $UCARP_PASSWD_FILE -a $UCARP_ADDR_VIR -u $UCARP_UP_INT_SCRIPT -d $UCARP_DOWN_INT_SCRIPT -z -B -k $UCARP_ADVSKEW fi [ $? -ne 0 ] && echo "Starting UCARP as a daemon...FAILED" && exit 1 pidof "$UCARP_BIN" > $UCARP_PID_FILE chmod 700 $UCARP_PID_FILE echo "Starting UCARP as a daemon (pid : `cat $UCARP_PID_FILE`)...OK" ;; start-nodaemon) echo "Starting UCARP with $UCARP_CONF_FILE as configuration file..." if [ "$UCARP_MASTER" = 'yes' ] then [ $DEBUG_VALUE -ge 1 ] && echo "DEBUG - $UCARP_BIN -i $UCARP_INTERFACE -b $UCARP_ADV -s $UCARP_ADDR_PHY -v $UCARP_VID -o $UCARP_PASSWD_FILE -a $UCARP_ADDR_VIR -u $UCARP_UP_INT_SCRIPT -d $UCARP_DOWN_INT_SCRIPT -z -P" $UCARP_BIN -i $UCARP_INTERFACE -b $UCARP_ADV -s $UCARP_ADDR_PHY -v $UCARP_VID -o $UCARP_PASSWD_FILE -a $UCARP_ADDR_VIR -u $UCARP_UP_INT_SCRIPT -d $UCARP_DOWN_INT_SCRIPT -z -P else [ $DEBUG_VALUE -ge 1 ] && echo "DEBUG - $UCARP_BIN -i $UCARP_INTERFACE -b $UCARP_ADV -s $UCARP_ADDR_PHY -v $UCARP_VID -o $UCARP_PASSWD_FILE -a $UCARP_ADDR_VIR -u $UCARP_UP_INT_SCRIPT -d $UCARP_DOWN_INT_SCRIPT -z -k $UCARP_ADVSKEW" $UCARP_BIN -i $UCARP_INTERFACE -b $UCARP_ADV -s $UCARP_ADDR_PHY -v $UCARP_VID -o $UCARP_PASSWD_FILE -a $UCARP_ADDR_VIR -u $UCARP_UP_INT_SCRIPT -d $UCARP_DOWN_INT_SCRIPT -z -k $UCARP_ADVSKEW fi ;; stop) echo "Stopping UCARP daemon (pid : `cat $UCARP_PID_FILE`)...OK" DAEMON_PID=`cat $UCARP_PID_FILE` kill -15 $DAEMON_PID sleep 2 rm -f $UCARP_PID_FILE ;; status) if [ -f "$UCARP_PID_FILE" ] then echo "UCARP is running (pid : `cat $UCARP_PID_FILE`)" else echo "UCARP is not running" fi ;; restart|force-reload) $0 stop sleep 5 $0 start ;; *) echo "Usage: $0 {start|start-nodaemon|stop|status|restart|force-reload}" exit 1 ;; esac exit 0
nota : on peut remarquer 2 type de start :
- start : qui va démarrer UCARP en tant que daemon avec la configuration que vous allez définir suivant le modèle décrit dans le prochain paragraphe. Le log d'UCARP sera automatiquement dirigé dans votre syslog
- start-nodaemon : UCARP sera lancé comme un process qqconque (donc vous ne rendra pas la main) et vous aurez le log directement sur vos sorties standards
configuration
Pour la configuration j'ai créé /etc/ucarp qui contient le fichier de configuration ucarp.conf et le fichier contenant le password (plus sécure d'utiliser un fichier comme celui ci car sinon le password apparaît quand on fait un ps).
/etc/network/interface
Ajouter l'interface eth0:1 dans le fichier de configuration des interfaces réseaux.
$ cat /etc/network/interface # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet static address 10.75.0.50 gateway 10.75.0.254 netmask 255.255.192.0 broadcast 10.75.63.255 # post-up ethtool -K eth0 tx off # # The commented out line above will disable TCP checksumming which # might resolve problems for some users. It is disabled by default # #auto eth0:1 iface eth0:1 inet static address 10.75.0.55 netmask 255.255.192.0
/etc/ucarp/ucarp.conf
C'est en fait un script shell dans lequel je définis tout un tas de paramètres
$ cat /etc/ucarp/ucarp.conf #!/bin/sh # v 0.1 - 20100202 # by Erwan 'Labynocle' Ben Souiden # erwan@aleikoum.net # activation du Debug DEBUG_VALUE=1 # ce serveur est il le master UCARP_MASTER='yes' # interface bindee par UCARP UCARP_INTERFACE='eth0' # frequence des alertes UCARP_ADV='1' # adresse IP physique associee a $UCARP_INTERFACE UCARP_ADDR_PHY='10.75.0.50' # ID du serveur Virtuel UCARP_VID='55' # priorite [0-255], plus c'est bas plus il a des chances d etre le master UCARP_ADVSKEW='100' # chemin vers le fichier ucarp.passwd UCARP_PASSWD_FILE='/etc/ucarp/ucarp.passwd' # adresse IP virtuelle geree par UCARP UCARP_ADDR_VIR='10.75.0.55' # chemin vers le script pour monter l'interface virtuelle UCARP_UP_INT_SCRIPT='/usr/share/ucarp/vip-up_eth0:1' # chemin vers le script pour supprimer l'interface virtuelle UCARP_DOWN_INT_SCRIPT='/usr/share/ucarp/vip-down_eth0:1'
nota :
- UCARP_VID : doit avoir la même valeur pour tous les serveurs qui participent au partage de la même IP virtuelle
- UCARP_ADVSKEW : il faut avoir une valeur différente pour chaque serveurs afin de mieux maîtriser les priorités
/etc/ucarp/ucarp.passwd
Ce fichier contient le password qu'utilisent tous les les serveurs qui participent au partage de la même IP virtuelle.
Le password doit être en clair et être sur la première ligne du fichier.
$ cat /etc/ucarp/ucarp.passwd lepassword
nota :
- afin d'être cohérent il faut faire un "chmod 700 /etc/ucarp/ucarp.passwd && chown root:root /etc/ucarp/ucarp.passwd"
exploitation
l'exploitation devient du coup très simple. Pour démarrer UCARP :
$ sudo /etc/init.d/ucarp-init.sh start
Pour stopper UCARP :
$ sudo /etc/init.d/ucarp-init.sh stop
Pour connaître le status d'UCARP :
$ sudo /etc/init.d/ucarp-init.sh status
Liens / Références
http://www.ucarp.org/ : site officiel