Documentations
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
Machine | OS | Distribution | Version | Rôle | Nom d’hôte | IP |
---|---|---|---|---|---|---|
VM Virtual Box | GNU / Linux | Debian | 10.5 | Serveur Web primaire | web1 | 172.16.1.11 / front 172.16.1.10 |
VM Virtual Box | GNU / Linux | Debian | 10.5 | Serveur Web secondaire | web2 | 172.16.1.12 / front 172.16.1.10 |
Dell Latitude 3500 | Windows | 10 Entreprise | 1903 | Client web | L019-163 | 172.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