Filesystem/RaidOverIP/DRBD

De TartareFR
Aller à la navigation Aller à la recherche

Création d'une partition drbd

Configuration de la ressource

Configuration minimale:

  • Un serveur node1
    • IP: 192.168.0.31
    • Port 7789 ouvert sur le firewall en provenance de node2
  • Un serveur node2
    • IP: 192.168.0.32
    • Port 7789 ouvert sur le firewall en provenance de node1
  • SELinux est soit désactivé, soit configuré pour autoriser DRBD sur les deux serveurs.
  • Le service DRBD est démarré sur les deux noeuds.

Fichier de configuration général <path>/etc/drbd.d/global_common.conf</path>

global {
  usage-count no;
}
common {
  net {
    protocol C;
  }
}

Fichier de configuration de la resource <path>/etc/drbd.d/r0.res</path>

resource r0 {
  on node1 {
    device    /dev/drbd1;
    disk      /dev/sda7;
    address   192.168.0.31:7789;
    meta-disk internal;
  }
  on node2 {
    device    /dev/drbd1;
    disk      /dev/sda7;
    address   192.168.0.32:7789;
    meta-disk internal;
  }
}

Cette configuration créée implicitement un volume dans la ressource, numéroté zéro (0).

Pour configurer plusieurs volume dans la même ressource, la syntaxe est la suivante

resource r0 {
  volume 0 {
    device    /dev/drbd1;
    disk      /dev/sda7;
    meta-disk internal;
  }
  volume 1 {
    device    /dev/drbd2;
    disk      /dev/sda8;
    meta-disk internal;
  }
  on node1 {
    address   192.168.0.31:7789;
  }
  on node2 {
    address   192.168.0.32:7789;
  }
}

Création des metadata du périphérique

# drbdadm create-md r0
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.

Activation de la ressource

# drbdadm up r0

Première synchronisation de la ressource

Il faut forcer un noeud à devenir primaire ( maître )

drbdadm primary --force r0

On peut voir l'avancement de la synchronisation en affichant le fichier <path>/proc/drbd</path>, indifféremment sur l'un ou l'autre noeud.

Ici la synchronisation initiale est encore en cours.

# cat /proc/drbd
version: 8.4.2 (api:1/proto:86-101)
GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by dag@Build64R6, 2012-09-06 08:16:10
 0: cs:SyncSource ro:Secondary/Primary ds:UpToDate/Inconsistent C r-----
    ns:343712 nr:0 dw:0 dr:344120 al:0 bm:20 lo:0 pe:1 ua:1 ap:0 ep:1 wo:f oos:10142364
        [>....................] sync'ed:  3.3% (9904/10236)M
        finish: 0:20:51 speed: 8,084 (6,124) K/sec

Ici elle est terminée

# cat /proc/drbd
version: 8.4.2 (api:1/proto:86-101)
GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by dag@Build64R6, 2012-09-06 08:16:10
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
    ns:10485460 nr:0 dw:0 dr:10485460 al:0 bm:640 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

Tuning

Script de mesure

#!/bin/bash

TEST_RESOURCE=r0
TEST_DEVICE=$(drbdadm sh-dev $TEST_RESOURCE)
TEST_LL_DEVICE=$(drbdadm sh-ll-dev $TEST_RESOURCE)

function wait() {
  read -p "Press enter to continue" dummy
}

function test_troughput() {
  drbdadm primary $TEST_RESOURCE
  for i in $(seq 5); do
    dd if=/dev/zero of=$TEST_DEVICE bs=512M count=1 oflag=direct
  done
  wait
  drbdadm down $TEST_RESOURCE
  wait
  for i in $(seq 5); do
    dd if=/dev/zero of=$TEST_LL_DEVICE bs=512M count=1 oflag=direct
  done
}

function test_latency() {
  drbdadm primary $TEST_RESOURCE
  dd if=/dev/zero of=$TEST_DEVICE bs=512 count=1000 oflag=direct
  wait
  drbdadm down $TEST_RESOURCE
  wait
  dd if=/dev/zero of=$TEST_LL_DEVICE bs=512 count=1000 oflag=direct
}

function help() {
  echo "No valid option"
  echo "Relaunch with -t option to test throughput, or with -l option to test latency"
}

if [ -z $1 ]
then
  help
  exit 1
fi

while getopts "tl" opt
do
  case "${opt}" in
    t)
      test_troughput
      ;;
    l)
      test_latency
      ;;
    *)
      help
      exit 1
  esac
done
exit 0

Mesure du débit

Mesure avec ce script qui écrit plusieurs gros morceaux de données sur la partition DRBD, puis sur la ressource désactivée.

Exemple de retour

536870912 octets (537 MB) copiés, 16,1343 s, 33,3 MB/s
536870912 octets (537 MB) copiés, 15,4267 s, 34,8 MB/s
536870912 octets (537 MB) copiés, 15,1945 s, 35,3 MB/s
536870912 octets (537 MB) copiés, 15,7132 s, 34,2 MB/s
536870912 octets (537 MB) copiés, 15,699 s, 34,2 MB/s

536870912 octets (537 MB) copiés, 2,33985 s, 229 MB/s
536870912 octets (537 MB) copiés, 1,8103 s, 297 MB/s
536870912 octets (537 MB) copiés, 1,90445 s, 282 MB/s
536870912 octets (537 MB) copiés, 1,87613 s, 286 MB/s
536870912 octets (537 MB) copiés, 1,98354 s, 271 MB/s

Mesure du temps de latence

Mesure avec ce script qui écrit 1000 morceaux de 512 octets sur la partition DRBD, puis sur la ressource désactivée. 512 octets est la taille minimale d'un bloc géré par un système Linux.

Il est important de comprendre que le débit mesuré n'est pas du tout pertinent pour ce test. L'important est la durée d'exécution des 1000 écritures. Cette durée divisée par 1000 donne la moyenne du temps de latence pour un secteur de disque.

Exemple de retour

512000 octets (512 kB) copiés, 1,8113 s, 283 kB/s

512000 octets (512 kB) copiés, 0,650322 s, 787 kB/s

Options

Options influençant les performances

  • al-extents: 3389
    Taille de fichier de log des metadata. L'augmenter réduit les I/O du disque.
  • disk-barrier: no
    Cette option spécifie de ne pas utiliser de système de protection de perte de données en cas de coupure de courant. Possible uniquement avec des contrôleurs équipés de batterie ou de baie SAN.
  • disk-flushes: no
    Cette option spécifie de ne pas utiliser de système de protection de perte de données en cas de coupure de courant. Possible uniquement avec des contrôleurs équipés de batterie ou de baie SAN.
  • max-buffers: 8000
    Cette option affecte les performances d'écriture sur le noeud secondaire. cette option est le nombre maximum de buffers alloués à l'écriture.
  • max-epoch-size: 8000
    Cette option affecte les performances d'écriture sur le noeud secondaire. cette option est le nombre maximum de requête d'écriture entre deux synchronisations.
  • sndbuf-size: 512k
    Cette option spécifie la taille du buffer TCP. Peut être augmenter à 512k avec une connexion Gigabit sans problème.
  • cpu-mask: 2
    Masque de CPU. Un masque de 1 (00000001) signifie que DRBD utilisera le CPU 1 uniquement, à contrario, un masque de 12 (00001100) utilisera le CPU 3 et 4.

Autres options

  • usage-count: no
    Spécifier si on veut participer au référencement d'utilisateurs de DRBD.
  • wfc-timeout: 60
    Spécifier le timeout pour l'activation de DRBD sur l'autre noeud.
  • degr-wfc-timeout: 60
    Spécifier le timeout pour l'activation de DRBD sur l'autre noeud en cas de cluster dégradé.
  • outdated-wfc-timeout: 60
    Spécifier le timeout pour l'activation de DRBD sur l'autre noeud en cas de cluster dégradé et de datadir non synchronisé.

Redimensionner une partition drbd

Vu que l'on s'appuie sur une partition lvm pour DRBD, le redimensionnement est possible, mais il faut mettre à jour les META-DATA de la partition après le changement de taille du container lvm.

Agrandissement

Cette opération est faite à chaud : Le service DRBD restera actif.

  1. On redimensionner le container lvm sur les 2 nœuds
    lvresize -L +10G /dev/VolGroup00/LogVol04
  2. On met à jour les META-DATA de la ressource DRBD sur le nœud primaire. r0 est le nom de la ressource DRBD.
    drbdadm resize r0
  3. On augmente enfin la taille du système de fichier
    resize2fs /dev/drbd0

Réduction

Cette opération ne peut pas être exécuter à chaud. La procédure suivante explique le rétrécissement d'un partition de 10Go à 8Go.

On s'assure que rien n'utilise cette partition. On arrête les éventuels services utilisant cette partition.

Warning.png
La partition ne doit plus être utilisé au moment du redimensionnement
On s'assure de ça en lançant
lsof /my/mountpoint

Si la commande précédente affiche des résultats, il faut régler ce problème avant de continuer à dérouler la procédure.

Il ne faut surtout pas forcer le démontage ( option -f de <app>umount</app> )
  1. On commence par démonter la partition.
    umount /my/mountpoint
  2. On lance un check ( forcé ) sur la partition.
    e2fsck -f /dev/drbd0
  3. On réduit le système de fichier plus que nécessaire.
    resize2fs -p /dev/drbd0 7G
    On enlève ici 3Go au système de fichier.
  4. On désactive notre ressource DRBD.
    drbdadm down r0:
  5. Sur chaque nœud, on sauvegarde les META-DATA dans un fichiers texte. Ce fichier ne peut pas être partagé par les noeuds
    drbdadm dump-md r0 > /tmp/metadata
    Exporter les META-DATA d'un noeud et simplement le copier sur les autres nœuds ne fonctionne pas.
  6. Sur chaque nœud, on redimensionner le container LVM.
    lvresize -L -2G /dev/VolGroup00/LogVol04
    On enlève donc 2Mo au container LVM.
  7. Sur chaque nœud, on agrandit le système de fichier pour qu'il occupe tout l'espace du container.
    resize2fs /dev/drbd0
  8. Sur chaque nœud, Ajustement des informations de taille (la-size-sect) dans le fichier de sauvegarde des META-DATA. Le paramètre la-size-sect doit être spécifier en secteurs
  9. Sur chaque nœud, Re-initialisation des META-DATA
    drbdadm create-md resource
  10. Sur chaque nœud, Import des META-DATA corrigés
    drbdmeta_cmd=$(drbdadm -d dump-md r0);${drbdmeta_cmd/dump-md/restore-md} /tmp/metadata
  11. On réactive notre ressource DRBD.
    drbdadm up r0