Publié le: 2010-02-16

UCARP

UCARP est une implémentation alternative au protocole VRRP de FreeBSD et CISCO. Il permet de mettre en place un IP failover (autrement dit la redondance de service pour la haute disponibilité). De ce fait, grâce à UCARP, si vous avez un serveur redondé de votre serveur IMAP et SMTP, si le principal vient à tomber, la définition même d’UCARP permettra à votre réplicat de prendre le relai jusqu’à ce que le maître revienne à la normale.

Ce tutoriel aura pour but de définir comment mettre en place le failover. Pour la synchronisation des données, consultez les tutoriaux appropriés sur notre site ou Internet. Veuillez juste noter que si votre synchronisation est une synchronisation de type maître -> esclave et non maître <-> esclave vous risquez de perdre des données qui se retrouveraient uniquement sur le réplicat lors de la remise en service du serveur maître.

Le principe d’UCARP est le partage d’une adresse IP et adresse MAC sur le réseau. Nous allons ici étudier le principe UCARP sous Debian.

Fonctionnement du protocole

La protocole (U)CARP utilise une surcouche sur la configuration de vos cartes réseau. Il s’incorpore chaque réplicat associé à un service donné.

Toutes les x secondes il va envoyer une trame multicast afin d’avertir qu’il utilise le protocole VRRP/UCARP sur tel ID et tel priorité. cette priorité définit sur un degré de 1 à 255 quel sera le serveur qui répondra avant les autres et sera le réplicat du moment.

Lorsque le serveur maître ou un serveur de plus haute priorité est de retour, le serveur rend alors l’adresse IP à celui-ci, permettant ainsi de garantir la bonne gestion du service.

Configuration du fichier d’interfaces

Ouvrez le fichier /etc/networks/interfaces. Sur notre serveur maître:

iface eth1 inet static
         address 192.168.1.150
         netmask 255.255.255.0
##############################
##### UCARP Configuration #####
ucarp-vid        1
ucarp-vip        192.168.1.250
ucarp-password   unix-experience
ucarp-advskew    1
ucarp-advbase    1
ucarp-master     yes

# Interface Carp en tant qu'alias de eth1
iface eth1:ucarp inet static
         address 192.168.1.250
         netmask 255.255.255.0

Sur notre serveur esclave :

iface eth1 inet static
         address 192.168.1.160
         netmask 255.255.255.0
##############################
##### UCARP Configuration #####
ucarp-vid        1
ucarp-vip        192.168.1.250
ucarp-password   unix-experience
ucarp-advskew    1
ucarp-advbase    2
ucarp-master     no

# Interface Carp en tant qu'alias de eth1
iface eth1:ucarp inet static
         address 192.168.1.250
         netmask 255.255.255.0

Description des champs

vid

L’identifiant Virtual Host ID. C’est un numéro unique utilisé pour identifier le groupe de redondance parmi les autres groupes, et pour distinguer les différents groupes sur un même réseau. Les valeurs acceptables vont de 1 à 255. Elles doivent être identiques sur chacun des membres du groupe.

vip

Virtual IP est l’adresse virtuelle que ce partagerons le maître et l’esclave.

password

Le mot de passe d’authentification à utiliser lors de la communication avec d’autres hôtes CARP dans le même groupe de redondance. Ce mot de passe doit être partagé entre tous les membres du groupe.

advbase

Ce paramètre optionnel spécifie le nombre de secondes qui s’écoule entre chaque annonce CARP. La valeur par défaut est 1 seconde. Les valeurs acceptables sont de 1 à 255.

advskew

Ce paramètre optionnel spécifie le biais à introduire au niveau de advbase lors de l’envoi d’annonces CARP. En manipulant advskew, l’hôte maître CARP peut être choisi. Plus grand est ce nombre, moindres sont les chances pour que l’hôte soit retenu lorsqu’un maître est choisi. La valeur par défaut est 0. Les valeurs acceptables sont de 1 à 254.

Cette configuration est active lors de l’initialisation du réseau au démarrage ou avec la commande “service networking restart”.

Exemple de situation de failover

Soit un serveur maître d’IP 192.168.1.150 et un serveur esclave d’IP 192.168.1.160 et une IP commune en 250.

Si vous avez paramétré comme il faut le protocole, voici ce qu’il devrait se passer sur votre réseau :

tcpdump -i eth0 vrrp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
10:59:25.431354 IP 192.168.1.150 > VRRP.MCAST.NET: VRRPv2, Advertisement, vrid 47, prio 1,
authtype none, intvl 3s, length 36
10:59:28.431354 IP 192.168.1.150 > VRRP.MCAST.NET: VRRPv2, Advertisement, vrid 47, prio 1,
authtype none, intvl 3s, length 36
10:59:31.431354 IP 192.168.1.150 > VRRP.MCAST.NET: VRRPv2, Advertisement, vrid 47, prio 1,
authtype none, intvl 3s, length 36

Une trame de ce type sera envoyée toutes les 3secondes (champ intvl) avec la priorité 1 (priorité maximale) et le vrid 47 (correspondant à l’ID de failover, attention il doit être identique sur le maître et l’esclave).

Ici tout se passe bien la machine maître est en ligne.

Prenons une machine esclave en priorité 10. Le maître tombe à 12h51 et 33sec. Nous avons défini l’intervalle de trame à 3 secondes et le nombre d’essais maximum à 5.

Voici ce qu’il se passera au niveau UCARP à partir de l’esclave.

tcpdump -i eth0 vrrp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:51:25.431354 IP 192.168.1.150 > VRRP.MCAST.NET: VRRPv2, Advertisement, vrid 47, prio 1,
authtype none, intvl 3s, length 36
12:51:28.123456 IP 192.168.1.150 > VRRP.MCAST.NET: VRRPv2, Advertisement, vrid 47, prio 1,
authtype none, intvl 3s, length 36
12:51:31.254789 IP 192.168.1.150 > VRRP.MCAST.NET: VRRPv2, Advertisement, vrid 47, prio 1,
authtype none, intvl 3s, length 36
12:51:49.478946 IP 192.168.1.160 > VRRP.MCAST.NET: VRRPv2, Advertisement, vrid 47, prio 10,
authtype none, intvl 3s, length 36
12:51:52.325894 IP 192.168.1.160 > VRRP.MCAST.NET: VRRPv2, Advertisement, vrid 47, prio 10,
authtype none, intvl 3s, length 36

L’esclave a pris le relai après 5 essais à 3 secondes d’intervalle (soit 15 secondes) plus tard.

Maintenant simulons le retour du maître à 13h01 et 45 sec.

tcpdump -i eth0 vrrp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
13:01:43.478946 IP 192.168.1.160 > VRRP.MCAST.NET: VRRPv2, Advertisement, vrid 47, prio 10,
authtype none, intvl 3s, length 36
13:01:46.325894 IP 192.168.1.160 > VRRP.MCAST.NET: VRRPv2, Advertisement, vrid 47, prio 10,
authtype none, intvl 3s, length 36
13:01:49.431354 IP 192.168.1.150 > VRRP.MCAST.NET: VRRPv2, Advertisement, vrid 47, prio 1,
authtype none, intvl 3s, length 36
13:01:52.123456 IP 192.168.1.150 > VRRP.MCAST.NET: VRRPv2, Advertisement, vrid 47, prio 1,
authtype none, intvl 3s, length 36

Et voilà, désormais vous savez faire du failover via UCARP !

Note: vous pouvez faire du failover en cascade en rajoutant des serveurs avec des priorités différentes

Merci à Olivier Calzi pour cette actualisation