Pour mettre cela en oeuvre, nous allons partir d'une Debian Lenny installée avec les éléments de base, puis nous allons utiliser DRBD un module du noyau qui effectue la réplication, puis Hearbeat qui permet le basculement d'un serveur à l'autre en cas de panne.
Il y a néanmoins plusieurs pré-requis à prendre à compte:

  • Les 2 serveurs doivent être relié au travers d'une liaison 1Gb
  • Si possible être relié en direct sans passer par un switch
  • Si possible au travers d'un carte réseau dédiées
  • Les partitions utilisées pour l'espace disque sur les 2 serveurs doivent être identiques, même si les serveurs sont des modèles ou des marques différentes.


Une petite précision pour les serveurs OVH, cette procédure ne peut pas s'appliquer à vos serveurs car le noyau Linux n'est pas celui fourni par Debian, du coup, les paquets ne s'installent pas correctement au niveau des modules du noyau. Dans un très prochain billet, une procédure d'installation sera publiée.

Démarrons la mise en place d'un cluster Maître/Esclave. Pour cela, définition la répartition des adresses IP:

  • 192.168.198.128 : Serveur maître
  • 192.168.198.130 : Serveur esclave
  • 192.168.198.125 : Adresse publique

Le nom des serveurs doit être connu et bien définit, pour cela il faut les vérifier avec la commande

# uname -n

Pour modifier à votre convenance, modifiez le fichier /etc/hostname, puis redémarrez le serveur.

Installation de Heartbeat

# apt-get install heartbeat chkconfig

Heartbeat not configured: /etc/ha.d/ha.cf not found.
 Heartbeat failure [rc=1]. Failed.

L'erreur est normale.

Configuration de Heartbeat sur le serveur Maître : /etc/ha.d/ha.cf

ucast eth0 192.168.198.130

debugfile /var/log/ha.debug
logfile /var/log/ha.log
logfacility local0

# délai entre deux battements de pouls
keepalive 2
# temps nécessaire avant de considérer un noeud comme étant mort
deadtime 10
# délai avant d'envoyer un avertissement pour les pouls en retard
warntime 6
# deadtime spécifique pour les configurations où le réseau met un certain temps à démarrer
initdead 60

# port à utiliser pour la prise de pouls
udpport 694

# uname -n pour connaitre le nom des 2 serveurs
node debian-master
node debian-slave

# met la valeur on, lorsque le node maître revient dans le cluster, tout est transféré sur ce dernier
auto_failback off

Configuration de Heartbeat sur le serveur Esclave : /etc/ha.d/ha.cf

ucast eth0 192.168.198.128

debugfile /var/log/ha.debug
logfile /var/log/ha.log
logfacility local0

# délai entre deux battements de pouls
keepalive 2
# temps nécessaire avant de considérer un noeud comme étant mort
deadtime 10
# délai avant d'envoyer un avertissement pour les pouls en retard
warntime 6
# deadtime spécifique pour les configurations où le réseau met un certain temps à démarrer
initdead 60

# port à utiliser pour la prise de pouls
udpport 694

# uname -n pour connaitre le nom des 2 serveurs
node debian_master
node debian_slave

# met la valeur on, lorsque le node maître revient dans le cluster, tout est transféré sur ce dernier
auto_failback off

Dans notre cas, il est préférable d'utiliser auto_failback off pour éviter que le Maitre ne reprenne le contrôle sur l'Esclave alors que la stabilité n'est pas avérée. Par exemple, si le Maître redémarre de manière intempestive (problème électrique, de processeur ou de barrettes mémoires), il se récupérera le titre de maître et si les défaillances persistes, la fonction cluster sera cassée au bout de quelques transferts rapprochés. Une fois les serveur Maître stabilisé, ce sera à nous de restituer, à la main, les rôles correctement.

Définition des adresses publiques, sur les 2 serveurs, dans le fichier /etc/ha.d/haresources

debian-master IPaddr::192.168.198.125

Dans ce fichier de configuration, les commandes à exécuter sont regroupées dans l'ordre d'exécution. Ces commandes sont séparées par un espace.

Si nous ne sommes pas dans un environnement sécurisé, à minima, nous pouvons mettre en place une authentification pas échange de clés. Dans le fichier /etc/ha.d/authkeys:

auth 2
1 md5 "Mot de passe - cluster debian"
2 crc

Le mot de passe doit bien évidemment être changé. Puis on protège les accès à ce fichier:

# chmod 600 /etc/ha.d/authkeys

Maintenant, on démarre le deamon:

# /etc/init.d/heartbeat start

Nous allons effectuer quelques tests pour vérifier que cela fonctionne bien:

  • Se connecter en SSH sur l'adresse IP publique
  • Exécuter uname -n afin de vérifier que le nom du serveur est bien Debian-master
  • Couper le serveur maître (arrêt du serveur, coupure électrique ou coupure de l'interface réseau)
  • La fenêtre SSH ne doit plus répondre
  • Se reconnecter en SSH sur l'adresse IP publique
  • Exécuter uname -n afin de vérifier que le nom du serveur est bien Debian-slave <- ceci indique que lorsqu'une coupure du serveur maître survient le serveur esclave prend bien le relais
  • Relancer le serveur maître (ou réactiver l'interface réseau)
  • Sur le serveur Esclave, exécuter etc/init.d/heartbeat restar afin de rendre la main au serveur Maître
  • La fenêtre SSH ne doit plus répondre
  • Se reconnecter en SSH sur l'adresse IP publique
  • Exécuter uname -n afin de vérifier que le nom du serveur est bien Debian-master <- ceci indique que l'on rend bien la main au serveur Maître

Mise en place de réplication avec DRBD

Nous devons commencer par créer les partitions de réplication sur les 2 serveurs, pour vérifier les partitions disponibles:

# fdisk -l

La taille des partitions doit être identique.

Création des partitions (exemple avec la partition sdb disponible):

# cfdisk /dev/sdb

(taille de votre choix, type Linux, no bootable)

Formatage des partitions:

# mkfs.ext3 /dev/sdb1


Installation de DRBD

# apt-get install drbd8-modules-2.6-686 drbd8-utils

(le module est à adapter en fonction de la version du kernet utilisé)

Convertion des partitions pour convenir à DRBD

# dd if=/dev/zero bs=1M count=1 of=/dev/sdb1; sync
1+0 enregistrements lus
1+0 enregistrements écrits
1048576 bytes (1,0 MB) copied, 0,0433103 s, 24,2 MB/s

Modification des propriétaires pour les fichiers de configuration:

# chgrp haclient /sbin/drbdsetup
# chmod o-x /sbin/drbdsetup
# chmod u+s /sbin/drbdsetup

# chgrp haclient /sbin/drbdmeta
# chmod o-x /sbin/drbdmeta
# chmod u+s /sbin/drbdmeta

Création des metadata

# drbdadm create-md r0
Writing meta data...
initialising activity log
NOT initialized bitmap
New drbd meta data block sucessfully created.

Association de la ressource avec les devices

# drbdadm attach r0

Mise en place des paramètres de synchronisation

# drbdadm syncer r0

Connection entre les serveurs

# drbdadm connect r0

Afficher l'état du cluster

# cat /proc/drbd
version: 8.0.14 (api:86/proto:86)
GIT-hash: bb447522fc9a87d0069b7e14f0234911ebdab0f7 build by phil@fat-tyre, 2008-11-12 16:40:33

 1: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r---
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
        resync: used:0/61 hits:0 misses:0 starving:0 dirty:0 changed:0
        act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0

A partir de maintenant nous ne travaillons que sur le serveur principal (debian-master).

Initialisation de la synchronisation (à réaliser uniquement sur le serveur principal)

# drbdadm -- --overwrite-data-of-peer primary r0

La synchronisation entre les serveurs commence, pour vérifier, il suffit de regarder l'état du cluster

# cat /proc/drbd
version: 8.3.0 (api:88/proto:86-89)
GIT-hash: bb447522fc9a87d0069b7e14f0234911ebdab0f7 build by phil@fat-tyre, 2008-11-12 16:40:33
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---
    ns:65536 nr:0 dw:0 dr:65536 al:0 bm:3 lo:65 pe:0 ua:64 ap:0 ep:1 wo:b oos:621896016
        [>....................] sync'ed:  0.1% (607320/607384)M
        finish: 7:54:00 speed: 21,844 (21,844) K/sec

Notez à la dernière ligne, elle indique le temps restant à l'achèvement de la synchronisation.

A partir de ce moment, les données sont déposées simultanément sur les 2 serveurs.

Formatage de la nouvelle partition, inutile d'attendre la fin de la synchronisation:

# mkfs.ext3 /dev/drbd1

Montage automatique de la partition DRBD avec Heartbeat

Nous allons créer un point de montage pour la partition DRBD dans le dossier /cluster sur les 2 serveurs.

# mkdir /cluster

Configuration de Heartbeat sur les 2 serveurs, dans le fichier /etc/ha.d/haresources nous devons avoir ceci:

debian-master IPaddr::192.168.198.125 drbddisk::r0 Filesystem::/dev/drbd0::/cluster::ext3

Vous avez maintenant un cluster Haute Disponibilité sous la main, placez dans le dossier /cluster tous les éléments qui doivent être partagés entre les 2 serveurs.