Drbd
Introduction
DRBD (Distributed Replicated Block Device) est un mécanisme de stockage distribuée qui permet la réplication en mode bloc (disques ou partitions) entre plusieurs machines.
La réplication des données se fait :
- en temps réel ;
- de façon transparente pour les applications (qui n'ont pas conscience de la réplication) ;
- de façon synchrone, ou asynchrone (l'application qui déclenche une écriture de donnée est notifiée de la fin de l'opération après la synchronisation ou avant).
DRBD peut servir conjointement avec Ucarp pour monter un cluster de serveur Web ou autre.
Pour le faire fonctionner il vous faut deux serveurs avec deux disques identiques (en plus du disque système) !
Préparation
Dans un premier temps, il faudra avoir une connexion à Internet, utiliser un serveur DNS et désactiver SELinux.
Pour ceux qui auraient manqué des étapes les voici:
Ensuite il faudra :
- deux disques identiques (un dans chaque machine) ;
- la synchronisation des horloges avec NTP ;
- ouvrir le port TCP 7789.
Une fois ces étapes effectuées, entrons dans le vif du sujet !
Installation de DRBD
DRBD est présent dans le dépôt EL et il faudra donc l'installer comme c'est expliqué ici
Une fois l'installation du dépôt EL nous pouvons installer DRBD:
# yum -y install drbd84-utils.x86_64 kmod-drbd84.x86_6
Pour charger le module dans le noyau un redémarrage est nécessaire !
Configuration
Résolution DNS
Sur les deux machines dans le fichier /etc/hosts ajoutez les lignes suivantes:
192.168.100.135 node1 node1.tala-informatique.fr 192.168.100.136 node2 node2.tala-informatique.fr
Remplacez les adresses IP par celles de vos machines.
Synchronisation de l'horloge
Il faut que les horloges des deux machines soient synchrones pour que DRBD fonctionne:
# yum -y install ntp
Puis:
- Pour SystemVInit:
service ntpd start
- Pour SystemD:
systemctl start ntpd.service
Ouverture du pare-feu
On ouvre le port TCP 7789 puis on sauvegarde la configuration Iptables
# iptables -I INPUT 2 -p tcp --dport 7789 -j ACCEPT # service iptables save
Création d'une partition principale
Sur les deux machines vous devez partitionner le disque qui servira pour DRBD.
Consultez la page sur la gestion des disques pour voir comment faire.
DRBD
Fonctionnement
Le format des fichiers de configuration à été développé pour pouvoir faire une copie du fichier sur les deux machine (plus simple à gérer). Le fichier /etc/drbd.conf doit donc être le même sur toutes les machines du cluster.
Par convention, le fichier de configuration contient deux inclusions:
- /etc/drbd.d/global_common.conf
- tous les fichiers en .res qui se trouvent dans le dossier /etc/drbd.d
Pour résumer :
- on ne touche jamais à /etc/drbd.conf
- on ajoute les clusters dans le répertoire /etc/drbd.d dans un fichier qui se termine par .res
Fichier de cluster
Éditez le fichier /etc/drbd.d/cluster.res comme suit :
resource cluster { net { cram-hmac-alg sha1; shared-secret "tala-informatique"; } on node1 { device minor 0; disk /dev/sdb1; meta-disk internal; address 192.168.100.135:7789; } on node2 { device minor 0; disk /dev/sdb1; meta-disk internal; address 192.168.100.136:7789; } }
On n'oublie pas de le copier sur l'autre machine:
# scp /etc/drbd.d/cluster.res root@node2:/etc/drbd.d/
Création du cluster
On doit initialiser le cluster pour qu'il soit utilisable:
# drbdadm create-md cluster Writing meta data... initializing activity log NOT initialized bitmap New drbd meta data block successfully created. success
Démarrage du service
On démarre DRBD en simultané sur les deux machines, sinon plantage !
- Pour SystemVInit:
service drbd start
- Pour SystemD:
systemctl start drbd.service
Starting DRBD resources: [ d(cluster) n(cluster) ].......... *************************************************************** DRBD's startup script waits for the peer node(s) to appear. - In case this node was already a degraded cluster before the reboot the timeout is 0 seconds. [degr-wfc-timeout] - If the peer was available before the reboot the timeout will expire after 0 seconds. [wfc-timeout] (These values are for resource 'cluster'; 0 sec -> wait forever) To abort waiting enter 'yes' [ 14]: .
Il doit démarrer comme cela:
Starting DRBD resources: [ s(cluster) ].
Puis on l'enregistre dans le chargeur de démarrage:
- Pour SystemVInit:
chkconfig drbd on
- Pour SystemD:
systemctl enable drbd.service
Synchronisation du nœud primaire
Avant de faire quoi que ce soit, exécuter la commande suivante pour synchroniser le cluster:
# /sbin/drbdadm -- --overwrite-data-of-peer primary cluster
Vous pouvez suivre l'avancement du processus en faisant un cat ou un watch du fichier /proc/drbd :
# cat /proc/drbd ou bien # watch -n 1 'cat /proc/drbd'
On commence avec watch:
Every 1,0s: cat /proc/drbd Tue Nov 4 20:43:31 2014 version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-10-28 10:31:39 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----- ns:65392 nr:0 dw:0 dr:66056 al:0 bm:3 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:457820 [=>..................] sync'ed: 13.3% (457820/523212)K finish: 0:26:42 speed: 272 (272) K/sec
Pour finir avec :
Every 1,0s: cat /proc/drbd Tue Nov 4 21:49:26 2014 version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-10-28 10:31:39 0: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown r----- ns:523212 nr:0 dw:0 dr:523876 al:0 bm:32 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
Formatage de la partition DRBD
Enfin, il ne reste plus qu'à partitionner, formater et attribuer un point de montage au volume DRBD sur votre nœud primaire:
# fdisk /dev/drbd0 # mkfs.ext4 /dev/drbd0 # mkdir /opt/cluster # mount /dev/drbd0 /opt/cluster
Ne tentez pas de monter la partition sur les nœuds secondaire, de toute façon vous n'en n'avez pas besoin.
Bascule
Que faire pour basculer le point de montage sur un des noeuds secondaire ?
Tout d'abord on démonte le volume DRBD
# umount /dev/drbd0
Ensuite, on fait basculer le primaire en secondaire:
drbdadm secondary cluster
Puis on fait basculer un des secondaire en primaire:
drbdadm --overwrite-data-of-peer primary all