migration HowtoDRBD depuis le Trac
This commit is contained in:
parent
b08ce79916
commit
6d54407c4b
497
HowtoDRBD.md
Normal file
497
HowtoDRBD.md
Normal file
|
@ -0,0 +1,497 @@
|
||||||
|
# Howto DRBD
|
||||||
|
|
||||||
|
Cette documentation concerne DRBD 8.3 (Debian 7 ou backports Debian 6) et DRBD 8.9 (Debian 8).
|
||||||
|
|
||||||
|
<http://drbd.linbit.com/users-guide/>
|
||||||
|
<http://drbd.linbit.com/users-guide-8.3/>
|
||||||
|
|
||||||
|
## 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 <https://raw.githubusercontent.com/munin-monitoring/contrib/master/plugins/drbd/drbd>
|
||||||
|
# chmod -R 755 /usr/local/share/munin
|
||||||
|
# cd /etc/munin/plugins/
|
||||||
|
# ln -s /usr/local/share/munin/plugins/drbd .
|
||||||
|
# cat <<EOT >> /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. <https://exchange.nagios.org/directory/Plugins/Operating-Systems/Linux/check_drbd/details>
|
||||||
|
|
||||||
|
|
||||||
|
~~~
|
||||||
|
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 <resource>
|
||||||
|
disk {
|
||||||
|
resync-rate 40M;
|
||||||
|
…
|
||||||
|
}
|
||||||
|
…
|
||||||
|
}
|
||||||
|
~~~
|
||||||
|
|
||||||
|
### Supprimer une ressource
|
||||||
|
|
||||||
|
~~~
|
||||||
|
# drbdadm disconnect <resource>
|
||||||
|
# drbdadm detach <resource>
|
||||||
|
### OU
|
||||||
|
# drbdadm down <resource>
|
||||||
|
~~~
|
||||||
|
|
||||||
|
On pourra ensuite supprimer le fichier de conf associé et reloader drbd.
|
Loading…
Reference in a new issue