Filesystem/RaidOverIP/DRBD
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.
- On redimensionner le container lvm sur les 2 nœuds
lvresize -L +10G /dev/VolGroup00/LogVol04
- 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
- 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.
- On commence par démonter la partition.
umount /my/mountpoint
- On lance un check ( forcé ) sur la partition.
e2fsck -f /dev/drbd0
- 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. - On désactive notre ressource DRBD.
drbdadm down r0:
- 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. - Sur chaque nœud, on redimensionner le container LVM.
lvresize -L -2G /dev/VolGroup00/LogVol04
On enlève donc 2Mo au container LVM. - Sur chaque nœud, on agrandit le système de fichier pour qu'il occupe tout l'espace du container.
resize2fs /dev/drbd0
- 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
- Sur chaque nœud, Re-initialisation des META-DATA
drbdadm create-md resource
- 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 - On réactive notre ressource DRBD.
drbdadm up r0