Nous allons voir dans cet article comment mettre en place une réplication de données en mode block entre plusieurs serveurs.
Le mode de fonctionnement de ce cluster sera "actif/passif".

Nous verrons notamment comment installer, configurer et gérer un cluster DRDB.

Liens utiles :

Sommaire

Présentation

Nous allons mettre en oeuvre DRDB sur 2 serveurs :

  • db1 (192.168.0.1) : le maitre
  • db2 (192.168.0.2) : l'escalve

Nous allons créer deux volumes distincts dans le cluster :

  • r0 : il contiendra les données de MySQL par exemple

Notez que le basculement du point de montage du noeud primaire vers le secondaire et manuel. Si vous souhaitez l'automatiser, vous devez utiliser Corosync / Pacemaker.

Vous pouvez créer autant de ressource que vous le souhaité.

Installation

Création du package

Action à réaliser sur une unique machine qui possède la même version du noyau que vos machines cibles.

Commencez par installer les pré-requis pour compiler DRDB :

aptitude install module-assistant bsdmainutils debhelper dpatch gettext groff-base html2text intltool-debian libcroco3 libmail-sendmail-perl libpipeline1 libsys-hostname-long-perl libunistring0 libxml2 man-db patchutils po-debconf sgml-base xml-core

aptitude install linux-headers-3.2.0-4-amd64  

La version de linux-headers doit matcher avec la version courante de votre noyau (uname -a).

Puis téléchargez les sources de DRDB:

mkdir /usr/src  
git clone git://git.drbd.org/drbd-8.4.git  
cd drbd-8.4  
git checkout  
git fetch  

Enfin, créez le package DRDB :

dpkg-buildpackage -b -uc  

Installation

A faire sur l'ensemble de vos machines (ici db1 et db2).

Copiez les packages précédemment générés puis exécutez les commandes suivantes :

dpkg -i drbd8-module-source_8.4.2-0_all.deb  
dpkg -i drbd8-utils_8.4.2-0_amd64.deb  
module-assistant auto-install drbd8

modprobe drbd  

Enfin, pour vérifier que DRDB est bien installé, lancez les commandes suivantes :

drbdadm -V  
cat /proc/drbd  

Pour finir, intégrez le chargement du module drdb au démarrage de la machine :

nano /etc/modules  

Ajoutez :

drbd  

Configuration

LVM

Nous allons utiliser LVM, sur nos volumes DRDB, c'est pour cela que nous devons modifier la configuration de LVM qui ne prend pas en compte par défaut des volumes DRDB.

nano /etc/lvm/lvm.conf  

Modifiez la ligne suivante :

filter = [ "a|drbd.*|", "r|/dev/vdb|", "r|/dev/disk/*|", "r|/dev/block/*|", "a|.*|" ]  
write_cache_state = 0  

Pour prendre en compte les modifications, exécutez :

update-initramfs -u  
/etc/init.d/lvm2 restart

DRDB

Commencez par éditer la configuration principale de DRDB :

nano /etc/drbd/global_common.conf  

Mettez les paramètres suivants :

global {  
    usage-count no;
    # minor-count dialog-refresh disable-ip-verification
}

common {

    protocol C;

    handlers {
        pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
        pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
        local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
        # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
        # split-brain "/usr/lib/drbd/notify-split-brain.sh root";
        # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
        # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
        # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
    }

    startup {
        degr-wfc-timeout 120;
                outdated-wfc-timeout 60;
    }

    options {

    }

    disk {
        on-io-error   detach;
    }

    net {
        after-sb-0pri discard-least-changes;
                after-sb-1pri discard-secondary;
                after-sb-2pri disconnect;
                ping-timeout 50;
    }

    syncer {
        rate 1000M;
    }
}

Ensuite créez votre ressource :

nano /etc/drbd.d/db.res  

Mettez le contenu suivant :

resource db {  
        device minor 0;
        disk /dev/vdb1;

        disk {
                no-disk-barrier;
                no-disk-flushes;
                al-extents 3389;

        }

        net {
                sndbuf-size 0;
                max-buffers 8000;
                max-epoch-size 8000;
                shared-secret "6XfbLbEAAY-_XJv8UnGt456";
        }

        syncer {
                rate 500M;
                verify-alg md5;
        }

        on db1 {
                address 192.168.0.1:7788;
                meta-disk internal;
        }
        on db2 {
                address 192.168.0.2:7788;
                meta-disk internal;
        }
}

Initialisation du volume

A faire sur l'ensemble des machines

drbdadm create-md db  

A faire uniquement sur la machine primaire (db1)

Lancez les commandes suivantes :

drbdadm -- --overwrite-data-of-peer primary db  
drbdadm primary --force db  

Vous pouvez suivre l'avancement de la création du volume avec la commande :

cat /proc/drbd  

Une fois finie, vous pouvez créer votre volume groupe et vos volumes associées (pvcreate /dev/drdb0).