Alexandre Dos Reis
Publié le 23 Feb 2021 - durée 9 min

HeartBeat et DRBD Sous Debian 10 Buster

Documentations

Site officiel de DRBD

Présentation

Qu’est ce que le clustering ?

C’est un type d’architecture en grappe où les machines s’écoutent mutuellement afin de fournir un service de haute disponibilité. On va mutualiser plusieurs ordinateurs afin d’augmenter la disponibilité, de faciliter la montée en charge, de permettre une répartition de la charge, et de faciliter la gestion des ressources (processeur, mémoire vive, disques durs, bande passante réseau).

Dans cet exemple, on mutualisera plusieurs serveurs pour servir d’Apache2.

Topologie

MachineOSDistributionVersionRôleNom d’hôteIP
VM Virtual BoxGNU / LinuxDebian10.5Serveur Web primaireweb1172.16.1.11 / front 172.16.1.10
VM Virtual BoxGNU / LinuxDebian10.5Serveur Web secondaireweb2172.16.1.12 / front 172.16.1.10
Dell Latitude 3500Windows10 Entreprise1903Client webL019-163172.16.x.x

Installation

Modification du nom d’hôte

On modifie le nom d’hôte pour nos 2 serveurs et on renseigne le fichier hosts pour permettre d’écrire directement le nom des machines dans les fichiers de configuration :

Serveur maître :

$
hostnamectl set-hostname web1
$
invoke-rc.d hostname.sh start
$
nano etc/hosts
127.0.0.1 localhost
127.0.1.1 web1

Serveur secondaire :

$
hostnamectl set-hostname web2
$
invoke-rc.d hostname.sh start
$
nano etc/hosts
127.0.0.1 localhost
127.0.1.1 web2

Installation de HeartBeat

$
apt update && apt install heartbeat -y

On va devoir créer 3 fichiers dans le repertoire etc/heartbeat :

$
cd /etc/heartbeat && touch authkeys && touch ha.cf && touch haresources

On attribue la lecture et éxecution uniquement pour le propriétaire avec la commande suivante :

$
chmod 600 *

Installation de Apache2

On installe apache2 sur nos 2 serveurs :

$
apt install apache2

Dans un premier temps, afin de faciliter nos tests. On modifie le fichier index.html situé ici var/www/html/index.html

Pour web1 :

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <h1>
        Test sur web1
    </h1>
</body>
</html>

Pour web2 :

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <h1>
        Test sur web2
    </h1>
</body>
</html>

Plus tard, on fera en sorte que les fichiers de notre application soit mutualisée.

Configuration de HeartBeat

Fichier haresources

On configure le fichier comme suit :

web1 IPaddr::172.16.1.10/16/enp0s3 apache2

web1 désigne le nom d’hôte. IPaddr désigne l’adresse IP, le masque et le nom de la carte réseau qui serviront d’adresse de frontend pour les clients web. Et enfin on indique le nom du processus que HeartBeat doit mutualiser, ici c’est apache2.

Fichier ha.cf

On configure le fichier comme suit :

logfile         /var/log/ha-log
logfacility     local0
keepalive       2
deadtime        10
bcast           enp0s3
node            clone1 clone2
auto_failback   yes

logfile désigne l’enplacement où se trouveront les logs, utile pour le debug. node contient les noeux que HeartBeat doit utiliser pour garantir de la haute disponibilité. auto_failback doit absolument être à yes ou on pour que la bascule s’effectue en cas de problème.

Fichier authkeys

C’est un fichier de d’authentification que HeartBeat utilise pour les noeux. Il devrait être uniquement lisible par root.

auth 3
3 md5 mypassword

Mais d’autres signatures d’algorythme sont possible comme sha1.

Permettre le démarrage de HeartBeat lors du démarrage.

$
systemctl enable heartbeat

Premier test

On démarre HeartBeat sur nos 2 machines

$
systemctl start heartbeat

Avec la machine du client web, on ouvre un navigateur à l’adresse du frontend 172.16.1.10. Normalement, on devrait tomber sur la page de web1.

Stopper la machine web1, pour voir si web2 prend le relais :

$
systemctl stop heartbeat

Une fois que l’on a bien vérifié que la bascule se fait bien, on peut passer à la suite. On doit à présent réunir les sources pour apache2, c’est à dire mettre en commun le fichier qui sera servir par Apache2, actuellement c’est index.html. Pour cela, on a plusieurs solutions, celle qui est choisie ici est la réplication d’une partition du disque de web1 sur web2.

Synchroniser les fichiers sources avec DRBD

Vu que DRBD ne supporte que la réplication de partition entière, on va donc créer une partition sur chacune de nos machines.

Ajout d’un second disque virtuel sur Virtual Box

Cette partie est à effectuer sur web1 et web2.

Dans le cadre de cette procédure, Virtual Box est utilisé pour supporter nos machines virtuelles Debian. Cette partie est à adapter selon l’architecture.

Selectionner la vm puis cliquer sur configuration. Cliquer sur Stockage, se placer sur Contrôleur : SATA puis sur la droite, cliquer sur Ajoute un disque dur. Sur cette nouvelle fenêtre, cliquer sur Créer.

Selectionner la taille que l’on souhaite allouer pour cette nouvelle partition. Selectionner VDI (Virtual Disk Images) Puis cliquer sur créer.

Sélectionner ce nouveau disque, puis cliquer sur Ajouter. Le nouveau disque est prêt.

Création de la partition

Cette commande permet d’afficher toutes les partitions liés à notre système

$
fdisk -l

Normalement, le disque ajouté avec virtualBox devrait apparaitre.

Disque /dev/sdb : 1,1 GiB, 1198348288 octets, 2340524 secteurs
Modèle de disque : VBOX HARDDISK
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets

Puis on crée la nouvelle partition sur ce disque avec cette commande en renseignant bien le nom du disque :

$
fdisk /dev/sdb

S’ensuit une application pour la gestion de partition.

Entrer n pour ajouter une nouvelle partition

Puis p pour créer une partition primaire.

Puis un numéro de partition, taper 1

Puis Entrée pour régler les question du premier et dernier secteur.

Ce message de succès devrait apparaître :

Une nouvelle partition 1 de type « Linux » et de taille 1,1 GiB a été créée.

Ne pas oublier de rentrer w pour enregistrer nos modifications. Ce mesage devrait apparaitre :

La table de partitions a été altérée.
Appel d'ioctl() pour relire la table de partitions.
Synchronisation des disques.

Entrer à nouveau la commande fdisk -l pour vérifier la partition nouvellement créée.

Disque /dev/sdc : 1,1 GiB, 1198348288 octets, 2340524 secteurs
Modèle de disque : VBOX HARDDISK
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x3c627fb3

Maintenant que notre partition est créée, on va pouvoir la formater.

Formatage de la partition

On formate avec le système de fichier ext4.

$
mkfs.ext4 /dev/sdb1
mke2fs 1.44.5 (15-Dec-2018)
Creating filesystem with 292309 4k blocks and 73152 inodes
Filesystem UUID: 88c6221a-17c5-4123-9cdb-f5facdd1f4f2
Superblock backups stored on blocks:
       32768, 98304, 163840, 229376

Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

Installation de DRBD

DRBD pour Distributed Replicated Block Device est une architecture de stockage distribuée pour GNU/Linux, permettant la réplication de périphériques de bloc (disques, partitions, volumes logiques etc.) entre des serveurs. DRBD est un logiciel libre, mais un support existe. DRBD est composé d’un module noyau, d’outils d’administration en espace utilisateur ainsi que de scripts shell.

La réplication s’effectue :

En temps réel continuellement pendant que les applications modifie les données sur le disque.

En transparence, les applications n’ont pas besoin de savoir que leurs données sont répliquées sur d’autres machines

En fonctionnement synchrone ou asynchrone. En réplication synchrone, les applications sont notifiées de la complétion de l’écriture des données après que celles-ci ait été transportés sur les différents serveurs. En réplication asynchrone, les applications sont notifiées seulement lors de la complétion en locale sur la machine, avant que la propagation ne se fasse.

Activer le module drbd en faisant :

$
modprobe drbd

installer le paquet drbd-utils :

$
apt install drbd-utils

Vérifier la version de l’appli :

$
drbdadm -V

Ouvrir le fichier de configuration principal et décommenter les includes dans /etc/drbd.conf

Configurer les fichiers de conf suivants comme suit :

Pour /etc/drbd.d/global_common.conf :

global {
    usage-count no;
    udev-always-use-vnr; # treat implicit the same as explicit volumes
    }
common {
    handlers {
    }
    startup {
        wfc-timeout 15;
        degr-wfc-timeout 60;
    }
    options {
    }
    disk {
    }
    net {
        protocol C;
        cram-hmac-alg sha1;
        shared-secret "password";
        }
}

Pour ce fichier /etc/drbd.d/r0.res, à adapter selon chaque cas :

resource r0 {
        on clone1 {         # nom de la machine
        device /dev/drbd0;
        disk /dev/sdb1;     # nom de la partition
        address 172.16.3.85:7788;
        meta-disk internal;
        }
        on clone2 {
                device /dev/drbd0;
                disk /dev/sdb1;
                address 172.16.3.203:7788;
                meta-disk internal;
        }
}

Pour vérifier la syntaxe de la configuration :

$
drbdadm dump

Puis pour créer les métadata

$
drbdadm create-md r0

Si la commande retourne cette réponse :

md_offset 1072689152
al_offset 1072656384
bm_offset 1072623616

Found ext3 filesystem
     1047552 kB data area apparently used
     1047484 kB left usable by current configuration

Device size would be truncated, which
would corrupt data and result in
'access beyond end of device' errors.
You need to either
   * use external meta data (recommended)
   * shrink that filesystem first
   * zero out the device (destroy the filesystem)
Operation refused.

Command 'drbdmeta 0 v08 /dev/sdb1 internal create-md' terminated with exit code 40

On va donc formater le disque avec :

$
shred -zvf -n 1 /dev/sdb1

Et pour appliquer la nouvelle configuration :

$
drbadm adjust r0

À ce stade, vous devez avoir une ressource Connected mais avec des données inconsistentes :

$
drbd-overview

Il reste à déclarer un serveur primaire, le serveur secondaire se synchronisera automatiquement.

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

Pour vérifier, on fait :

$
cat /proc/drbd

On devrait obtenir cela :

version: 8.4.10 (api:1/proto:86-101)
srcversion: 473968AD625BA317874A57E
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:83856 nr:0 dw:0 dr:83856 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:963628
        [>...................] sync'ed:  8.3% (963628/1047484)K
        finish: 0:02:40 speed: 5,988 (5,988) K/sec

Une fois synchronisé, on devrait avoir ça :

$
drbdadm-overview
 0:r0/0  Connected Primary/Secondary UpToDate/UpToDate

Pour ne connaître que l’état de la grappe drbd :

$
drbdadm role all

Maintenant, il faut formater la partition drbd uniquement sur le serveur primaire.

$
mkfs.ext4 /dev/drbd0

Puis pour monter la partition sur le serveur primaire :

$
mkdir /web
$
mount /dev/drbd0 /web

La commande lsblk permet de voir les points de montages.

Il faut à present déposer un fichier HTML dans le dossier /web.

Paramétrer Apache2

Modification de 00default.conf

On va spécifier que la racine du serveur apache2 est dans /web.

$
nano /etc/apache2/sites-available/000-default.conf

Changer la ligne comme ceci et ajouter :

DocumentRoot /web
<directory /web>
        require all granted
</directory>

Puis changer le dossier web de propriétaire avec -R pour récursif :

$
chown -R www-data:www-data /web

On redémarre Apache2 et on teste dans le navigateur.

$
systemctl restart apache2

Paramétrage de HeartBeat

Éditez le fichier /etc/ha.d/haresources sur le clone1 et clone2 :

clone1 IPaddr::172.16.1.1/16/enp0s3 drbddisk::r0 Filesystem::/dev/drbd0::/web::ext4 apache2

Test finaux

Il faut effectuer des tests pour vérifier que la réplication se fait bien dans le dossier /web de clone2 lorsque l’on change le contenu de /Web sur clone1.

Arrêter le serveur heartbeat sur le clone 1 pour tester que la bascule se fait bien sur le serveur esclave en arrêtant le serveur maître.

$
systemctl restart heartbeat

Ressources