Translation(s): English - Français


Ancien article créer initialement avec la version 8.3.7 de drbd, la version actuelle sous Debian Jessie est la version 8.9.2rc1, mais les commandes sont les mêmes.

Le périphérique de bloc répliqué distribué (Distributed Replicated Block Device - DRBD) est un système de stockage distribué sur plusieurs hôtes différents comme un RAID 1 en réseau. Les données sont répliquées sous le système de fichiers au niveau du bloc sur TCP/IP.

Une configuration DRBD correcte, en particulier dans les environnements HA avec Pacemaker, etc., requiert une configuration plus complexe que celle décrite ici. Veuillez consulter les guides appropriés. L'exemple suivant n'est rien de plus qu'un "Hello World". Assurez-vous d'utiliser des versions drbd identiques sur tous les noeuds.

Préparation du système Debian

La partie du module de DRBD est livrée avec les noyaux Debian, mais les outils d'espace utilisateur et les fichiers de configuration sont fournis avec le paquet drbd8-utils.

apt-get install drbd8-utils

Préparer des blocs physiques simulés

Je n'avais pas d'espace vide sur mon disque, donc j'ai créé un périphérique de bouclage (loopback) sur chaque nœud. Je n'ai pas trouvé un moyen approprié de configurer des fichiers en loopback pendant le processus de démarrage (peut-être via les règles udev?) [0]. Cette configuration n'est bien sûr pas adapté à la production, l'utilisation de dispositifs de loopback, il n'est pas recommandé en raison de problèmes de blocage. [1] Si vous avez de l'espace, utilisez une partition physique ou LVM sauvegardée. Simulation sur une partition virtuelle de 1GB.

# dd if=/dev/zero of=drbd.testimage bs=1024k count=1024
# losetup /dev/loop1 drbd.testimage

Création de la ressource DrBd

Créer un fichier avec l’extension .res dans le répertoire /etc/drbd.d/ avec le contenue suivant : NOTE : Le nom de l’hôte (hostname) doit être identique au nom du noeud !

# cat drbd-demo.res 
resource drbddemo {
  meta-disk internal;
  device /dev/drbd1;
  syncer {
    verify-alg sha1;
  }
  net {
    allow-two-primaries;
  }
  on node1 {
    disk /dev/loop1;
    address 192.168.1.101:7789;
  }
  on node2 {
    disk /dev/loop1;
    address 192.168.1.102:7789;
  }
}

Les images loopback et la configuration doivent être créées sur les deux nœuds. L'initialisation doit aussi être effectuée sur les deux nœuds.

#drbdadm create-md drbddemo

Mise en lige de la ressource

Sur le nœud "node1"

# uname -n
node1
# modprobe drbd
# drbdadm up drbddemo
# cat /proc/drbd
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757 

 1: cs:WFConnection ro:Secondary/Unknown ds:Inconsistent/DUnknown C r----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:1048508

Sur le nœud "node2"

Faire de node2 le nœud principal:

# uname -n
node2
#  
# modprobe drbd
# drbdadm up drbddemo
# drbdadm -- --overwrite-data-of-peer primary drbddemo
# cat /proc/drbd 
version: 8.3.11 (api:88/proto:86-96)
srcversion: 2D876214BAAD53B31ADC1D6 

 1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:4176 nr:0 dw:0 dr:9616 al:0 bm:0 lo:2 pe:0 ua:0 ap:0 ep:1 wo:f oos:1048508
        [>....................] sync'ed:  0.4% (1048508/1048508)K
        finish: 0:43:41 speed: 0 (0) K/sec

Maintenant nous devrions avoir le périphérique /dev/drbd1 en marche.

Stocker des données d’exemple

Créons un système de fichiers sur ce périphérique de bloc et y mettons des données.

# mkfs.xfs /dev/drbd1
meta-data=/dev/drbd1             isize=256    agcount=4, agsize=65532 blks
         =                       sectsz=512   attr=2, projid32bit=0
data     =                       bsize=4096   blocks=262127, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =Internes Protokoll     bsize=4096   blocks=1200, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =keine                  extsz=4096   blocks=0, rtextents=0

# mount /dev/drbd1 /mnt
cat <<-END > /mnt/mon_fichier_de_test
> drbd demo (Il n'est pas écrit drbd ;-) )
> END

Sur l'autre nœud, vous devriez obtenir un avertissement lorsque vous essayez de monter /dev/drbd1. Cela n'est possible qu'en mode lecture seule. Vous ne pouvez pas monter la ressource sur le nœud node1.

J'ai également éteint le nœud secondaire et mis beaucoup plus de données sur le primaire. Après le redémarrage du nœud de sauvegarde (montage de l'image loopback et redémarrage du service drbd service drbd restart), le processus de synchronisation a démarré immédiatement. Vous pouvez vérifier cela avec un simple watch cat /proc/drbd.

Inverser la ressource (node2 -> node1)

Voici comment inverser le mode primaire / secondaire entre les deux nœuds.

Sur le noeud node2 :

umount /mnt
drbdadm secondary drbddemo

Sur le noeud node1 :

drbdadm primary drbddemo
mount /dev/drbd1 /mnt

Pièges

J'ai essayé la version 8.3.7 de stable avec la version 8.3.11 de backports stables sur l'autre nœud. Le résultat a été une défaillance de protocole (drbd_send_block () a échoué) et un système qui ne répond pas à cause de tentatives de reconnexion sans fin. Dans ce cas particulier, j'ai utilisé squeeze-stable sur la cible et squeeze-backports sur la source.

Après avoir redémarré le noeud source avec le noyau expédié stable, le processus de synchronisation a démarré immédiatement.

# cat /proc/drbd 
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757 

 1: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r----
    ns:0 nr:284320 dw:284320 dr:0 al:0 bm:17 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:764188
        [====>...............] sync'ed: 27.4% (764188/1048508)K
        finish: 0:15:55 speed: 416 (320) K/sec

Finalement, j'ai porté les deux noeuds sur les dépôts stable-backport et tout a fonctionné comme il faut.

Références

Notes

  1. (HS) http://wiki.vps.net/os-related-issues/setting-up-drbd-with-loopback-devices-and-heartbeat-on-vps-net-ubuntu/

  2. (en) http://www.drbd.org/users-guide/ch-configure.html


CategoryHardware | CategorySystemAdministration | CategoryStorage | CategoryNetwork