Continuité de service : créer un cluster de machines avec Heartbeat et DRBD
<< | Index | HeartBeat >>
Mirroring avec DRBD (RAID 1 Over IP)
Configurer DRBD
Le fichier de configuration à modifier est le suivant :
/etc/drbd.conf
global {
usage-count no;
}
common {
protocol C;
handlers {
out-of-sync "echo Désynchronisation des serveurs, vérifier les logs | mail -s '[DRBD alert] out-of-sync' user@domain.fr";
# This handler is called if the node is primary, degraded and if the local copy of the data is inconsistent.
pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";
# The node is currently primary, but lost the after split brain auto recovery procedure. As as consequence, it should be abandoned.
pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";
# DRBD got an IO error from the local IO subsystem.
local-io-error "echo o > /proc/sysrq-trigger ; halt -f";
# This handler is called in case the node needs to outdate the peer’s disk.
outdate-peer "/usr/sbin/drbd-peer-outdater";
}
syncer {
rate 10M; # Débit de la synchronisation
al-extents 257;
}
}
resource r0 {
startup {
wfc-timeout 120;
degr-wfc-timeout 60;
}
disk {
on-io-error detach;
}
on server1 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.0.11:7791;
meta-disk internal;
}
on server2 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.0.12:7791;
meta-disk internal;
}
}
Pensez à ouvrir les ports utilisés par
DRBD dans le fichier
iptables :
-A RH-Firewall-1-INPUT -m udp -p udp --dport 7791 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 7791 -j ACCEPT
Initialisation des meta-data sur la ressource r0
Note : les actions à réaliser sur les serveurs sont notées de la manière suivante :
- 12 : action à réaliser sur les 2 serveurs
- 1 : action à réaliser sur le serveur 1
- 2 : action à réaliser sur le serveur 2
Formatage des disques 12
# mkfs.ext3 /dev/sdb1
Création des meta-data 12
# drbdadm create-md r0
NB : si vous rencontrez des pb pour créer la ressource tapez la commande suivante (en remplaçant
sdb1 par votre partition)
# dd if=/dev/zero bs=1M count=1 of=/dev/sdb1; sync
Consulter l'état des ressources DRBD 12
# cat /proc/drbd
version: 8.0.6 (api:86/proto:86)
SVN Revision: 3048 build by buildsvn@c5-x8664-build, 2007-12-08 01:01:10
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/31 hits:0 misses:0 starving:0 dirty:0 changed:0
act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
Synchronisation sur le primaire vers le secondaire 1
Pour cette opération il peut-être utile d'augmenter temporairement le débit de la synchronisation.
Pour cela dans
/etc/drbd.conf, remplacer la ligne
rate 10M;
par
rate 100M;
.
Pour prendre en compte la modification de la configuration, tapez la commande suivante :
# drbdadm adjust r0
Pour lancer la synchonisation des données :
# drbdadm -- --overwrite-data-of-peer primary all
NB : N'oubliez pas de réinitialiser le débit de la synchronisation à celui par défaut pour éviter de surcharger le réseau.
Visualisation de la progression de la synchronisation 1
# cat /proc/drbd
version: 8.0.6 (api:86/proto:86)
SVN Revision: 3048 build by buildsvn@c5-x8664-build, 2007-12-08 01:01:10
0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r---
ns:152628 nr:0 dw:0 dr:159744 al:0 bm:8 lo:16 pe:261 ua:238 ap:0
[>...................] sync'ed: 0.2% (76149/76290)M
finish: 0:18:00 speed: 72,144 (72,144) K/sec
resync: used:1/31 hits:9506 misses:10 starving:0 dirty:0 changed:10
act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
NB : à noter ici le débit ridicule de la synchro malgré une liaison Gigabit et la configuration 'normale' du débit dans /etc/drbd.conf >
à investiguer
Résultat de la synchronisation
# cat /proc/drbd
(sur le
primary)
[...] 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r--- [...]
# cat /proc/drbd
(sur le
secondary)
[...] 0: cs:Connected st:Secondary/Primary ds:UpToDate/UpToDate C r--- [...]
Important
A partir de cette étape il faudra toujours passer par le périphérique DRBD (
/dev/drbd0 dans notre cas)
pour monter la partition mirroir et en modifier les données.
Si vous arrêtez le service DRBD sur les 2 machines et que vous montez votre partition sans tenir compte de DRBD (
mount /dev/sdb1 /mnt/rep), les données seront corrompues et DRBD ne s'en rendra pas compte même après redémarrage du service (d'après mes tests) !
Pour monter la partition à la main :
@@# mount /dev/debd0 /mnt/mirroir
Conclusion
Avant de modifier les fichiers d'un serveur secondaire il faut d'abord le basculer en primaire puis ensuite monter la partition mirroir (
mount /dev/drbd0 /mnt/rep).
Simulation de crash du primary
Sur le serveur 1 (actuellement
primary) :
# /sbin/shutdown -h now
Passage du serveur 2 en
primary :
# drbdsetup /dev/drbd0 primary
# cat /proc/drbd
[...] 0: cs:WFConnection st:Primary/Unknown ds:UpToDate/DUnknown C r--- [...]
On monte la partition et on crée un fichier dessus pour tester le comportement lorsque le serveur redémarrera.
On démonte la partition (heartbeat n'étant pas encore configuré avec drbd ce n'est pas automatique).
On démarre le serveur 1 qu'on vient d'arrêter pour tester (on attend qu'il soit complètement redémarré).
DRBD resynchronise automatiquement les données du serveur 2 vers le serveur 1.
On repasse le serveur 2 en
secondary :
# /sbin/drbdsetup /dev/drbd0 secondary
# cat /proc/drbd
[...] 0: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r--- [...]
On repasse le serveur 1 en
primary :
# /sbin/drbdsetup /dev/drbd0 primary
# cat /proc/drbd
[...] 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r--- [...]
Le serveur 1 est de nouveau primaire et synchronisé.
Simulation d'une coupure réseau
On débranche la prise
RJ45 du serveur 1.
Statut du serveur 2 :
[...] 0: cs:WFConnection st:Secondary/Unknown ds:UpToDate/DUnknown C r--- [...]
Statut du serveur 2 après avoir rebranché la prise :
[...] 0: cs:Connected st:Secondary/Primary ds:UpToDate/UpToDate C r--- [...]
Simulation d'un reboot du primary
Statut du serveur 1 :
# /sbin/shutdown -r now
Au redémarrage les deux serveurs sont en
secondary.
On repasse le serveur 1 en
primary :
# /sbin/drbdsetup /dev/drbd0 primary
# cat /proc/drbd
[...] 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r--- [...]
<< | Index | HeartBeat >>