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 !