19/09/2024

Services

Haute disponibilité des données : comment installer un cluster GlusterFS sur AlmaLinux ou Debian ?

I. Présentation

Dans ce tutoriel, nous allons apprendre à mettre en place un cluster de réplication avec GlusterFS afin de créer un cluster de trois serveurs de stockage et assurer la haute disponibilité des données.

Mettre en place GlusterFS permet, par exemple, de garantir la haute disponibilité et la redondance des données pour des applications utilisant un load balancing sur plusieurs serveurs, en complément d'une réplication de base de données. Cette solution peut également s'intégrer parfaitement avec des systèmes de sauvegarde ou des déploiements virtualisés, assurant ainsi une continuité de service même en cas de défaillance d'un nœud. GlusterFS est ce que l'on appelle un système de fichiers distribué en réseau.

Sur chaque serveur, les fichiers contenus dans "/Applicatif/" seront répliqués dans le point de montage, ici "/mnt/montage_applicatif". Puis, répliqués dans chaque point de montage de chaque serveur, et enfin répliqués vers "/Applicatif/" de chaque serveur.

Il existe plusieurs solutions techniques pour assurer la disponibilité des données, et GlusterFS en est une. Ce qui est appréciable avec cette solution, au-delà du fait qu'elle soit open source et gratuite, c'est qu'elle offre plusieurs avantages, notamment :

  • Cluster avec une topologie multi-maîtres : si un nœud tombe, les autres nœuds continuent d'assurer le service de façon transparente sans avoir besoin d'effectuer des manipulations complexes pour retrouver l'état initial.
  • Cluster actif-actif avec l'ensemble des nœuds : tous les nœuds sont actifs en même temps.
  • Réplication synchrone des informations : en temps réel, les données sont répliquées sur tous les nœuds.
  • Lecture et écriture sur l'ensemble des nœuds : toutes les opérations de lecture et d'écriture peuvent se faire sur n'importe quel nœud.
  • Souple : fonctionne aussi bien sur le LAN que sur le WAN.
  • Support des environnements géo-distribués : plusieurs centres de données, multi-Cloud, etc.
  • Ajout d'un nouveau nœud au cluster en quelques minutes : avec les bons paquets et un seul fichier de configuration, il est facile d'ajouter un nouveau nœud au cluster.

Enfin, sachez que GlusterFS est un projet soutenu par Red Hat et la communauté open source.

II. Les prérequis

Avant de mettre en place un cluster GlusterFS, il faut prendre en compte certains prérequis essentiels pour garantir la bonne configuration et le fonctionnement optimal du cluster. GlusterFS nécessite un nombre impair de nœuds pour fonctionner correctement et éviter les problèmes de split-brain. Nous allons donc constituer un cluster avec trois nœuds pour ce tutoriel.

Dans ce tutoriel, nous allons utiliser trois machines virtuelles sous AlmaLinux 9.4 :

  • almalinux-SRV-1 : 192.168.194.50
  • almalinux-SRV-2 : 192.168.194.80
  • almalinux-SRV-ARBITRE : 192.168.194.110

Ces machines virtuelles serviront à héberger les données que nous souhaitons rendre disponibles et redondantes sur le réseau. Actuellement, ces machines ont des ressources limitées : 2 Go de RAM, 2 vCPU et 50 Go d'espace disque. Pour un environnement de production, il sera nécessaire de prévoir des ressources plus importantes en fonction de la quantité de données à gérer et du nombre de connexions à supporter.

Voici d'autres prérequis à considérer :

  • Utilisez des nœuds avec les mêmes ressources, car le cluster sera aussi performant que le nœud le plus lent.
  • GlusterFS fonctionne uniquement sur les systèmes d'exploitation Linux/Unix.
  • Pour un cluster géo-distribué, contrôlez la latence entre vos différents nœuds, l'idéal étant qu'elle ne dépasse pas 300 ms.
  • Assurez-vous que vos serveurs disposent de suffisamment d'espace disque pour stocker les données répliquées.
  • Le pare-feu de vos serveurs doit autoriser les ports suivants : 24007, 24008, et 49152 à 49251 (pour la gestion et le trafic de GlusterFS).

III. Quels seront les dossiers à répliquer ?

Dans ce tutoriel, nous allons configurer la réplication d'un ensemble de dossiers spécifiques afin d'assurer la disponibilité et la redondance des données stockées. La configuration du dossier à répliquer est cruciale pour le bon fonctionnement du cluster GlusterFS. Le dossier principal à répliquer, ainsi que ses sous-dossiers, sont définis comme suit :

Racine : /Applicatif/

  • Supervision : /Applicatif/Supervision
  • Ticketing : /Applicatif/Ticketing
  • Inventory : /Applicatif/Inventory

Ces dossiers représentent des services essentiels tels que la supervision, le ticketing et l'inventaire. En répliquant ces dossiers sur plusieurs nœuds du cluster, nous nous assurons que les données sont toujours disponibles, même en cas de défaillance d'un des nœuds.

Il est important de noter que si certains fichiers dans ces dossiers appartiennent à un utilisateur serveur spécifique, comme Apache, nous devrons ajuster les droits d'accès en conséquence. Ceci est essentiel pour garantir que les services fonctionnent correctement et que les utilisateurs disposent des permissions nécessaires pour accéder et modifier les fichiers répliqués.

IV. Mise à jour du système

La première étape, la mise à jour du système afin de le préparer. Ouvrez un terminal sur vos VM AlmaLinux et mettez à jour les paquets existants en utilisant les commandes suivantes :

# AlmaLinux :
sudo dnf update -y && sudo dnf upgrade -y && sudo dnf autoremove -y && sudo dnf clean all

# Debian :
sudo apt update && sudo apt full-upgrade -y && sudo apt autoremove -y && sudo apt autoclean && sudo apt clean

Cette commande permet de mettre à jour tous les paquets existants, de supprimer les paquets obsolètes et de nettoyer le cache des paquets.

V. Installation de GlusterFS

Pour installer GlusterFS sur les trois serveurs, commencez par installer les dépôts nécessaires :

# AlmaLinux :
sudo dnf install -y epel-release
sudo dnf install centos-release-gluster9 -y
sudo dnf install glusterfs-server -y && sudo systemctl status glusterd

# Debian :
sudo apt install -y glusterfs-server && sudo systemctl status glusterd

Ces commandes permettent d'installer EPEL (Extra Packages for Enterprise Linux), le dépôt Gluster9, et le serveur GlusterFS. La dernière commande vérifie le statut du service GlusterFS.

Ensuite, activez et démarrez le service GlusterFS :

# AlmaLinux :
sudo systemctl enable --now glusterd
sudo firewall-cmd --add-service=glusterfs --permanent
sudo firewall-cmd --reload
sudo systemctl restart glusterd
sudo systemctl enable glusterd

# Debian :
sudo systemctl enable --now glusterd
sudo iptables -A INPUT -p tcp --dport 24007 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 24008 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 49152:49251 -j ACCEPT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo netfilter-persistent save
sudo systemctl restart glusterd
sudo systemctl enable glusterd

Les commandes ci-dessus servent à activer et démarrer le service GlusterFS, configurer le pare-feu pour autoriser le trafic GlusterFS, et redémarrer le service pour appliquer les changements.

Si vous avez un serveur nommé @localhost, renommez-le et redémarrez :

sudo hostnamectl set-hostname nouveau_nom_host
sudo reboot

Ces commandes permettent de changer le nom d'hôte de votre serveur et de redémarrer le système pour appliquer le changement.

VI. Configuration des serveurs

Ajoutez les entrées de vos serveurs dans le fichier /etc/hosts de chaque serveur pour garantir que chaque serveur puisse résoudre les noms des autres serveurs :

echo -e "192.168.194.110 almalinux-SRV-ARBITRE\n192.168.194.80 almalinux-SRV-2\n192.168.194.50 almalinux-SRV-1" | sudo tee -a /etc/hosts

Cette commande ajoute les adresses IP et les noms d'hôte des serveurs dans le fichier "/etc/hosts".

Voici ce qui est maintenant visible dans chacun des serveurs dans "/etc/hosts" :

Ensuite, ajoutez les pairs sur tous les serveurs pour qu'ils se reconnaissent mutuellement :

sudo gluster peer probe 192.168.194.50
sudo gluster peer probe 192.168.194.80
sudo gluster peer probe 192.168.194.110

Ces commandes permettent à chaque serveur de reconnaître les autres serveurs comme pairs dans le cluster GlusterFS.

Sur chaque serveur, veillez à bien avoir le dossier que vous souhaitez répliquer :

sudo mkdir -p /Applicatif

Cette commande crée le répertoire "/Applicatif" sur chaque serveur, qui sera utilisé pour la réplication.

VII. Création du volume GlusterFS

Créez et démarrez le volume GlusterFS à partir de SRV-1 ( le serveur maître à partir duquel le cluster est initié ) :

sudo gluster volume create volume_applicatif replica 3 arbiter 1 transport tcp 192.168.194.50:/Applicatif 192.168.194.80:/Applicatif 192.168.194.110:/Applicatif force

sudo gluster volume start volume_applicatif

La première commande crée un volume répliqué avec 3 réplicas et 1 arbitre en utilisant les répertoires spécifiés sur chaque serveur. La deuxième commande démarre le volume.

VIII. Accorder des droits et monter le volume

Montez le volume GlusterFS sur les trois serveurs :

sudo mkdir -p /mnt/montage_applicatif

echo "192.168.194.50:/volume_applicatif /mnt/montage_applicatif glusterfs defaults,_netdev 0 0" | sudo tee -a /etc/fstab

sudo systemctl daemon-reload

sudo mount -a

Ces commandes créent un point de montage, ajoutent le volume GlusterFS au fichier "/etc/fstab" pour qu'il soit monté automatiquement au démarrage, et montent le volume immédiatement.

Si vous devez avoir un propriétaire spécifique pour vos dossiers, par exemple, Apache pour de l'applicatif, changez les droits sur les 3 serveurs :

sudo groupadd gluster_apache

sudo usermod -aG gluster_apache apache
sudo usermod -aG gluster_apache gluster

sudo chmod -R 755 /Applicatif
sudo chown -R :gluster_apache /Applicatif
sudo chmod -R 755 /mnt/montage_applicatif
sudo chown -R : /mnt/montage_applicatif

Ces commandes créent un groupe "gluster_apache", ajoutent les utilisateurs "apache" et "gluster" à ce groupe, et ajustent les permissions sur les répertoires "/Applicatif" et "/mnt/montage_applicatif".

Vérifiez le montage :

df -h

Cette commande affiche les systèmes de fichiers montés et leurs détails.

Vous pourrez observer au bout de quelques secondes, ou minutes selon le poids des éléments répliqués et votre connexion, la réplication de vos dossiers sur votre SRV-2 :

IX. Vérification et maintenance du cluster GlusterFS

Je vous mets à disposition un script de vérification, de maintenance et de logs pour GlusterFS que j'ai personnellement créé, adaptez le à vos besoins en modifiant les adresses IP, les noms des points de montage, et le nom de volume :

Commencez sur chacun de vos serveurs par créer un fichier "glusterfs-check.sh" :

sudo nano /usr/local/bin/glusterfs-check.sh

Ajoutez le script suivant dans ce fichier :

#!/bin/bash

LOG_FILE="/var/log/glusterfs-check.log"
STEPS=7  # Nombre total d'étapes dans le script

# Supprimer les anciens logs
if [ -f "$LOG_FILE" ]; then
    rm "$LOG_FILE"
fi

# Fonction de journalisation
log() {
    echo "$(date) : $1" >> $LOG_FILE
}

# Fonction de progression
progress() {
    local step=$1
    local total=$2
    local percent=$(( 100 * step / total ))
    echo -ne "Progress: [${percent}%]...\r"
}

step=1

log "Script de vérification GlusterFS démarré."
progress $step $STEPS

# Vérification de l'état du service glusterd
if ! systemctl is-active --quiet glusterd; then
    log "Le service glusterd n'est pas actif. Tentative de démarrage."
    sudo systemctl start glusterd
    if ! systemctl is-active --quiet glusterd; then
        log "Échec du démarrage du service glusterd."
        exit 1
    else
        log "Service glusterd démarré avec succès."
    fi
else
    log "Le service glusterd est déjà actif."
fi

step=$((step + 1))
progress $step $STEPS

# Vérification de l'état des pairs GlusterFS
peers_status=$(sudo gluster peer status | grep "Peer in Cluster" | wc -l)

if [ "$peers_status" -ne 2 ]; then
    log "Tous les pairs ne sont pas en ligne. Tentative de reconnexion des pairs."
    
    # Ajout des adresses IP de vos pairs
    peers=("192.168.1.50" "192.168.1.80" "192.168.1.110")
    
    for peer in "${peers[@]}"; do
        sudo gluster peer probe $peer
    done
    
    # Revérification de l'état des pairs
    peers_status=$(sudo gluster peer status | grep "Peer in Cluster" | wc -l)
    
    if [ "$peers_status" -ne 2]; then
        log "Échec de la reconnexion de tous les pairs."
        exit 1
    else
        log "Tous les pairs sont maintenant en ligne."
    fi
else
    log "Tous les pairs sont en ligne."
fi

step=$((step + 1))
progress $step $STEPS

# Vérification de l'état du volume
volume_status=$(sudo gluster volume info volume_applicatif | grep "Status: Started" | wc -l)

if [ "$volume_status" -ne 1]; then
    log "Le volume volume_applicatif n'est pas démarré. Tentative de démarrage."
    sudo gluster volume start volume_applicatif
    if [ "$?" -ne 0 ]; then
        log "Échec du démarrage du volume volume_applicatif."
        exit 1
    else
        log "Volume volume_applicatif démarré avec succès."
    fi
else
    log "Le volume volume_applicatif est déjà démarré."
fi

step=$((step + 1))
progress $step $STEPS

# Vérification des briques du volume
brick_status=$(sudo gluster volume status volume_applicatif detail | grep "N/A" | wc -l)

if [ "$brick_status" -ne 0 ]; then
    log "Certaines briques du volume volume_applicatif ne sont pas en ligne."
    # Tentative de remonter les briques
    sudo gluster volume heal volume_applicatif
fi

step=$((step + 1))
progress $step $STEPS

# Vérification du montage des volumes
if mountpoint -q /mnt/montage_applicatif; then
    log "Le volume GlusterFS est déjà monté."
else
    log "Tentative de montage du volume GlusterFS."
    sudo mount -t glusterfs 192.168.1.50:/volume_applicatif /mnt/montage_applicatif
    if [ "$?" -ne 0 ]; then
        log "Échec du montage des volumes GlusterFS. Tentative de diagnostic."
        
        # Diagnostic supplémentaire
        mount_output=$(sudo mount -t glusterfs 192.168.1.50:/volume_applicatif /mnt/montage_applicatif 2>&1)
        log "Sortie de la commande de montage : $mount_output"
        
        # Vérification de l'accès au volume
        glusterfs_output=$(sudo gluster volume status volume_applicatif 2>&1)
        log "Statut du volume GlusterFS : $glusterfs_output"
        
        exit 1
    else
        log "Volumes GlusterFS montés avec succès."
    fi
fi

step=$((step + 1))
progress $step $STEPS

log "Script de vérification GlusterFS terminé avec succès."
progress $STEPS $STEPS
echo ""

Ce script vérifie l'état du service GlusterFS, des pairs et du volume, il démarre les services et monte le volume si nécessaire, puis enregistre toutes les actions dans un fichier de log. Afin de pouvoir l'utiliser, vous devez l'adapter avec vos informations (noms de serveurs, volumes, etc.).

Rendez le script exécutable :

sudo chmod +x /usr/local/bin/glusterfs-check.sh

Ajoutez une tâche cron, également sur chaque serveur, pour exécuter le script au démarrage et donc redémarrage de vos serveurs :

echo "@reboot root /usr/local/bin/glusterfs-check.sh" | sudo tee -a /etc/crontab

Vous pouvez lancer si vous le souhaitez le script manuellement pour vérifier son bon fonctionnement :

sudo bash /usr/local/bin/glusterfs-check.sh

Les logs générés par le script sont affichables par cette commande :

cat /var/log/glusterfs-check.log

X. Conclusion

En suivant ce tutoriel, vous avez maintenant un cluster GlusterFS fonctionnel, offrant une solution de stockage hautement disponible et résiliente sur AlmaLinux ou Debian, selon la distribution que vous utilisez. Vous êtes désormais prêt à déployer cette solution pour stocker efficacement vos données critiques !

N'hésitez pas à commenter cet article si vous avez une question ou une remarque.

author avatar
Killian VAN RUYMBEKE Ingénieur Cybersécurité M1
Ingénieur Cybersécurité M1 en alternance, j'ai une forte appétence pour tous les domaines technologiques. Dans un esprit d'entraide, j’essaie de partager les connaissances que j'ai pu acquérir à travers mes articles.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

3 commentaires sur “Haute disponibilité des données : comment installer un cluster GlusterFS sur AlmaLinux ou Debian ?

  • Merci pour ce tuto que j’ai hâte d’essayer.

    En revanche, j’ai une question, ici, côté réseau on ne spécifie que le besoin d’avoir mois de 300ms de latence, mais quid de la connexion ? Est-ce qu’une connexion 1gbs suffit ou est-ce qu’il faut forcément avoir plus ? 2,5 / 5 ou encore 10 ? Est-ce qu’il faut obligatoirement 2 câbles ethernet, 1 pour le cluster et un autre pour la connexion classique ?

    Encore merci pour ce tuto 🙂

    Répondre
    • Bonjour Guillaume,

      Une connexion 1 Gbps sera suffisante pour une utilisation standart, après tout dépendra du trafic de lecture/écriture que vous prévoyez d’avoir.

      Et je vous conseille fortement d’avoir 2 interfaces, ça empêchera d’avoir des conflits, que ça soit niveau reseau ou le niveau réplication/synchronisation

      Répondre
  • hi everyone,

    merci pour l’article, mais on parle de volume GlesterFS, je trouve qu’il manque une petite précison dans l’article qui est l’essence de GlusterFS et de son système de fichier et joue sur sa performances. Il existe 3 modèle différents et il est important d’en parler sachant que cela sert a déterminer le type d’infra qu’on souhaite mettre en place.
    Soit les volumes : distribué, répliqué et distribué-répliqué

    Répondre

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.