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
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.
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-----
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.