drbd_logo_small.gifAprès la mise en place de heartbeat le cluster fait correctement basculer un premier service, l'adresse IP, d'un noeud à l'autre. L'objectif ici est de répliquer les données de la partition servant de support à Samba vers le noeud passif. Pour cette fonction nous allons mettre en place DRBD.

DRBD est un produit ayant de nombreuses fonctions. Ce billet se veut très simple et uniquement dédié à une première approche. Au fil du temps les autres billets sur le sujet mettrons en place des fonctions DRBD afin de rendre le produit plus robuste.

Je rappelle que cette solution ne demande rien de plus que deux machines sous Linux, elle est abordable à tous.

DRBD

DRBD travaille au niveau bloc, il est ainsi capable de répliquer via le réseau une partition ou encore un volume logique. Il peut fonctionner en mode synchrone ou asynchrone. Le second mode ne permet pas le temps réel, mais est utile si le lien réseau dispose d'un faible débit.

Le site du projet DRBD est le suivant Site de DRBD

Le périphérique géré par DRBD ne peut être monté que sur le noeud actif. Toutefois en utilisant le système de fichier GFS ou les snapshots de LVM il est possible de monter sur les deux noeuds du cluster le périphérique DRBD. Ce n'est toutefois pas une solution recommandée.

DRBD ne fonctionne qu'avec deux noeuds, toutefois depuis la version 8.3 il est possible de répliquer sur un troisième noeud.

DRBD fournit des scripts compatibles avec la gestion via heartbeat.

La partition qui sera répliquée sera celle supporté par /u01 aussi la retirer du fichier /etc/fstab, car le device pour le montage sera différent et mis en place par heartbeat.

Installer le package des utilitaires drdb

Le module DRBD est intégré au noyau Linux, il suffit juste de charger le package des utilitaires DRBD pour les manipulations

aptitude install drbd-utils

L'installation met en place une configuration standard sous /etc dans un fichier nommé drbd.conf. Fidèle à la philosophie actuelle de séparer dans des fichiers séparés les configuration ce fichier ne contient que des "include"...

J'ai choisi de faire simple pour ce billet aussi dans un premier temps, sauvegarder le fichier original avant d'en créer un nouveau.

mv /etc/drbd.conf drbd.conf.sample
vi /etc/drbd.conf

Voici ce que contient le fichier /etc/drbd.conf pour l'exemple

global {
  usage-count yes;
}
common {
  protocol C;
  syncer {
    rate 9M;
  }
}
resource r0 {
  on debian01 {
    device    /dev/drbd0;
    disk      /dev/sda10;
    address   192.168.1.100:7789;
    meta-disk internal;
  }
  on debian02 {
    device    /dev/drbd0; 
    disk      /dev/sda10;
    address   192.168.1.101:7789;
    meta-disk internal;
  }
}

Important : Ce fichier doit être présent sur les deux noeuds du cluster.

Au sujet de la gestion de la bande passante
La valeur du paramètre rate est exprimée en Mo/sec, si vous êtes en réseau 100Mbit/s, n'allez pas au dessus de 9M, puisqu'il s'agit (environ) de la valeur maximale de débit. La valeur 9M correspond au tiers de ce débit afin de laisser de la bande passante aux utilisateurs. Le tiers de la bande passante est une valeur conseillée sur le site de drbd.

Les protocoles
Ce paramètre configure la manière dont les données sont répliquées.

  • Protocole A : le plus rapide, mais aussi le moins fiable, utilisé surtout en asynchrone, la réplication est jugée faite quand les données sont sur le disque local et dans le tampon d'envoi TCP.
  • Protocole B : la réplication est jugée faite quand les données sont sur le disque local et les données dans le tampon de réception TCP du second serveur.
  • Protocole C : le plus lent, le plus fiable donc à préférer. La réplication est considérée comme terminée quand les données sont écrites sur le second disque.

DRBD utilise la notion de ressource pour définir la partition ou le volume logique à répliquer. Il est possible de répliquer plusieurs ressources avec des protocoles différents.

Il est souhaitable de ne pas avoir de filesystem contenant des données avant la première synchronisation. Si il existe un filesystem avant la mise en place drbd, la commande drbdadm create-md retourne l'erreur suivante :

md_offset 55372546048
  al_offset 55372513280
  bm_offset 55370821632
  
  Found ext3 filesystem which uses 54074756 kB
  current configuration leaves usable 54073068 kB
  
  Device size would be truncated, which
  would corrupt data and result in
  'access beyond end of device' errors.
  You need to either
     * use external meta data (recommended)
     * shrink that filesystem first
     * zero out the device (destroy the filesystem)
  Operation refused.
  
  Command 'drbdmeta /dev/drbd0 v08 /dev/sda10 internal create-md' terminated with exit code 40
  drbdadm aborting

Dans un prochain billet, je présenterais l'utilisation de "external meta data" qui permet de mettre en place DRBD sur des données existantes.

Le plus simple est de mettre à zéro le filesystem ( shrink ) sans oublier de le demonter avant !

Sur le serveur debian01

root@debian01# dd if=/dev/zero bs=1M count=1 of=/dev/sda10

Ou de remplir la partition avec des 0 ( attention c'est long ! )

root@debian01# shred -zvf -n 1 /dev/sda10

Lancer la commande de création de la ressource

 
root@debian01# drbdadm create-md r0

Cette étape peu prendre un peu de temps. Puis lancer les commandes suivantes :

root@debian01# drbdadm attach r0
root@debian01# drbdadm syncer r0
root@debian01#  drbdadm connect r0

Ou plus simplement

root@debian01# drbdadm up r0

Vérifier le fonctionnement via le fichier /proc/drbd qui doit contenir les éléments suivants :

 
root@debian01#  cat /proc/drbd
  
GIT-hash: bb447522fc9a87d0069b7e14f0234911ebdab0f7 build by phil@fat-tyre, 2008-11-12 16:40:33
0: 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

Inconsistent/Inconsistent est l'état normal à ce stade. A partir de maintenant DRDB est correctement configuré, il faut alors lancer la première synchronisation.

Ces étapes sont à faire également sur le second noeud. Dans un premier temps installer le package drbd-utils sur debian02 et recopier le fichier /etc/drbd.conf depuis debian01 vers debian02.

Lancer ensuite sur debian02

root@debian02# shred -zvf -n 1 /dev/sda10
root@debian02# drbdadm create-md r0
root@debian02# drbdadm attach r0
root@debian02# drbdadm syncer r0
root@debian02#  drbdadm connect r0

Il ne reste plus qu'a lancer la commande de synchronisation depuis le noeud principal, et uniquement sur celui-ci :

root@debian01# drbdadm -- --overwrite-data-of-peer primary r0

Suivre la progression de la synchronisation par la commande :

root@debian01# 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
0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r---
  ns:31808 nr:0 dw:0 dr:31808 al:0 bm:1 lo:0 pe:0 ua:0 ap:0
  [>....................] sync'ed:  0.1% (52774/52805)M
  finish: 42:53:23 speed: 340 (320) K/sec
  resync: used:0/61 hits:1986 misses:2 starving:0 dirty:0 changed:2
  act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0

Cette action prend du temps il suffit de taper sur chaque noeud la commande suivante pour accélérer au maximum du débit réseau la synchronisation.

drbdsetup /dev/drbd0 syncer -r 100M

Pour revenir à la configuration courante, une fois les serveurs synchronisés ( sur chaque noeud )

drbdadm adjust r0

Toujours sur le serveur primaire ( debian01 ), formater la partition /dev/drbd0. Ne pas faire cette manipulation sur le serveur secondaire (debian02).

root@debian01# mkfs.ext3 /dev/drbd0

Le montage se fera sous /u01 et doit utiliser /dev/drbd0. Créer donc le point de montage sur les deux serveurs, sauf si vous l'avez déjà fait lors du partitionnement. Attention dans ce cas de bien retirer la ligne du fichier /etc/fstab.

mkdir /u01

Modifier ensuite haresources, cette fois ci sur les 2 noeuds, pour que la partition /dev/drbd0 soit monté sous /u01 par heartbeat

vi /etc/ha.d/haresources
  
debian01 IPaddr2::192.168.1.102 drbddisk::r0 Filesystem::/dev/drbd0::/u01::ext3

Pour tester l'ensemble, redémarrer simplement les deux serveurs. Le serveur primaire doit avoir une commande df -h semblable à celle-ci :

root@debian01# df -h
 
Sys. de fich.         Tail. Occ. Disp. %Occ. Monté sur
/dev/sda3             464M   81M  360M  19% /
tmpfs                 252M     0  252M   0% /lib/init/rw
udev                   10M   96K   10M   1% /dev
tmpfs                 252M     0  252M   0% /dev/shm
/dev/sda1              89M  8,6M   75M  11% /boot
/dev/sda7             9,2G  150M  8,6G   2% /opt
/dev/sda9             942M   18M  877M   2% /tmp
/dev/sda5             4,6G  447M  4,0G  11% /usr
/dev/sda6             4,6G  138M  4,3G   4% /usr/local
/dev/sda8             1,9G  251M  1,5G  15% /var
/dev/drbd0             51G  180M   49G   1% /u01

Et le serveur secondaire :

 
root@debian02# df -h

Sys. de fich.         Tail. Occ. Disp. %Occ. Monté sur
/dev/sda3             464M   81M  360M  19% /
tmpfs                 252M     0  252M   0% /lib/init/rw
udev                   10M   96K   10M   1% /dev
tmpfs                 252M     0  252M   0% /dev/shm
/dev/sda1              89M  8,6M   75M  11% /boot
/dev/sda7             9,2G  150M  8,6G   2% /opt
/dev/sda9             942M   18M  877M   2% /tmp
/dev/sda5             4,6G  447M  4,0G  11% /usr
/dev/sda6             4,6G  138M  4,3G   4% /usr/local
/dev/sda8             1,9G  251M  1,5G  15% /var

Une fois cela validé, redémarrer le serveur primaire et constater que /u01 est bien monté sur le serveur secondaire.

DRBD permet de mettre facilement en place la réplication, y compris de base de données type PostgreSQL ou MySQL sans passer par les fonctions natives du SGBD.

Compte tenu que toute la synchronisation se fait via le réseau, il est sage de dédier une interface réseau ( carte 1Gbits conseillée ) à la réplication DRBD.

Gestion du Split Brain

Il s'agit d'une situation due à une défaillance du réseau entre les deux noeuds du cluster. Chaque noeud tente d'accéder aux ressources DRBD car il pense que l'autre noeud est défaillant. Un message type apparait dans les traces :

Split-Brain detected, dropping connection!

Voici la méthode la plus simple pour gérer ce mode, sur un des noeuds passer les commandes suivantes :

drbdadm secondary r0
drbdadm -- --discard-my-data connect r0

r0 est la ressource définie dans drbd.conf. Cette commande fait passer le noeud en secondaire Sur l'autre noeud du cluster passer la commande suivante :

drbdadm connect r0

Ainsi ce noeud devient primaire.