From 6d54407c4b0af69f5743791a1a3ccf852df99ddc Mon Sep 17 00:00:00 2001 From: Gregory Colpart Date: Tue, 27 Dec 2016 11:50:46 +0100 Subject: [PATCH] migration HowtoDRBD depuis le Trac --- HowtoDRBD.md | 497 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 497 insertions(+) create mode 100644 HowtoDRBD.md diff --git a/HowtoDRBD.md b/HowtoDRBD.md new file mode 100644 index 00000000..8b697fb4 --- /dev/null +++ b/HowtoDRBD.md @@ -0,0 +1,497 @@ +# Howto DRBD + +Cette documentation concerne DRBD 8.3 (Debian 7 ou backports Debian 6) et DRBD 8.9 (Debian 8). + + + + +## Installation + +Debian 8 : + +~~~ +# aptitude install drbd-utils +# modprobe drbd +~~~ + +Debian 7 ou backports Debian 6 : + +~~~ +# aptitude install drbd8-utils +# modprobe drbd +~~~ + + +## À propos des protocoles + +DRBD dispose de 3 protocoles de réplication/synchronisation, A, B et C. + +A : Réplication asynchrone. Les écritures sur le disque local du nœud primaire sont considérées complètes dès que le disque local a fini. Les paquets de réplication sont placés dans le buffer TCP. + +B : Réplication synchronisé en mémoire. Les écritures sur le disque local du nœud primaire sont considérées complètes dès que le disque local a fini *et* que les paquets de réplication sont reçus sur le second nœeud. + +C : Réplication synchronisé sur les disques. Les écritures sur le disque local du nœud primaire sont considérées complètes dès que le disque local a fini *et* sur le disque distant aussi. + +Le protocole C est le plus sécurisé, le B est un compromis entre rapidité et sécurité, et enfin le A est le plus rapide mais le moins sécurisé. + +/!\ Attention, seul le protocole C permet d'utiliser l'option allow-two-primaries. + +La modification du protocole se fait dans la section net{} d'une ressource. Le protocole utilisé par défaut est le protocole C. + +Exemple de configuration. + +~~~ +resource "vol0" { + net { + cram-hmac-alg "sha1"; + shared-secret "123xxx"; + #allow-two-primaries; + protocol A; + } +[…] +~~~ + + +## Configuration d'une ressource en mode Primary/Primary + +La configuration entre 8.3 et supérieur est assez différente. + +### DRBD 8.3 + +Fichier /etc/drbd.conf : + +~~~ +global { usage-count no; } +common { syncer { rate 30M; }} +resource r0 { + protocol C; + startup { + wfc-timeout 15; + degr-wfc-timeout 60; + become-primary-on both; + } + net { + cram-hmac-alg sha1; + shared-secret "mon-secret"; + allow-two-primaries; + after-sb-0pri discard-zero-changes; + after-sb-1pri discard-secondary; + after-sb-2pri disconnect; + } + on kvm1 { + device /dev/drbd0; + disk /dev/sda10; + address 192.168.0.1:7788; + meta-disk internal; + } + on kvm2 { + device /dev/drbd0; + disk /dev/sda10; + address 192.168.0.2:7788; + meta-disk internal; + } +} +~~~ + +Pour éviter les split-brain (incohérence des données), on peut demander à ce qu'un noeud qui n'a plus accès à son peer se "suicide" en ajoutant à la ressource la section : + +~~~ + handlers { + pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; + pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; + local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; + } +~~~ + +A faire sur les deux machines : + +~~~ +# drbdadm create-md r0 +# drbdadm attach r0 +# drbdadm syncer r0 +# /etc/init.d/drbd start +~~~ + +A faire sur une machine, initialiser la synchronisation: + +~~~ +# drbdadm -- --overwrite-data-of-peer primary r0 +~~~ + + +### DRBD 8.9 + +/etc/drbd.d/r0.res : + +~~~ +resource r0 { + net { + protocol C; + cram-hmac-alg "sha1"; + shared-secret "PASSPHRASE"; + allow-two-primaries; + } + volume 0 { + device minor 0; + disk /dev/sda10; + meta-disk internal; + } + on tic { + address 192.168.0.1:7788; + } + on tac { + address 192.168.0.2:7788; + } +} +~~~ + +Note : "tic" et "tac" doivent correspondre aux hostnames réels des machines concernées. + + +Puis sur les 2 machines : + +~~~ +# drbdadm create-md r0 +initializing activity log +NOT initializing bitmap +Writing meta data… +New drbd meta data block successfully created. + +# drbdadm attach r0 +Device '0' is configured! +Command 'drbdmeta 0 v08 /dev/sda10 internal apply-al' terminated with exit code 20 +~~~ + +Et sur l'une des 2 machines : + +~~~ +# drbdadm -- --overwrite-data-of-peer primary r0 +~~~ + + +## Configuration d'une seconde ressource en mode Primary/Primary + +### DRDB 8.3 + +On ajoute la section suivante dans /etc/drbd.conf + +~~~ +resource r1 { + protocol C; + startup { + wfc-timeout 15; + degr-wfc-timeout 60; + become-primary-on both; + } + net { + cram-hmac-alg sha1; + shared-secret "mon-secret"; + allow-two-primaries; + after-sb-0pri discard-zero-changes; + after-sb-1pri discard-secondary; + after-sb-2pri disconnect; + } + on kvm1 { + device /dev/drbd1; + disk /dev/sdb1; + address 192.168.0.4:7790; + meta-disk internal; + } + on kvm2 { + device /dev/drbd1; + disk /dev/sdb1; + address 192.168.0.2:7790; + meta-disk internal; + } +} +~~~ + +Une fois la configuration en place sur tous les serveurs : + +~~~ +# drbdadm create-md r1 +Writing meta data… +initializing activity log +NOT initialized bitmap +New drbd meta data block successfully created. + +# /etc/init.d/drbd reload +Reloading DRBD configuration:. +~~~ + +Sur l'un des 2 serveurs, on lance : + +~~~ +# drbdadm -- --overwrite-data-of-peer primary r1 +~~~ + +Sur l'autre, la synchronisation va se faire, puis on passer en Primary/Primary : + +~~~ +# cat /proc/drbd +version: 8.3.11 (api:88/proto:86-96) +srcversion: F937DCB2E5D83C6CCE4A6C9 + 0: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r----- + ns:97409309 nr:497444091 dw:647985959 dr:195677677 al:59202927 bm:47198 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0 + 1: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r----- + ns:0 nr:2699520 dw:2699520 dr:0 al:0 bm:164 lo:1 pe:6 ua:0 ap:0 ep:1 wo:f oos:2144717528 + [>…] sync'ed: 0.2% (2094448/2097084)Mfinish: 6:20:25 speed: 93,956 (93,084) want: 92,160 K/sec +# drbdadm primary r1 +~~~ + +### DRDB 8.9 + +On peut configurer plusieurs volumes par ressource. + +/etc/drbd.d/r0.res : + +~~~ +resource r0 { + net { + protocol C; + cram-hmac-alg "sha1"; + shared-secret "PASSPHRASE"; + allow-two-primaries; + } + volume 0 { + device minor 0; + disk /dev/sda10; + meta-disk internal; + } + volume 1 { + device minor 1; + disk /dev/sdb1; + meta-disk internal; + } + on tic { + address 192.168.0.1:7788; + } + on tac { + address 192.168.0.2:7788; + } +} +~~~ + +On peut aussi évidemment configurer plusieurs ressources (entre machines différentes, avec un status Primary/Secondary différent, etc.), +dans ce cas on dupliquera simplement la configuration d'une ressource en utilisant des ports réseau différents. + + +## OCFS2 : FS Clusterisé + +Il est nécessaire de disposer d'un FS clusterisé car le FS sera monté à deux endroits différents, ce qui n'est pas possible avec un FS standard tel que ext4. + +##### Installation + +~~~ +# aptitude install ocfs2-tools +~~~ + +Configurer OCFS dans /etc/ocfs2/cluster.conf + +~~~ +node: + ip_port = 7777 + ip_address = 192.168.0.1 + number = 0 + name = kvm1 + cluster = ocfs2 + +node: + ip_port = 7777 + ip_address = 192.168.0.2 + number = 1 + name = kvm2 + cluster = ocfs2 + +cluster: + node_count = 2 + name = ocfs2 +~~~ + +Formater le device drbd0 sur une seule machine. + +~~~ +# mkfs.ocfs2 /dev/drbd/by-res/r0 +~~~ + +Monter la partition sur les deux machines. + +~~~ +# /etc/init.d/o2cb online +# mount /dev/drbd/by-res/r0 /virtualmachines +~~~ + +## Monitoring + +### Munin + +Il peut être intéressant de grapher quelques infos sur drbd dans Munin. On peut utiliser 1 plugin pour cela : + +~~~ +# mkdir -p /usr/local/share/munin/plugins/ +# cd /usr/local/share/munin/plugins/ +# wget +# chmod -R 755 /usr/local/share/munin +# cd /etc/munin/plugins/ +# ln -s /usr/local/share/munin/plugins/drbd . +# cat <> /etc/munin/plugin-conf.d/munin-node +[drbd] +user root +EOT +~~~ + +### Nagios + +Il peut être utile de surveiller l'état de la synchro via Nagios. + + +~~~ +command[check_drbd]=/usr/local/lib/nagios/plugins/check_drbd -d All -c StandAlone +~~~ + + +## FAQ & Tips + +### Récupérer d'une perte de connectivité + +Quand il y a une perte de synchro. On peut y : + +~~~ +drbdadm disconnect all +drbdadm connect all +/etc/init.d/drbd stop && /etc/init.d/drbd start +~~~ + +Ou bien redémarrer le serveur qui a rencontré le soucis. (Perte connexion réseau, bug, …) + +### Récupérer d'un split-brain + +Sur le serveur en Standalone qu'on veut réinitialiser : + +~~~ +# drbdadm secondary r0 +# drbdadm invalidate r0 +# drbdadm disconnect r0 +# drbdadm connect r0 +~~~ + +Sur le serveur "master" + +~~~ +# drbdadm connect r0 +# cat /proc/drbd +version: 8.3.11 (api:88/proto:86-96) +srcversion: F937DCB2E5D83C6CCE4A6C9 + 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----- + ns:98147667 nr:0 dw:118847637 dr:101298287 al:3692894 bm:26045 lo:62 pe:23 ua:54 ap:8 ep:1 wo:f oos:313362256 + [===>…] sync'ed: 23.9% (306016/401760)Mfinish: 0:57:33 speed: 90,716 (88,724) K/sec +~~~ + +Sur le serveur qui était Standalone une fois la synchro terminée : + +~~~ +# drbdadm primary r0 +~~~ + +### Forcer à resynchroniser à nœud de zéro + +Si par exemple on a : + +~~~ +block drbd0: Unrelated data, aborting +~~~ + +Un des serveurs à perdu les méta-données il faut les re-construire pour que drbd se re-synchronise, lors de la création de méta-données les données seront perdues ! Assurez-vous de choisir le bon serveur, celui qui est le plus à jour. + +On peut aussi faire cette opération pour d'autres raisons, comme par exemple un nœud avec des données différentes de chaque côté suite à une désynchronisé trop longue et non détectée. + +~~~ +## Faire un unmount de la partition concerné, puis : +# /etc/init.d/o2cb offline +# drbdadm down r0 +# drbdadm create-md r0 +# drbdadm up r0 +## Si la synchro ne part pas, faire un connect. +# drbdadm connect r0 +## Une fois la synchro terminé (cat /proc/drbd), on le repasse en primaire, pour être en master-master. +# drbdadm primary r0 +# /etc/init.d/o2cb online +~~~ + +### Starting Oracle Cluster File System (OCFS2) mount.ocfs2: Unable to access cluster service while trying initialize cluster + +~~~ +/etc/init.d/o2cb online +/etc/init.d/ocfs2 restart +~~~ + +### Bien comprendre /proc/drbd + +~~~ +0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r----- +~~~ +Le nœud attend une éventuelle reconnexion du second nœud pour se resynchroniser. + +~~~ +0: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown r----- +~~~ +Il s'agit d'un split-brain, le nœud est en standalone, et n'est plus synchronisé avec le second nœud. + + +~~~ +0: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r----- +~~~ +Les nœuds sont bien synchronisés. + + +~~~ +0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----- + ns:782997 nr:8388524 dw:10158853 dr:684557 al:456 bm:562 lo:0 pe:5 ua:64 ap:0 ep:1 wo:f oos:7780060 + [>…] sync'ed: 7.3% (7596/8188)Mfinish: 0:04:29 speed: 28,800 (28,964) K/sec +~~~ + +Une synchronisation du serveur primaire est en cours vers le secondaire. (ro:Primary/Secondary ds:UpToDate/Inconsistent) + +### Reload DRBD + +Si vous modifiez à chaud la conf de DRDB, pensez à reloader : + +~~~ +# /etc/init.d/drbd reload +[ ok ] Reloading drbd configuration (via systemctl): drbd.service. +~~~ + +On peut aussi le faire avec drbdadm adjust all. Ou en précisent le nom de la ressources plutôt que all. + +### Changer le sync rate à la volée + + +~~~ +drbdadm disk-options --c-plan-ahead=20 --resync-rate=20M nomRessource +~~~ + +« plan-ahead » à 20 active un mode intelligent qui permet de prioriser les écritures en cours plutôt que la synchronisation en arrière-plan. + +### Fixer une limite de synchronisation + + +~~~ +resource + disk { + resync-rate 40M; +… + } +… +} +~~~ + +### Supprimer une ressource + +~~~ +# drbdadm disconnect +# drbdadm detach +### OU +# drbdadm down +~~~ + +On pourra ensuite supprimer le fichier de conf associé et reloader drbd.