Installation et configuration de DRBD

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

DRBD est un systeme permettant de faire du RAID1 logiciel à travers un réseau local.
cela permet par exemple de faire de la haute disponibilité et du partage de ressources sur un cluster sans baie de disque.

Ici nous installerons DRBD8, le but étant par la suite de pouvoir implementer un Filesystem cluster (voir doc sur OCFS2) ce qui n'est pas géré sur DRBD7.
Pour cela nous utilisons les packages DRBD8 des depots debian. Nous travaillerons ici sur un cluster de 2 noeuds.

2 Installation

pour commencer, installer les paquets suivant :

Command aptitude
aptitude install drbd8-utils

Puis nous allons charger le module et le mettre en persistant (pour les prochains reboot) :

Command
modprobe drbd
echo "drbd" >> /etc/modules

3 Configuration

3.1 drbd.conf

Le fichier drbd.conf est plutôt pas mal de base car il permet d'écrire une configuration extensible :

Configuration File /etc/drbd.conf
# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example
 
include "drbd.d/global_common.conf";
include "drbd.d/*.res";

Je n'y ai donc pas touché.

3.2 global_common.conf

Ce fichier est donc le fichier par défaut, qui ne peut contenir des configurations pour vos hosts, mais qui également permet d'avoir une configuration global pour vos différentes configurations DRBD (section common) :

Configuration File /etc/drbd.d/global_common.conf
# Global configuration
global {
    # Do not report statistics usage to LinBit
    usage-count no;
}
 
# All resources inherit the options set in this section
common {
    # C (Synchronous replication protocol)
    protocol C;
 
    startup {
        # Wait for connection timeout (in seconds)
        wfc-timeout 1 ;
        # Wait for connection timeout, if this node was a degraded cluster (in seconds)
        degr-wfc-timeout 1 ;
    }
 
    net {
        # Maximum number of requests to be allocated by DRBD
        max-buffers 8192;
        # The highest number of data blocks between two write barriers
        max-epoch-size 8192;
        # The size of the TCP socket send buffer
        sndbuf-size 512k;
        # How often the I/O subsystem’s controller is forced to process pending I/O requests
        unplug-watermark 8192;
        # The HMAC algorithm to enable peer authentication at all
        cram-hmac-alg sha1;
        # The shared secret used in peer authentication
        shared-secret "xxx";
        # Split brains
        # Split brain, resource is not in the Primary role on any host
        after-sb-0pri disconnect;
        # Split brain, resource is in the Primary role on one host
        after-sb-1pri disconnect;
        # Split brain, resource is in the Primary role on both host
        after-sb-2pri disconnect;
        # Helps to solve the cases when the outcome of the resync decision is incompatible with the current role assignment
        rr-conflict disconnect;
    }
 
    handlers {
        # If the node is primary, degraded and if the local copy of the data is inconsistent
        pri-on-incon-degr "echo Current node is primary, degraded and the local copy of the data is inconsistent | wall ";
    }
 
    disk {
        # The node downgrades the disk status to inconsistent on io errors
        on-io-error pass_on;
        # Disable protecting data if power failure (done by hardware)
        no-disk-barrier;
        # Disable the backing device to support disk flushes
        no-disk-flushes;
        # Do not let write requests drain before write requests of a new reordering domain are issued
        no-disk-drain;
        # Disables the use of disk flushes and barrier BIOs when accessing the meta data device
        no-md-flushes;
    }
 
    syncer {
        # The maximum bandwidth a resource uses for background re-synchronization
        rate 500M;
        # Control how big the hot area (= active set) can get
        al-extents 3833;
    } 
}

J'ai mis en commentaire toutes mes modifications.

3.3 r0.res

Maintenant nous allons créer un fichier pour ajouter notre ressource 0 :

Configuration File /etc/drbd.d/r0.res
resource r0 {
    # Node 1
    on srv1 {
        device       /dev/drbd0;
        # Disk containing the drbd partition
        disk         /dev/mapper/datas-drbd;
        # IP address of this host
        address      192.168.100.1:7788;
        # Store metadata on the same device
        meta-disk    internal;
    }
    # Node 2
    on srv2 {
        device      /dev/drbd0;
        disk        /dev/mapper/lvm-drbd;
        address     192.168.20.4:7788;
        meta-disk   internal;
    }
}

4 Synchronisation

Nous allons avoir besoin de lancer la première synchro maintenant.

Sur les 2 noeuds, lancez cette commande :

Command drbdadm
drbdadm create-md r0

Toujours sur les 2 noeuds, lancez cette commande pour activer la ressource :

Command drbdadm
drbdadm up r0

4.1 Node 1

Nous allons demander au premier node de faire la première réplication bloc par bloc :

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

Il va ensuite falloir attendre la fin de la syncro avant de passer à la suite :

Command cat
> 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:912248 nr:0 dw:0 dr:920640 al:0 bm:55 lo:1 pe:388 ua:2048 ap:0 ep:1 wo:b oos:3283604
        [===>................] sync'ed: 21.9% (3283604/4194304)K
        finish: 1:08:24 speed: 580 (452) K/sec

L'affichage de /proc/drbd permet de voir l'état de réplication. A la fin, vous devriez avoir quelque chose comme ceci :

Command cat
> cat /proc/drbd
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----
    ns:0 nr:4194304 dw:4194304 dr:0 al:0 bm:256 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

4.2 Node 2

Si l'on veut faire du dual master, il faut que cette option soit active dans la configuration :

Configuration File /etc/drbd.d/r0.res
resource <resource>
  startup {
    become-primary-on both;
  }
  net {
    protocol C;
    allow-two-primaries yes;
  }
}

Maintenant nous pouvons activer l'autre noeud en tant que primaire :

Command drbdadm
drbdadm primary r0

Une fois la synchronisation terminée, DRBD est installé et correctement configuré.
Il faut maintenant formater le device /dev/drbd0 avec un system de fichier, par exemple ext3 pour de l'actif/passif ou de l'OCFS2 par exemple si vous voulez de l'actif/actif (il en existe d'autres tel que le GFS2).

Command mkfs
mkfs.ext3 /dev/drbd0

ou

mkfs.ocfs2 /dev/drbd0

Puis montez le volume dans un dossier pour accéder aux données :

Command mount
mount /dev/drbd0 /mnt/data

Seul un noeud primaire peut monter et acceder aux données du volume DRBD.
Lorsque DRBD fonctionne avec HeartBeat en mode CRM, si le noeud primaire tombe, le cluster est capable de basculer le noeud secondaire en primaire.
Lorsque l'ancien primaire est à nouveau "UP" il se synchronisera et deviendra à son tour un secondaire.

5 Utilisation

5.1 Passer en master

Pour passer tous les volumes en primaire :

Command drbdadm
drbdadm primary all

Notes Notes
Remplacez all par le nom de votre volume si vous ne souhaitez opérer que sur un seul

5.2 Passer en slave

Pour passer un volume en slave :

Command drbdadm
drbdadm secondary all

5.3 Synchronisation manuelle

Pour démarrer une synchronisation manuelle (va invalider toutes vos données) :

Command drbdadm
drbdadm invalidate all

Pour faire la même chose mais sur les autres noeuds :

Command drbdadm
drbdadm invalidate_remote all

6 FAQ

6.1 Ma syncro ne fonctionne pas, j'ai : Secondary/Unknown

Si vous avez ce type de message :

Command cat
> cat /proc/drbd
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757 
 0: cs:StandAlone ro:Secondary/Unknown ds:Inconsistent/DUnknown   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:4194304

Il faut que vous vérifiez si les machines sont bien configurées au niveau de vos ressources et également qu'elles arrivent bien à se telnetter (firewalling etc...)

6.2 Que faire en cas de split brain ?

Si vous vous retrouvez dans ce cas de figure :

Command cat
> cat /proc/drbd
primary/unknown

ou

secondary/unknown

1. Démontez les volumes drbd
2. Sur le primaire :

Command drbdadm
drbdadm connect all

3. Sur le secondaire (cela va détruire toutes les données et les réimporter depuis le master)

Command
drbdadm -- --discard-my-data connect all

7 Ressources

Documentation on Heartbeat2 Xen cluster with drbd8 and OCFS2
DRBD 8 3 Third Node Replication
DRBD advanced usages