Réplication de systèmes de fichiers avec DRBD
De wikiGite
Tests réalisés sur CentOS 5.5 BlueOnyx
On réplique /home (/dev/mapper/VolGroup00-home). La difficulté réside dans le fait que /home est utilisé par plusieurs services (admserv, http, mysql...) ce qui posera des problèmes au boot.
Note : on va utiliser Postgresql. Mysql est déjà placé dans /home, il faut que Postgres le soit aussi, pour être répliqué.
Voir ici : Déplacement des répertoires PostGreSQL dans /home
Sommaire
Installation
yum install drbd82 kmod-drbd82
DRBD demande soit un volume vierge, dans ce cas il crée ses meta data dedans et monte le volume pour la réplication (meta-disk internal), soit un volume à part, environ 32M pour 1T de partition répliquée (une partition, un volume LVM, un disque externe, un ramdisk même, ce qu'on veut) et dans ce cas on lui donne le chemin (meta-disk /chemin/vers/le/disque/metadata)
Avec LVM : reduire /home d'environ 100M, ajouter une nouveau LV pour les meta data : Gestion LVM.
"meta-disk internal" signifie qu'il utilisera une partie de la partition pour ses meta-data. Il ne doit donc pas y avoir de système de fichier sur la partition (il sera créé après).
Pour répliquer un volume existant, créer une partition à côté pour y mettre les meta-data. Référencer par exemple par "meta-disk /dev/VolGroup00/drbd[0]" pour un volume logique LVM (le [0] indique un index de metadata pour une première partition. On peut réutiliser le même volume en mettant un index [1] pour une seconde partition répliquée, et ainsi de suite).
Paramétrage
/etc/drbd.conf
global { usage-count no; } resource home { protocol C; startup { wfc-timeout 0; # drbd init script will wait infinitely on resources. degr-wfc-timeout 120; # 2 minutes. become-primary-on magiline1.systea.net; # or "both" for multimaster } disk { on-io-error detach; } # or panic, ... net { cram-hmac-alg "sha1"; shared-secret "Cent0Sru!3z"; # don't forget to choose a secret for auth ! max-buffers 2048; #datablock buffers used before writing to disk. ko-count 4; # Peer is dead if this count is exceeded. #on-disconnect reconnect; # Peer disconnected, try to reconnect. } syncer { rate 10M; verify-alg "crc32c"; # Algorythm to tun "drbdadm verify" } on magiline1.systea.net { device /dev/drbd0; disk /dev/VolGroup00/home; address 192.168.1.6:7788; meta-disk internal; } on magiline2.systea.net { device /dev/drbd0; disk /dev/VolGroup00/home; address 192.168.1.7:7788; meta-disk internal; } }
NOTE : Les noms de machines après les "on..." doivent correspondre à ce que retourne "uname -n".
Attention à bien utiliser les noms de devices indiqués par lvdisplay (pas ceux du fstab qui peuvent être des labels, ni ceux du "mount" qui peuvent être différents si LVM est utilisé).
Créer les metadata :
drbdadm create-md home (sur les 2 noeuds)
Démonter la partition si nécessaire. Si le serveur secondaire est prêt, lancer drbd
service srbd start
Il attend son alter ego, lancer drbd sur le second serveur.
Vérifier sur le "primaire" l'état de la partition :
# cat /proc/drbd version: 8.2.6 (api:88/proto:86-88) GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-i386-build, 2008-10-03 11:42:32 0: cs:Connected st:Primary/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 oos:87031808
Il est noté "Inconsistent". On force donc le primaire à se répliquer sur le secondaire ("all" peut être remplacé explicitement par le nom de la ressource à synchroniser)
# drbdadm -- --overwrite-data-of-peer primary all # cat /proc/drbd version: 8.2.6 (api:88/proto:86-88) GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-i386-build, 2008-10-03 11:42:32 0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r--- ns:31876 nr:0 dw:0 dr:32000 al:0 bm:1 lo:0 pe:7 ua:4 ap:0 oos:87000128
[>....................] sync'ed: 0.1% (84961/84992)M finish: 2:15:56 speed: 10,560 (10,560) K/sec
Paramétrage du système
Dans /etc/fstab, remplacer les références à l'ancien volume (ex: /dev/VolGroup00/home) par /dev/drbd0. IMPORTANT : mettre "0 0" à la fin de la ligne, sinon au reboot le système essaie de vérifier /dev/drbd0 (fsck) mais comme drbd n'est pas encore lancé à ce moment, le boot s'arrête en erreur :
/dev/drbd0 : The superblock could not be read...
Comme DRBD n'est pas prêt à la lecture de /etc/fstab, le volume drbd ne monter pas au boot. Il y aura des erreurs aux démarrage des services http, mysql... pendant le boot : tant pis (ou alors, il faut désactiver ces services au démarrage, par chkconfig, ce qui est plus propre).
Donc : mettre "noauto" sur la ligne du fstab concernant cette partition, désactiver le démarrage auto des services (par chkconfig) et ajouter le montage de la partition et le démarrage des services à rc.local. Exemple :
chkconfig admserv off chkconfig httpd off chkconfig mysqld off chkconfig postgresql off
et sur le secondaire on peut ajouter
chkconfig monit off # si monit rest installé chkconfig sendmail off chkconfig saslauthd off
et dans le rc.local du primaire ajouter :
mount /home quotaon -a service admserv start service httpd start service mysqld start service postgresql start
Une fois la synchronisation terminée, il faut décider si il fonctionne en primaire/primaire ou primaire/secondaire.
Dans le premier cas, sur les deux noeuds :
drbdadm primary all
ou dans le second cas, respectivement
drbdadm primary all
sur le premier noeud et
drbdadm primary all
sur le second.
On peut voir l'état de la connexion par
drbdadm cstate all
ou
cat /proc/drbd
Maintenant, on peut monter la partition sur le primaire et travailler dessus. NOTE BO : attention aux quotas sur /home, si la partition LVM a été réduite. Il faut monter d'abord la partition en RO (mount -o ro /home) et recalculer les quotas :
quotacheck -avug
Puis on remonte en RW, et relancer les quotas
quotaon -a
REBOOT
Attention au choix de la partition répliquée. Le volume /dev/drbd0 n'est pas montable au boot (le module drbd n'est pas chargé, et le script d'init n'arrive que tard dans la séquence de boot). Si ce volume est nécessaire au boot, le serveur ne peut donc pas redémarrer !
Voir aussi les considérations sur le paramétrage de /etc/fstab plus haut.
Si la partition de metadatas de drbd est à part, le message "drbd0: Barriers not supported on meta data device - disabling" peut apparaitre au boot : c'est un message informatif qui peut être ignoré.
SWITCH
Pour switcher le serveur secondaire en primaire, si le primaire est arrêté ou HS, appliquer la précédure ci-dessous.
Par contre si le primaire est encore en ligne, qu'on ne peut pas (ou veut pas) l'éteindre pour une raison ou une autre, il faut s'assurer que DRBD sur des deux serveurs est "déconnecté" si on veut passer le secondaire en primaire. Sur les deux serveurs, lancer :
drbdadm down all # "down" means "detach+disconnect"
Pour switcher, rur le secondaire prévoir un script à lancer pour le faire passer en primaire :
drbdadm disconnect all # pour être sûr drbdadm primary all mount /home # ou mount /dev/drbd0 # Pour BlueOnyx spécifiquement : quotaon -a service admserv start service httpd start service mysqld start service postgresql start # si nécessaire
SWITCH OVER ou : le retour
Quand un slave est passé primaire, on ne peut pas simplement relancé l'autre serveur (après dépannage éventuel) et leur redonner leurs rôles. Si on essaie de repasser le slave en secondaire, on a en général :
"Split-Brain detected, dropping connection !"
qui signifie qu'il se considère primaire et refuse la connexion de l'autre serveur. Pour le re-déclarer secondaire, après lancement de drbd (et expiration du délai d'attente) il faut :
drbdadm secondary all drbdadm -- --discard-my-data up all # "up" means "connect+attach"
A ce moment, la connexion est rétablie. Le primaire refait parfois une synchronisation complète (quoique beaucoup plus rapide que la synchro d'origine, il ne fait à priori qu'une vérification) vers le secondaire s'il détecte des différences de blocks.
On peut forcer la vérification par
drbdadm verify all
le "cat /proc/drbd" doit indiquer "cs:VerifyS" au lieu de "cs:Connected" en temps normal.
Si des blocks diffèrent, ils ne sont pas automatiquement synchronisés après un verify. Pour ça, il faut forcer la synchro par :
drbdadm disconnect all drbdadm connect all
TODO
A faire : tester le primaire/primaire pour moins de temps de bascule (les services peuvent-ils être lancés sur le secondaire ?)