--- title: Howto DRBD --- * Documentation : ## Installation ~~~ # aptitude install drbd-utils ~~~ ~~~ # drbdadm -V DRBDADM_BUILDTAG=GIT-hash:\ 5474c321d80250cc61d851220503fdc739490ce9\ build\ by\ pbuilder@marvin\,\ 2016-01-04\ 12:36:34 DRBDADM_API_VERSION=1 DRBD_KERNEL_VERSION_CODE=0x080403 DRBDADM_VERSION_CODE=0x080902 DRBDADM_VERSION=8.9.2rc1 # modinfo drbd filename: /lib/modules/3.16.0-4-amd64/kernel/drivers/block/drbd/drbd.ko alias: block-major-147-* license: GPL version: 8.4.3 description: drbd - Distributed Replicated Block Device v8.4.3 author: Philipp Reisner , Lars Ellenberg srcversion: 1A9F77B1CA5FF92235C2213 depends: lru_cache,libcrc32c intree: Y vermagic: 3.16.0-4-amd64 SMP mod_unload modversions parm: minor_count:Approximate number of drbd devices (1-255) (uint) parm: disable_sendpage:bool parm: allow_oos:DONT USE! (bool) parm: proc_details:int parm: usermode_helper:string ~~~ ## À 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 `/etc/drbd.d/r0.res` : ~~~ resource r0 { net { protocol C; cram-hmac-alg "sha1"; shared-secret "PASSWORD"; allow-two-primaries; } volume 0 { device minor 0; disk /dev/sda10; meta-disk internal; } on tic { address 192.0.2.1:7788; } on tac { address 192.0.2.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 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.0.2.1:7788; } on tac { address 192.0.2.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.0.2.1 number = 0 name = kvm1 cluster = ocfs2 node: ip_port = 7777 ip_address = 192.0.2.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.