«

»

Mar 22 2013

[Tuto] HA: DRBD sur Debian 6

Bonjour à tous, dans ce premier tutoriel consacré à la Haute disponibilité (HA) nous allons voir DRBD.

Qu’est-ce que DRBD?

DRBD pour Distributed Replicated Block Device est comparable à un RAID 1 mais en réseau, c’est à dire que deux disques, partitions ou même un LVM peuvent être repliqué d’un disque à un autre via un réseau ethernet ou fibre optique.
Cela permet donc d’assurer la disponibilité de vos données en cas de crash complet d’une machine. Ce que ne permet pas de faire un RAID classique.

Schéma DRBD

Schéma DRBD

Pour ce tuto nous allons donc utiliser deux machines virtuelles sous Debian 6.

Configuration des machines virtuelles

Nous allons donc utiliser deux machines virtuelles avec la configuration suivante:
Machine 1:

  • Hostname: node1
  • Adresse IP: 192.168.10.128
  • Un second disque dur virtuel de 1GO

Machine 2 :

  • Hostname: node2
  • Adresse IP: 192.168.10.129
  • Un second disque dur virtuel de 1GO

Pour les adresses IP vous pouvez mettre celles que vous souhaitez, pour ce tuto j’ai laissée celle que ma fournis le DHCP de VMWare Workstation.

Préparation des disques

Nous allons commencer par créer une partition sur les seconds disques que nous avons rajoutés.
Sur les deux machines tapez les commandes suivantes:

Sur node1

root@node1:~# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x48ef2de4.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-130, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-130, default 130):
Using default value 130

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Sur node2

root@node2:~# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x293cdb74.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-130, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-130, default 130):
Using default value 130

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Maintenant que nous avons partitionnés les deux disques nous allons installer les paquets necéssaires à l’utilisation de DRBD.

Installation et configuration de DRBD

Sur les deux machines (node1 et node2) tapez les commandes suivantes:

apt-get install drbd8-utils

Puis une fois le paquet installé on active le module avec la commande suivante:

modprobe drbd

Vous pouvez vérifier la version de DRBD installée en tapant la commande modinfo drbd
Maintenant que nos disques et DRBD sont mis en place nous allons configurer la réplication des données entre les deux disques.

Pour ce faire nous allons créer et éditer un fichier que nous allons appeler drbd1.res dans le dossier /etc/drbd.d/

Attention les commandes et les configurations suivantes sont à faire sur les deux serveurs.

cd /etc/drbd.d
nano drbd1.res

Puis remplissez le fichier de la façon suivante:

resource r0 {

   # Taux de transfert
   # 10M pour du 100mbits
   # 100M pour du 1Gbits
   syncer {
      rate 10M;
   }

        on node1 {
                device /dev/drbd0;
                disk /dev/sdb1;
                address 192.168.10.128:7788;
                meta-disk internal;
        }
        on node2 {
                device /dev/drbd0;
                disk /dev/sdb1;
                address 192.168.10.129:7788;
                meta-disk internal;
        }
}

Explications:
Tout d’abord on donne un nom à notre ressource DRBD dans notre cas nous allons l’appeler r0.
Dans cette ressource nous allons renseigner nos deux nodes, cela commence donc par on node1 (node1 doit être le hostname de la machine) avec les valeurs suivantes:

device /dev/drbd0; 				#Ceci est le nom du disque DRBD que nous allons créer
disk /dev/sdb1;    				#Ceci est le chemin de la parition que nous allons utiliser
address 192.168.10.128:7788;	#Adresse IP du node1
meta-disk internal;				#On écrit les MD sur le disque

Et on fais la même chose pour node2

Une fois ce fichier écrit sur les deux nodes nous allons enfin pouvoir mettre en place la réplication:

Toujours sur les deux nodes tapez les commandes suivantes:

drbdadm create-md r0
drbdadm up r0

Et voila notre DRBD est pratiquement mis en place vous pouvez vérifier que vos nodes se contactent en tapant la commande suivante:

drbd-overview

Vous devriez avoir cette ligne en sortie:

drbd-overview
  0:r0  Connected Secondary/Secondary Inconsistent/Inconsistent C r----

Cela veut dire que vos nodes se connectent mais que la réplication n’est pas encore possible etant donné qu’aucun des deux n’est en mode Primary, pour y remédier nous allons mettre node1 en primary avec la commande suivante:

root@node1:~# drbdadm -- --overwrite-data-of-peer primary r0

Et node2 en secondary (pas forcement obligatoire de faire ça)

root@node2:~# drbdadm secondary r0

La synchronisation initale se lance vous pouvez vérifier l’état de la synchronisation avec la commande suivante:

root@node1:~# cat /proc/drbd
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----
    ns:9312 nr:0 dw:0 dr:9512 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:1034812
        [>....................] sync'ed:  1.2% (1034812/1044124)K
        finish: 0:43:06 speed: 356 (320) K/sec

La synchronisation initiale peut être plus ou moins lente en fonction de l’espace disque et de la rapidité de votre réseau local.
Vous pouvez suivre la synchronisation avec un rafraîchissement toutes les 2 secondes avec la commande suivante:

watch cat /proc/drbd

Vous aurez ceci en sortie:

Every 2.0s: cat /proc/drbd

version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----
    ns:96416 nr:0 dw:0 dr:96616 al:0 bm:5 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:947708
        [>...................] sync'ed:  9.5% (947708/1044124)K
        finish: 0:44:25 speed: 328 (320) K/sec

Vous pouvez quitter cette vue en faisant CTRL+C

Une fois la synchronisation terminée la commande cat /proc/drbd vous donneras ceci:

root@node1:~# cat /proc/drbd
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
    ns:1044124 nr:0 dw:0 dr:1044324 al:0 bm:64 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

Si les deux sont en mode ds:UpToDate/UpToDate c’est que tout fonctionne bien.

Maintenant que notre raid réseau et fonctionnel nous allons créer un système de fichier en ext4 pour pouvoir écrire dessus.

Tapons la commande suivante sur le node primaire (node1)

root@node1:~# mkfs.ext4 /dev/drbd0

Maintenant nous pouvons monter le disque DRBD comme n’importe quel disque dur

mkdir /mnt/r0
mount /dev/drbd0 /mnt/r0/

Si vous tapez la commande df -h vous pouvez voir que le disque est bien monté.

root@node1:~# df -h

###
/dev/drbd0           1004M   18M  936M   2% /mnt/r0
###

Maintenant nous allons tester notre replication.

Mise en pratique de la replication via DRBD

Pour tester notre replication nous allons télécharger une image iso de Debian sur node1 et voir si la replication se fait sur le node2.

Donc sur node1 nous allons aller dans le dossier /mnt/r0 et télécharger l’ISO de Debian 6

cd /mnt/r0/
wget http://cdimage.debian.org/debian-cd/6.0.7/i386/iso-cd/debian-6.0.7-i386-CD-1.iso

Pendant le téléchargement les paquets téléchargés seront aussi copiés sur node2 étant donné que DRBD est configuré pour faire une copie synchrone des fichiers (Protocol C).

Après le téléchargement, ce que nous pouvons faire maintenant c’est mettre node1 en secondary, de mettre node2 en primary et de monter la partition sur node2.

Sur node1

root@node1:~# umount /mnt/r0
root@node1:~# drbdadm secondary r0
root@node1:~# drbd-overview
  0:r0  Connected Secondary/Secondary UpToDate/UpToDate C r----

On voit donc que maintenant les deux nodes sont en secondary.

Sur node2

root@node2:~# drbdadm primary r0
root@node2:~# mkdir /mnt/r0
root@node2:~# mount /dev/drbd0 /mnt/r0/

Faisons un ls -l dans le dossier /mnt/r0 de node2

root@node2:~# ls -l /mnt/r0/
total 662548
-rw-r--r-- 1 root root 678428672 Feb 23 08:36 debian-6.0.7-i386-CD-1.iso

Nous avons bien notre fichier ISO présent sur le node2.

IMPORTANT: On ne peut monter un disque DRBD que sur le serveur ou il est en primary. Le montage est impossible en secondary.

Si vous tapez la commande drbd-overview quand le disque est monté vous aurez des informations supplémentaires, comme le point de montage et l’espace disque restant.

root@node2:~# drbd-overview
  0:r0  Connected Primary/Secondary UpToDate/UpToDate C r---- /mnt/r0 ext4 1004M 665M 289M 70%

Maintenant nous allons voir comment faire en cas de crash d’un des serveurs.

En cas de crash d’un node

Actuellement node2 est primary est node1 est secondary nous allons éteindre node2 et voir ce qui se passe au niveau de DRBD.
Tout d’abord nous allons éteindre node2

root@node2:~# init 0

Nous allons voir l’état de notre DRBD sur node1

root@node1:~# drbd-overview
  0:r0  WFConnection Secondary/Unknown UpToDate/DUnknown C r----

Il est donc en mode Wait For Connection étant donné que node2 n’est plus joignable.

Nous allons donc remettre node1 en primary pour que nous puissions accéder à nos données:

root@node1:~# drbdadm primary r0
root@node1:~# mount /dev/drbd0 /mnt/r0/
root@node1:~# drbd-overview
  0:r0  WFConnection Primary/Unknown UpToDate/DUnknown C r---- /mnt/r0 ext4 1004M 665M 289M 70%

Nous avons donc de nouveau accès à nos données mais notre raid n’est plus fonctionnel.

Si nous redémarrons node2 DRBD va automatiquement le mettre en secondary et le raid sera de nouveau opérationnel.

#Après le reboot de node2
root@node1:~# drbd-overview
  0:r0  Connected Primary/Secondary UpToDate/UpToDate C r----

Que faire en cas de crash d’un disque dur?

Maintenant nous allons voir quoi faire en cas de crash d’un disque dur sur node2.
Dans VMWare Workstation sans eteindre le node2 supprimez le second disque (Settings -> Disque -> Remove)
Retournez sur le node2 et tapez fdisk -l, vous verrez que le disque /dev/sdb aura disparus.

Sur node1 tapez drbd-overview pour vérifier l’état de DRBD

root@node1:~# drbd-overview
  0:r0  WFConnection Primary/Unknown UpToDate/DUnknown C r----

DRBD est maintenant en attente de connection.

Maintenant toujours sans eteindre le node2 rajoutez de nouveau un disque de 1Go.

Refaites un fdisk -l et vous voyez maintenant qu’un nouveau /dev/sdb est apparus mais celui-ci est non paritionné.

Créez maintenant une partition comme nous l’avons fais tout au début et réactivez DRBD.

root@node2:~# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x293cdb74.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-130, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-130, default 130):
Using default value 130

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Maintenant réactivons DRBD dur node2

root@node2:~# drbdadm create-md r0
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success
root@node2:~# drbdadm up r0

Maintenant sur node1 ou sur node2 tapez drbd-overview et vous verrez que la synchronisation initiale est lancée :)

root@node2:~# drbd-overview
  0:r0  SyncTarget Secondary/Primary Inconsistent/UpToDate C r----
        [>....................] sync'ed:  4.8% (995612/1044124)K

Ou la commande cat /proc/drbd sur le node1

root@node1:~# cat /proc/drbd
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----
    ns:1821820 nr:52 dw:698552 dr:1124820 al:177 bm:171 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:964924
        [>...................] sync'ed:  7.9% (964924/1044124)K
        finish: 0:40:12 speed: 324 (320) K/sec

Une fois la nouvelle synchronisation terminée la commande drbd-overview devrais nous retourner ceci:

root@node1:~# cat /proc/drbd
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
    ns:2786744 nr:52 dw:698552 dr:2089744 al:177 bm:231 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

Maintenant nous allons mettre node1 en secondary et node2 en primary et vérifier si les fichiers sont de retour sur node2.

Sur node1

root@node1:~# umount /mnt/r0
root@node1:~# drbdadm secondary r0
root@node1:~# drbd-overview
  0:r0  Connected Secondary/Secondary UpToDate/UpToDate C r----

Sur node2

root@node2:~# drbd-overview
  0:r0  Connected Secondary/Secondary UpToDate/UpToDate C r----
root@node2:~# drbdadm primary r0
root@node2:~# mount /dev/drbd0 /mnt/r0/
root@node2:~# drbd-overview
  0:r0  Connected Primary/Secondary UpToDate/UpToDate C r---- /mnt/r0 ext4 1004M 665M 289M 70%
root@node2:~# ls -l /mnt/r0/
total 662548
-rw-r--r-- 1 root root 678428672 Feb 23 08:36 debian-6.0.7-i386-CD-1.iso

Nous avons donc bien notre fichier ISO sur le node2, cela veut dire que notre raid réseau à bien été reconstruit et que tout refonctionne comme avant !

Voila ce qui met fin à ce tutoriel sur DRBD.

J’espère que vous aurez trouvé celui-ci intéressant.

(17 commentaires)

2 pings

Passer au formulaire de commentaire

  1. Gerard

    Wow, merci, ça fait 2 jours que je n’étais pas capable de créer le disque r0, j’ai lue plein de site et tu es le seul à donner la solution bravo

    WARNING: DOS-compatible mode is deprecated. It’s strongly recommended to
    switch off the mode (command ‘c’) and change display units to
    sectors (command ‘u’).

  2. YANG

    Bonjour,

    Quelqu’un pourrait m’aider j’ai une version de Débian 7 avec un kernel en 3.19 mais impossible de générer le module drbd

    drbdadm up r0
    DRBD module version: 8.4.5
    userland version: 8.3.13
    you should upgrade your drbd tools!

    No response from the DRBD driver! Is the module loaded?

    J’ai ceci à chaque fois

    Cordialement

    1. Denis

      as tu taper la commande:

      modprobe drbd ?

      1. Moyon

        Bonjour à tous. Quelqu’un aurait trouvé la solution à cette erreur ? Je tombe également dessus…

    2. olivier

      testez LCMC qui est un GUI pour crée et administrer des cluster drbd

      http://lcmc.sourceforge.net/

      ils vous permettra d’installer les outils en version qui sont optimums

  3. Bernard

    Bonjour Denis,
    J’ai installé un cluster à 2 noeuds:
    (node primaire: Bi-Xeon 2.4Ghz, 96Gb Ram, 8HDD (2×500 Raid 1 OS, 2x1To Raid 1 VM, 4x2To Cluster)
    (Node secondaire: Xeon 3,1 Ghz, 32 Gb Ram et même config HDD)
    Les HDD sont sur 2 cartes Raids chacun
    Tout fonctionne parfaitement (Drbd, corosync, pacemaker)
    6 eth par serveur en bonding (3×2)
    + 2 PC (Intel i3 et amd FX 32Gb Ram 4HDD 1 To et 1 SSD 500Go)
    Les serveurs sont installés sous mint-debian, uniquement pour le bureau cinnamon et les PC sous Mint 17.
    J’ai suivi un de tes tutos sur le iSCSI testé sur un PC en target et j’aimerai passer mon cluster en iSCSI ainsi qu’en actif/actif (il est en actif/passif) sans perte de données. Cela est-il possible ? Je recherche un coup de main et je pourrais te mettre à dispo un accès SSH sur mes serveurs.
    Pacemaker gère entre plus de Drbd, Apache, Mysql, Nfs, Snmp et bind
    Pour la petite histoire, j’étais consultant indépendant et suite à de graves pbles de santé, j’ai dû arrêter mon activité et maintenant j’ai tout mon temps pour me consacrer uniquement à l’informatique.
    Cordialement,
    BK

    1. Denis

      Hello Bernard,

      Cela est une belle topologie que tu met en place.

      Concernant iSCSI, il faut savoir qu’un seul Initiator peut se connecter au Target à la fois, ce qui est un peu limitant si tu souhaites connecter plusieurs machines au même target. Pour remédier á cela je te conseil d’utiliser NFS au lieu de iSCSI.

      Si j’ai bien compris la deuxième question, tu souhaites mettre ton cluster DRBD en Actif/Actif? (Primary/Primary), cela est faisable mais pas du tout recommandé, il te faudra reformater tes partitions DRBD dans un système de fichier spécifique (EX: GlusterFS), tu peux voir comment faire cela dans la doc officiel de DRBD:

      http://drbd.linbit.com/users-guide-8.4/s-recent-changes-net.html

      Denis

  4. rhel

    En cas de crash d’un serveur ,est-ce qu’il y a une maniére pour que le serveur actif (primaire) détécte le « fail » de l’autre serveur « secondaire » et monte la partition drbd0 automatiquement ?
    Merci bcp pr le totu

  5. Norbert

    Excellent tuto. Il fonctionne
    parfaitement avec Debian 7
    les partitions doivent être identiques /dev/sdb1 mais uniquement en taille (j’ai essayé avec un primaire en /dev/sdb1 et un secondaire en /dev/sda3)

    Je me sens moins ridicule avec DRDB.
    Merci

    1. Denis

      Hello Norbert,

      merci pour ton commentaire :)

      Effectivement quand je dit partitions identiques c’est en taille, les noms des partitions importent peux.

      Si tu souhaites rendre DRBD plus performant je te conseil de suivre ce tuto pour rajouter HeartBeat a DRBD:

      http://denisrosenkranz.com/tuto-ha-un-cluster-drbdapache-avec-heartbeat-sur-debian-7/

      Denis

  6. Naman

    Bonjour,

    Très bon tuto.
    Par contre j’aurais une question, je suis en train de bosser sur un projet ou il nous faut 4 serveurs, on a suivi le tuto, quand on fait drbd-overview on est en standalone on a juste rajouter deux serveurs à la suite des deux, faut-il faire quelque chose de particulier pour que cela fonctionne, que se soit connecté?

    1. Denis

      Hello Naman,

      DRBD ne fonctionne qu’avec deux serveurs. Tu peux en mettre trois mais dans ce cas le setup devient plus compliqué

  7. noname98

    Bonjour,

    Merci beaucoup pour cet article très clair et pédagogique.

  8. Max

    Salut,

    merci pour l’article.
    Cependant j’ai un probleme, lorsque je reboot le node2, le raid ne redevient pas opérationnel et je continue a avoir ce message

    WFConnection Primary/Unknown UpToDate/DUnknown

    Une idée d’ou peux venir le problème ?

    1. alexandre

      Bonjour,

      J’ai eu le même problème.
      Sur ton node 1:
      ==> drbdadm connect all
      Sur ton node2
      ==> drbdadm — –discard-my-data connect all

      Ensuite fait drbd-overview pour vérifier .
      ça devrait régler ton problème .

      1. Raz

        ta technique ne fonctionne pas , je reste du coup bloquer , impossible de resynchroniséles nodes entre eux.

  9. Seito

    Bonjour Denis,

    Intéressant comme article, par curiosité je testerai sur deux de mes serveurs ^^

    Cordialement,
    Seito

  1. Databases, Systems & Networks » DRBD sur Debian 6

    […] Source: denisrosenkranz.com […]

  2. [Tuto] HA: iSCSI sur Debian 6 » Denis Rosenkranz

    […] « [Tuto] HA: DRBD sur Debian 6 […]

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Lire les articles précédents :
Tux-G2
Non ! Le blog n’est pas mort.

Bonjour à tous, un petit message pour vous avertir que non! mon blog n'est pas mort !

Fermer