29 mars 2024

Tuto V.2018 : Partie XI, Stockage NFS en HA avec DRBD et Hearbeat

Onzième partie du tutoriel sur la virtualisation Xen et OpenVswitch sont dans une Debian.
Dans un précédent article, je vous parlais de GlusterFS pour monter un cluster de stockage HA (haute disponibilité).
A l’usage, je me suis rendu compte que les performances de celui ci, dans mon environnement, sont assez faibles (l’installation de Matomo, le nouveau nom de Piwik, ayant été le meilleur des tests).
Bref, je me suis mis en quête d’une autre solution. Au final, je suis venu à tester une solution relativement « ancienne », mais qui reste qualitative : DRBD et duo avec Hearbeat.

I – Préparatifs

A – Principe

DRBD (Distributed Replicated Block Device) est un outil permettant la réplication de données en réseau. C’est en quelque sorte du RAID 1 en réseau.
HeartBeat est l’outil qui va nous permettre l’aspect Haute Disponibilité. Le principe est simple, le logiciel surveille un ou des services et en cas de down, il bascule une IP flottante sur un autre serveur. Du coup, pas besoin d’une machine tierce pour surveiller les deux serveurs de stockage, ils se surveillent mutuellement se passant l’IP de l’un à l’autre en cas de besoin.

B – Création des VMS

Nous allons créer deux VM :

dom0# xen-create-image --hostname stock1 --role debugo --size 5G --memory 1G--swap 1G --vcpus=1 --ip=99.99.99.99
dom0# xen-create-image --hostname stock2 --role debugo --size 5G --memory 1G--swap 1G --vcpus=1 --ip=99.99.99.99

Puis nous allons créer deux nouveaux LV dédiés au stockage (adaptez la taille à ce que vous désirez) :

dom0# lvcreate -L +2G -n stock1 vg0
dom0# lvcreate -L +2G -n stock2 vg0

Modifions maintenant le fichier de config /etc/xen/stock1.cfg :

disk        = [
                  'phy:/dev/vg0/stock1-disk,xvda2,w',
                  'phy:/dev/vg0/stock1-swap,xvda1,w',
                  'phy:/dev/vg0/stock1,xvda3,w',]
...
vif         = [ 'vifname=stock1.0,ip=10.20.1.51 ,mac=00:16:3E:A0:51:20,bridge=brint.20',
                'vifname=stock.1,ip=10.99.1.51 ,mac=00:16:3E:A0:51:99,bridge=brint.99']

Fichier /etc/xen/stock2.cfg :

disk        = [
                  'phy:/dev/vg0/stock2-disk,xvda2,w',
                  'phy:/dev/vg0/stock2-swap,xvda1,w',
                  'phy:/dev/vg0/stock2,xvda3,w',]
...
vif         = [ 'vifname=stock2.0,ip=10.20.1.52 ,mac=00:16:3E:A0:52:20,bridge=brint.20',
                'vifname=stock2.1,ip=10.99.1.52 ,mac=00:16:3E:A0:52:99,bridge=brint.99']

Interfaces réseaux de stock1 :

dom0# mount /dev/vg0/stock1-disk /mnt/vm/
dom0# nano /mnt/vm/etc/network/interfaces

Collez cela :

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
 address 10.20.1.51
 netmask 255.255.255.0
auto eth1
iface eth1 inet static
 address 10.99.1.51
 netmask 255.255.255.0

Et démontez :

dom0# umount /mnt/vm

Interfaces réseaux de stock2 :

dom0# mount /dev/vg0/stock2-disk /mnt/vm/
dom0# nano /mnt/vm/etc/network/interfaces

Collez cela :

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
 address 10.20.1.52
 netmask 255.255.255.0
auto eth1
iface eth1 inet static
 address 10.99.1.52
 netmask 255.255.255.0

Et démontez :

dom0# umount /mnt/vm

C – Ajout des VMs dans le DNS

On va ajouter ces deux vms dans le dns.
Connectez vous à la vm dns et modifiez les fichiers db.debugo.intra20, db.debugo.intra99 et db.debugo.intra.rev. Pensez à incrémenter vos sérials.
Rechargez avec :

dns# rndc reload

 

II – Installation de DRBD

Retournons sur l’hyperviseur pour démarrer nos deux vms :

dom0# xen create /etc/xen/stock1.cfg
dom0# xen create /etc/xen/stock2.cfg

Sur les deux machines, faites ces manipulations à l’identique.

stockx# fdisk /dev/xvda3

Création de la nouvelle partition  avec n puis 4 fois entrée. Validez avec W.
Un reboot :

stockx# reboot

Une fois les deux vms redémarrées, nous passons à l’installation de DRBD et au chargement du module :

stockx# apt-get install drbd8-utils
stockx# modprobe drbd

Nous allons maintenant créer le fichier de configuration : /etc/drbd.d/debugo.res :

resource r0 {
   protocol C;
   syncer {
     rate 100M;
   }
  disk {
    on-io-error detach;
  }
  startup {
    become-primary-on stock1;
   }
  on stock1 {
    device /dev/drbd0;
    disk /dev/xvda3;
    address 10.20.1.51:7789;
    meta-disk internal;
  }
  on stock2 {
    device /dev/drbd0;
    disk /dev/xvda3;
    address 10.20.1.52:7789;
    meta-disk internal;
  }
}

Le fichier de configuration est identique sur les deux machines.
Passons à la création du dictionnaire des méta-datas DRBD sur nos deux serveurs et lançons le tout :

stockx# drbdadm create-md r0
stockx# drbdadm up r0

Vérifions la connexion entre nos deux nœuds :

stockx# drbd-overview
0:r0/0 Connected Secondary/Secondary Inconsistent/Inconsistent

Les deux nœuds sont bien connectés, mais pour le moment, tout les deux déclarés en secondaire. Nous allons donc en déclarer un primaire. Sur le premier nœud :

stock1# drbdadm -- --overwrite-data-of-peer primary r0

Puis :

stock1# drbd-overview

qui va nous montrer la synchronisation en cours :

 0:r0/0 SyncSource Primary/Secondary UpToDate/Inconsistent
 [====>...............] sync'ed: 25.2% (1572764/2097052)K

Une fois celle ci terminée, vous devez avoir sur le premier nœud :

stock1# drbd-overview
 0:r0/0 Connected Primary/Secondary UpToDate/UpToDate

Et sur le second nœud :

stock2# drbd-overview
 0:r0/0 Connected Secondary/Primary UpToDate/UpToDate

Nos deux nœuds sont synchronisés. Il ne reste plus qu’à formater le périphérique en Ext4.
Sur le nœud primaire :

stock1# mkfs.ext4 /dev/drbd0

Pour finir, on va faire en sorte que DRBD se lance automatique au démarrage, car de ce que j’ai constaté, par défaut, après un reboot, celui ci reste coupé :

stockx# drbd-overview
0:r0/0 Unconfigured . .

Du coup, sur les deux VMS :

stockx# update-rc.d drbd enable 2
stockx# update-rc.d drbd enable 3

 

III – Installation de HeartBeat

Passons maintenant à l’installation de HeartBeat. Les commandes suivantes sont, la aussi, à faire sur les deux nœuds :

stockx# apt-get install heartbeat
stockx# service heartbeat stop

On créé le fichier /etc/ha.d/ha.cf :

bcast eth0
warntime 4
deadtime 5
initdead 15
keepalive 2
auto_failback on
node stock1
node stock2

On crée une clé partagé dans le fichier /etc/ha.d/authkeys :

auth 3
3 md5 macléprivé

On sécurise le fichier :

stockx# chmod 600 /etc/ha.d/authkeys

Et pour finir, on édite le fichier /etc/ha.d/haresources :
Sur les 2 nœuds :

stock1 IPaddr::10.20.1.50/24/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/share::ext4 nfs-kernel-server

Heartbeat créera alors une IP volante, alias de eth0 qui sera attribuée à un serveur et qui changera si jamais celui ci tombe.
On active le lancement automatique :

systemctl enable heartbeat.service

 

IV – Installation du serveur NFS

Toujours sur le deux vms, on va créer le partage :

stockx# mkdir /share

Puis on installe le serveur NFS et l’on désactive son lancement automatique. En effet, ce sera HeartBeat qui se chargera de le lancer au besoin.

stockx# apt-get install nfs-kernel-server
stockx# systemctl disable nfs-kernel-server.service

On va éditer le fichier /etc/exports :

/share 10.20.1.0/24(rw,async,fsid=0,no_root_squash,no_subtree_check)

Puis on lance Heartbeat sur les deux vms :

stockx# service heartbeat start

Et on regarde sur le nœud 1 (attendez un peu, le temps que Hearbeat fasse sa popote) :

stock1# drbd-overview
 0:r0/0 Connected Primary/Secondary UpToDate/UpToDate /share ext4 2.0G 6.0M 1.9G 1%

Et sur le nœud 2 :

stock2# drbd-overview
 0:r0/0 Connected Secondary/Primary UpToDate/UpToDate

Et voila !

V – Test

Sur une autre VM, on va installer le client nfs :

vm# apt-get install nfs-common

Puis, pour voir le montage distant disponible

vm# showmount -e 10.20.1.60
 Export list for 10.20.1.60:
 /share 10.20.1.0/24

Pour tester :

vm# mkdir /distant

Puis éditez le fichier /etc/fstab et ajoutez :

10.20.1.50:/share /distant nfs _netdev,defaults,user,auto,noatime,intr,bg,nolock 0 0

Les attributs bg et nolock sont nécessaires pour certaines applications (nextcloud par ex….).
Puis :

vm# mount /distant

A partir de maintenant, si vous coupez le nœud 1, le service bascule rapidement sur le nœud 2. Si le nœud 1 revient, le service rebascule dessus, et au niveau de votre client, tout est transparent.
Bref, ça fonctionne et c’est bien ce qu’on attendait !

VI – En cas de Splitbrain

Normalement, en cas de coupure, tout doit remonter comme il faut, mais la certitude n’étant pas une qualité de l’informatique, il est possible qu’après un redémarrage, vos serveurs se trouvent dans la situation pénible d’un splitbrain.
Cela se voit car les deux ne se connectent pas, un drbd-overview vous répond StandAlone ou WFConnection et dmsg vous indique clairement le splitbrain…
Pas de panique…
Tout d’abord, choisissez le serveur « victime », celui ou vous savez que les données ne sont pas forcement les plus à jour. En cas de doute, rien ne vous empêche de les sauvegarder au préalable.
Avant tout, coupez Hearbeat sur les deux serveurs :
stockx# service heartbeat stop
Sur la victime :

# drbdadm secondary r0
# drbdadm disconnect r0
# drbdadm connect --discard-my-data r0

Sur l’autre serveur

# drbdadm connect r0

Il se peut que cette dernière commande retourne une erreur. Rien de grave, c’est que vos nœuds étaient en mode WFconnection et donc la connexion s’est rétablie toute seule.
Si la victime était le primaire, il faut refaire sur le primaire :

drbdadm -- --overwrite-data-of-peer primary r0

Et pour terminer, vérifiez sur le nœud 1 :

stock1# drbd-overview
 0:r0/0 Connected Primary/Secondary UpToDate/UpToDate

Et sur le nœud 2 :

stock2# drbd-overview
 0:r0/0 Connected Secondary/Primary UpToDate/UpToDate

Puis on peut relancer Heartbeat sur les deux machines :

stockx# service heartbeat start

 

VII – Redimensionnement

Ces opérations peuvent être effectuées sans couper les serveurs.

A – Augmentation

Exemple, on souhaite passer de 5Go à 20Go…
Sur l’hyperviseur, on va augmenter les deux LV de stockages :

dom0# lvresize -L+15G /dev/vg0/stock1
dom0# lvresize -L +15G /dev/vg0/stock2

Sur les deux nœuds, on coupe heartbeat (afin que la partition /deb/drbd0 soit disponible pour travailler dessus) :

stockx# service heartbeat stop

Puis sur le nœud 1, on repasse en primaire e (passé en secondaire avec l’arrêt de heartbeat) et on redimensionne la ressource :

stock1# drbdadm primary r0
stock1# drbdadm resize r0

Puis on doit voir une synchronisation en faisant :

stock1# drbd-overview

ensuite , une fois que les deux nœuds sont UpToDate, on vérifie le FS et on le redimensionne :

stock1# e2fsck -f /dev/drbd0
stock1# resize2fs /dev/drbd0

On peut relancer Hearbeat sur les deux nœuds :

stockx# service heartbeat start

B – Réduction

Exemple, on souhaite passer de 20Go à 5Go…
Sur les deux nœuds, on arrête heartbeat :

stockx# service heartbeat stop

Sur le nœud 1 :
On repasse en primaire, puis on vérifie le système de fichier :

stock1# drbdadm primary r0
stock1# e2fsck -f /dev/drbd0

Ensuite, pour éviter l’écrasement des méta-data par la diminution, on va réduire un peu plus le FS que ce que l’on désire :

stock1# resize2fs /dev/drbd0 4G

Sur l’hyperviseur, on va réduire les deux LV de stockages (la, on les reduit à la taille qu’on voudra au final, 20-15, reste 5Go)

dom0# lvresize -L -15G /dev/vg0/stock1
dom0# lvresize -L -15G /dev/vg0/stock2

Et ensuite, sur le noeud1, on va redimensionner une dernière fois pour qu’il s’adapte à la taille des volumes LV (pour regagner l’espace « perdu » avec le premier resize2fs qui laissait environ 1Go dans le vent, moins les métadata).

# stock1# drbdadm resize r0
# stock1# resize2fs /dev/drbd0

On peut relancer Hearbeat sur les deux noeuds :

stockx# service heartbeat start

Et voila pour la diminution.

Voila qui termine cet article. Pour plus d’informations, je vous invite à lire la documentation sur https://docs.linbit.com.
Bien sur, une fois cela en place, et vos données migrées, vous pouvez supprimer les anciennes machines Gluster1 et Gluster2 si vous les aviez encore.

On peut maintenant finaliser tout cela !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *