Aller au contenu
medium

GlusterFS : déployer un stockage distribué résilient

27 min de lecture

logo glusterfs

GlusterFS transforme plusieurs serveurs Linux en un espace de stockage unifié, répliqué et évolutif. Sans serveur de métadonnées central, chaque nœud est autonome : si l’un tombe, les autres continuent de servir les données. Ce guide vous accompagne de l’installation à la mise en production d’un cluster 3 nœuds avec volume répliqué, commandes testées sur Ubuntu 24.04.

  • Architecture GlusterFS : bricks, volumes, peers et hashing distribué
  • Types de volumes : distribué, répliqué, dispersé et leurs combinaisons
  • Lab complet : déployer un cluster 3 nœuds avec KVM et cloud-init
  • Commandes essentielles : créer, gérer, surveiller et dépanner vos volumes
  • Sécurité et bonnes pratiques : TLS, pare-feu, quotas, tuning performance

GlusterFS (Gluster File System) est un système de fichiers distribué open source créé en 2005, racheté par Red Hat en 2011. Il agrège le stockage de plusieurs serveurs pour former un espace unifié accessible en réseau.

Analogie : imaginez une bibliothèque répartie dans plusieurs bâtiments. Chaque bâtiment stocke des livres (les bricks), et un catalogue commun permet de retrouver n’importe quel livre depuis n’importe quel bâtiment. Avec la réplication, chaque livre existe en plusieurs exemplaires dans des bâtiments différents : si un bâtiment ferme, les livres restent accessibles ailleurs.

CaractéristiqueDescription
Sans métadonnées centraliséesLes métadonnées sont réparties : chaque brick et le DHT participent à la localisation des fichiers. Pas de point de défaillance unique (contrairement à HDFS).
Scalabilité horizontaleAjout de nœuds à chaud, jusqu’à plusieurs pétaoctets
Réplication automatiqueCopies synchrones sur N nœuds configurables
Auto-réparationLe Self-Heal Daemon restaure les fichiers après panne
Multi-protocoleFUSE natif, NFS-Ganesha, SMB/CIFS, libgfapi
Open sourceLicence GPLv2 / LGPLv3+, communauté active
CritèreGlusterFSCephNFS classique
ComplexitéModéréeÉlevéeFaible
Type de stockageFichier (bloc via iSCSI)Objet + Bloc + FichierFichier
MétadonnéesDistribuées (pas de serveur central)Centralisées (MDS)Centralisées
Cas d’usage idéalStockage partagé, clusters webCloud privé completPartages simples
ScalabilitéPétaoctetsExaoctetsLimité
Facilité d’installationBonneComplexeTrès simple

Architecture d'un cluster GlusterFS avec volume répliqué

Un cluster GlusterFS repose sur des concepts simples mais puissants :

  • Brick : un répertoire sur un disque d’un serveur. C’est l’unité de base du stockage. Chaque brick correspond à un chemin sur un filesystem (XFS recommandé).

  • Volume : la structure logique qui combine plusieurs bricks. C’est le volume que les clients montent pour accéder aux données. Un volume peut être distribué, répliqué, dispersé ou une combinaison.

  • Peer (ou nœud) : un serveur membre du Trusted Storage Pool. Les peers communiquent entre eux via le daemon glusterd (port TCP 24007).

  • Trusted Storage Pool : l’ensemble des peers qui se font confiance et partagent leurs bricks pour former des volumes.

  • glusterd : le daemon de gestion qui tourne sur chaque nœud. Il gère la configuration du cluster, l’ajout de peers et la création de volumes.

  • Self-Heal Daemon (shd) : processus automatique qui détecte et répare les incohérences entre les réplicas après une panne ou une coupure réseau.

  • Translator : module enfichable dans la pile GlusterFS. Les translators gèrent la distribution (DHT), la réplication (AFR), le cache, les quotas, etc.

GlusterFS utilise un algorithme de hashing cohérent (Distributed Hash Table) pour déterminer sur quelle brick stocker chaque fichier. Le nom du fichier est hashé, et le résultat détermine la brick cible. Cette approche élimine le besoin d’un serveur de métadonnées central.

GlusterFS propose plusieurs types de volumes, chacun adapté à un besoin différent en termes de performance, redondance et efficacité d’espace.

Les fichiers sont répartis entre les bricks selon le hashing DHT. Chaque fichier n’existe que sur une seule brick.

  • Avantage : capacité maximale (somme de toutes les bricks)
  • Inconvénient : aucune redondance, perte d’une brick = perte de données
  • Cas d’usage : stockage temporaire, cache, données non critiques

Chaque fichier est copié intégralement sur N bricks (replica 2 ou 3). Toutes les bricks contiennent les mêmes données.

  • Avantage : haute disponibilité, tolérance aux pannes
  • Inconvénient : capacité = taille d’une seule brick (les autres sont des copies)
  • Cas d’usage : bases de données, fichiers critiques, configurations

Combine distribution et réplication. Les fichiers sont distribués entre des groupes de bricks, et chaque groupe réplique ses données.

  • Avantage : scalabilité + redondance
  • Cas d’usage : clusters de production, stockage web à grande échelle

Utilise le codage d’effacement pour répartir les données et la parité entre les bricks. Plus efficace en espace qu’un volume répliqué.

  • Avantage : tolérance aux pannes avec moins d’espace perdu
  • Inconvénient : latence plus élevée (reconstruction à la lecture)
  • Cas d’usage : archivage, stockage froid, gros volumes
TypeRedondanceCapacité utilePerformanceCas d’usage
DistribuéNon100%HauteStockage temporaire
Répliqué (replica 3)Oui33%Bonne (lecture)Données critiques
Distribué-répliquéOui50% (replica 2)BonneProduction
DisperséOui~66% (4+2)MoyenneArchivage

Ce lab utilise 3 machines virtuelles KVM sous Ubuntu 24.04 pour créer un cluster GlusterFS complet avec volume répliqué.

  • Hyperviseur KVM avec virsh et virt-install installés
  • 3 VMs (1 Go RAM, 1 vCPU chacune suffisent pour le lab)
  • 1 disque supplémentaire par VM pour les bricks (5 Go minimum)
  • Réseau : les VMs doivent communiquer entre elles (réseau libvirt default)
  1. Télécharger l’image cloud Ubuntu 24.04

    Fenêtre de terminal
    wget -q https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img \
    -O /var/lib/libvirt/images/ubuntu-noble.img
  2. Préparer le fichier cloud-init

    Ce fichier installe GlusterFS, configure l’utilisateur et prépare le disque brick automatiquement :

    cloud-init-gluster.yaml
    #cloud-config
    hostname: gluster1
    users:
    - name: bob
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: sudo
    shell: /bin/bash
    lock_passwd: false
    plain_text_passwd: gluster
    ssh_authorized_keys:
    - ssh-ed25519 AAAA... votre-clé-publique
    packages:
    - glusterfs-server
    - glusterfs-client
    - xfsprogs
    runcmd:
    - systemctl enable glusterd
    - systemctl start glusterd
    - |
    if [ -b /dev/vdb ]; then
    mkfs.xfs -f /dev/vdb
    mkdir -p /data/brick1
    echo '/dev/vdb /data/brick1 xfs defaults 0 0' >> /etc/fstab
    mount -a
    fi

    Dupliquez ce fichier pour les 3 nœuds en changeant le hostname (gluster1, gluster2, gluster3).

  3. Créer les VMs

    Pour chaque nœud, créez le disque système (backing file) et le disque brick :

    Fenêtre de terminal
    # Disque système (image de base partagée)
    qemu-img create -F qcow2 -b /var/lib/libvirt/images/ubuntu-noble.img \
    -f qcow2 /var/lib/libvirt/images/gluster1.qcow2 10G
    # Disque brick (5 Go)
    qemu-img create -f qcow2 /var/lib/libvirt/images/gluster1-brick.qcow2 5G
    # Créer la VM
    virt-install \
    --name gluster1 \
    --memory 1024 \
    --vcpus 1 \
    --disk path=/var/lib/libvirt/images/gluster1.qcow2,format=qcow2 \
    --disk path=/var/lib/libvirt/images/gluster1-brick.qcow2,format=qcow2 \
    --os-variant ubuntu24.04 \
    --network network=default \
    --cloud-init user-data=cloud-init-gluster1.yaml \
    --noautoconsole

    Répétez pour gluster2 et gluster3.

  4. Vérifier que les VMs sont prêtes

    Attendez environ 2 minutes que cloud-init termine, puis vérifiez :

    Fenêtre de terminal
    virsh net-dhcp-leases default
    Expiry Time MAC address Protocol IP address Hostname
    2026-02-28 11:55:00 52:54:00:aa:bb:01 ipv4 192.168.122.55/24 gluster1
    2026-02-28 11:55:00 52:54:00:aa:bb:02 ipv4 192.168.122.56/24 gluster2
    2026-02-28 11:55:00 52:54:00:aa:bb:03 ipv4 192.168.122.57/24 gluster3

GlusterFS est disponible dans les dépôts officiels d’Ubuntu 24.04 :

Fenêtre de terminal
sudo apt update && sudo apt install -y glusterfs-server glusterfs-client xfsprogs
sudo systemctl enable glusterd && sudo systemctl start glusterd

Vérification sur chaque nœud :

Fenêtre de terminal
gluster --version
glusterfs 11.1
Repository revision: git://git.gluster.org/glusterfs.git
Copyright (c) 2006-2016 Red Hat, Inc. <https://www.gluster.org/>
Fenêtre de terminal
systemctl is-active glusterd
active
Fenêtre de terminal
df -h /data/brick1
Filesystem Size Used Avail Use% Mounted on
/dev/vdb 5.0G 130M 4.9G 3% /data/brick1

Ajoutez les entrées dans /etc/hosts sur chaque nœud :

/etc/hosts
192.168.122.55 gluster1
192.168.122.56 gluster2
192.168.122.57 gluster3

Depuis gluster1, ajoutez les deux autres nœuds au pool :

Fenêtre de terminal
sudo gluster peer probe gluster2
peer probe: success
Fenêtre de terminal
sudo gluster peer probe gluster3
peer probe: success

Vérification :

Fenêtre de terminal
sudo gluster peer status
Number of Peers: 2
Hostname: gluster2
Uuid: 83e0c959-c44d-41b4-ad0b-2a892dfdf309
State: Peer in Cluster (Connected)
Hostname: gluster3
Uuid: 480316c9-0d00-4e12-a2b7-99617c1acb39
State: Peer in Cluster (Connected)
Fenêtre de terminal
sudo gluster pool list
UUID Hostname State
83e0c959-c44d-41b4-ad0b-2a892dfdf309 gluster2 Connected
480316c9-0d00-4e12-a2b7-99617c1acb39 gluster3 Connected
29a4daae-6855-4581-b965-c6310ced7a72 localhost Connected
  1. Créer les répertoires de brick sur chaque nœud

    Fenêtre de terminal
    sudo mkdir -p /data/brick1/vol-replica

    Exécutez cette commande sur gluster1, gluster2 et gluster3.

  2. Créer le volume (depuis n’importe quel nœud du pool)

    Fenêtre de terminal
    sudo gluster volume create vol-replica replica 3 transport tcp \
    gluster1:/data/brick1/vol-replica \
    gluster2:/data/brick1/vol-replica \
    gluster3:/data/brick1/vol-replica
    volume create: vol-replica: success: please start the volume to access data
  3. Démarrer le volume

    Fenêtre de terminal
    sudo gluster volume start vol-replica
    volume start: vol-replica: success
  4. Vérifier la configuration

    Fenêtre de terminal
    sudo gluster volume info vol-replica
    Volume Name: vol-replica
    Type: Replicate
    Volume ID: da01e8ee-341f-42ca-b8d7-95107aebfa1f
    Status: Started
    Snapshot Count: 0
    Number of Bricks: 1 x 3 = 3
    Transport-type: tcp
    Bricks:
    Brick1: gluster1:/data/brick1/vol-replica
    Brick2: gluster2:/data/brick1/vol-replica
    Brick3: gluster3:/data/brick1/vol-replica
    Options Reconfigured:
    cluster.granular-entry-heal: on
    storage.fips-mode-rchecksum: on
    transport.address-family: inet
    nfs.disable: on
    performance.client-io-threads: off

Installez le client GlusterFS et montez le volume :

Fenêtre de terminal
sudo apt install -y glusterfs-client
sudo mkdir -p /mnt/gluster-replica
sudo mount -t glusterfs gluster1:/vol-replica /mnt/gluster-replica

Vérification :

Fenêtre de terminal
df -h /mnt/gluster-replica
Filesystem Size Used Avail Use% Mounted on
gluster1:/vol-replica 5.0G 180M 4.8G 4% /mnt/gluster-replica

Écrivez un fichier depuis le client :

Fenêtre de terminal
echo "Bonjour GlusterFS depuis le lab !" | sudo tee /mnt/gluster-replica/test.txt

Puis vérifiez que le fichier est répliqué sur chaque brick :

Fenêtre de terminal
# Sur gluster1
cat /data/brick1/vol-replica/test.txt
# Sur gluster2
cat /data/brick1/vol-replica/test.txt
# Sur gluster3
cat /data/brick1/vol-replica/test.txt

Les 3 nœuds affichent le même contenu :

Bonjour GlusterFS depuis le lab !

Pour monter le volume au démarrage, ajoutez cette ligne dans /etc/fstab du client :

/etc/fstab
gluster1:/vol-replica /mnt/gluster-replica glusterfs defaults,_netdev 0 0
CommandeDescription
gluster peer probe <host>Ajouter un nœud au pool
gluster peer detach <host>Retirer un nœud du pool
gluster peer statusÉtat des connexions entre pairs
gluster pool listListe des nœuds avec UUID et état
CommandeDescription
gluster volume create <nom> ...Créer un volume
gluster volume start <nom>Démarrer un volume
gluster volume stop <nom>Arrêter un volume
gluster volume delete <nom>Supprimer un volume (doit être arrêté)
gluster volume info [nom]Informations détaillées
gluster volume status [nom]État des processus (bricks, shd)
gluster volume listListe des volumes
Fenêtre de terminal
sudo gluster volume status vol-replica
Status of volume: vol-replica
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick gluster1:/data/brick1/vol-replica 58311 0 Y 2972
Brick gluster2:/data/brick1/vol-replica 54911 0 Y 2724
Brick gluster3:/data/brick1/vol-replica 54155 0 Y 2727
Self-heal Daemon on localhost N/A N/A Y 2989
Self-heal Daemon on gluster3 N/A N/A Y 2744
Self-heal Daemon on gluster2 N/A N/A Y 2741
Task Status of Volume vol-replica
------------------------------------------------------------------------------
There are no active volume tasks

Pour un volume répliqué, le Self-Heal répare automatiquement les incohérences. Vérifiez son état :

Fenêtre de terminal
sudo gluster volume heal vol-replica info
Brick gluster1:/data/brick1/vol-replica
Status: Connected
Number of entries: 0
Brick gluster2:/data/brick1/vol-replica
Status: Connected
Number of entries: 0
Brick gluster3:/data/brick1/vol-replica
Status: Connected
Number of entries: 0

Number of entries: 0 signifie qu’il n’y a aucun fichier à réparer. Si ce nombre est élevé après un redémarrage de nœud, le heal est en cours.

GlusterFS expose des dizaines d’options de performance accessibles via gluster volume set :

Fenêtre de terminal
# Augmenter le cache de lecture (défaut : 32 Mo)
sudo gluster volume set vol-replica performance.cache-size 256MB
# Augmenter les threads d'E/S (défaut : 16)
sudo gluster volume set vol-replica performance.io-thread-count 32
# Agrandir la fenêtre d'écriture différée (défaut : 1 Mo)
sudo gluster volume set vol-replica performance.write-behind-window-size 1MB

Vérifier les options appliquées :

Fenêtre de terminal
sudo gluster volume get vol-replica performance.cache-size

Les quotas permettent de limiter l’espace utilisé par répertoire :

Fenêtre de terminal
# Activer les quotas sur le volume
sudo gluster volume quota vol-replica enable
# Limiter le répertoire racine à 2 Go
sudo gluster volume quota vol-replica limit-usage / 2GB
# Vérifier les quotas
sudo gluster volume quota vol-replica list
Path Hard-limit Soft-limit Used Available Soft-limit exceeded? Hard-limit exceeded?
-------------------------------------------------------------------------------------------------------------------------------
/ 2.0GB 80%(1.6GB) 512Bytes 2.0GB No No

Pour identifier les goulots d’étranglement, activez le profiling :

Fenêtre de terminal
sudo gluster volume profile vol-replica start
sudo gluster volume profile vol-replica info
Brick: gluster1:/data/brick1/vol-replica
----------------------------------------
Cumulative Stats:
Block Size: 32b+
No. of Reads: 1
No. of Writes: 1
%-latency Avg-latency Min-Latency Max-Latency No. of calls Fop
--------- ----------- ----------- ----------- ------------ ----
0.00 0.00 ns 0.00 ns 0.00 ns 2 RELEASE
0.00 0.00 ns 0.00 ns 0.00 ns 14 RELEASEDIR
Duration: 122 seconds
Data Read: 34 bytes
Data Written: 34 bytes

Arrêtez le profiling une fois le diagnostic terminé :

Fenêtre de terminal
sudo gluster volume profile vol-replica stop

GlusterFS utilise plusieurs ports TCP qu’il faut autoriser entre les nœuds :

PortServiceDirection
24007glusterd (management)Tous les nœuds
24008glusterd (handshake)Tous les nœuds
49152-49251Bricks (un port par brick)Tous les nœuds

Ouvrez autant de ports que de bricks hébergées sur le nœud, à partir de 49152. Par exemple, 5 bricks sur un même serveur nécessitent les ports 49152–49156.

Fenêtre de terminal
# Exemple avec ufw
sudo ufw allow from 192.168.122.0/24 to any port 24007:24008 proto tcp
sudo ufw allow from 192.168.122.0/24 to any port 49152:49251 proto tcp

GlusterFS supporte le chiffrement TLS pour sécuriser les communications entre les nœuds et les clients :

  1. Générer les certificats sur chaque nœud

    Fenêtre de terminal
    openssl req -new -x509 -days 365 -nodes \
    -out /etc/ssl/glusterfs.pem \
    -keyout /etc/ssl/glusterfs.key \
    -subj "/CN=$(hostname)"
  2. Copier le certificat CA (ou utiliser des certificats signés par la même CA) sur tous les nœuds dans /etc/ssl/glusterfs.ca

  3. Activer TLS sur chaque nœud

    Fenêtre de terminal
    # Créer le fichier qui active TLS pour le management
    sudo touch /var/lib/glusterd/secure-access
    # Redémarrer glusterd
    sudo systemctl restart glusterd
  4. Activer TLS sur le volume

    Fenêtre de terminal
    sudo gluster volume set vol-replica client.ssl on
    sudo gluster volume set vol-replica server.ssl on

Limitez les machines autorisées à monter un volume :

Fenêtre de terminal
sudo gluster volume set vol-replica auth.allow 192.168.122.*
SymptômeCause probableSolution
peer probe: failedPare-feu bloque le port 24007Ouvrir les ports 24007-24008
Transport endpoint is not connectedVolume non démarré ou brick hors lignegluster volume start <vol> et vérifier volume status
Split-brain detectedÉcriture simultanée après partition réseauRésoudre avec gluster volume heal <vol> split-brain
Brick already in useLe répertoire brick est déjà utilisé par un autre volumeUtiliser un sous-répertoire différent
Heal pending entries > 0Fichiers en cours de réparation après panneAttendre la fin du heal, surveiller avec heal info
No space left on deviceBrick pleineAjouter des bricks ou activer les quotas en amont
Connection refused lors du montageglusterd non démarré sur le serveur ciblesystemctl start glusterd sur le serveur
Fenêtre de terminal
# État complet du cluster
sudo gluster peer status
sudo gluster volume status all
# Vérifier les fichiers à réparer
sudo gluster volume heal vol-replica info
# Forcer la réparation manuelle
sudo gluster volume heal vol-replica full
# Logs GlusterFS
sudo tail -50 /var/log/glusterfs/glusterd.log
sudo tail -50 /var/log/glusterfs/bricks/*.log

Un split-brain survient quand deux réplicas divergent après une partition réseau. Pour le résoudre :

Fenêtre de terminal
# Identifier les fichiers en split-brain
sudo gluster volume heal vol-replica info split-brain
# Choisir la source de vérité (la brick la plus récente)
sudo gluster volume heal vol-replica split-brain source-brick \
gluster1:/data/brick1/vol-replica /chemin/fichier
  • Utilisez XFS pour les partitions brick (meilleure performance avec GlusterFS grâce au support des attributs étendus)
  • Disque dédié par brick, jamais la partition système
  • Taille homogène des bricks dans un même volume pour éviter les déséquilibres de distribution
  • Réseau dédié (10 GbE minimum en production) pour le trafic GlusterFS
  • Jumbo frames (MTU 9000) pour réduire l’overhead réseau sur les liaisons rapides
  • Pas de NAT entre les nœuds : GlusterFS nécessite une connectivité directe
  • Activez le quorum serveur sur les volumes répliqués pour prévenir le split-brain : en cas de partition réseau, mieux vaut refuser les écritures que créer des divergences.

    Fenêtre de terminal
    gluster volume set vol-replica cluster.server-quorum-type server
    gluster volume set all cluster.server-quorum-ratio 51%
  • Surveillez le heal régulièrement avec gluster volume heal <vol> info

  • Activez les quotas pour prévenir le remplissage non contrôlé

  • Sauvegardez indépendamment de la réplication (la réplication n’est pas un backup)

  • Testez les pannes : arrêtez un nœud en lab pour valider que l’accès aux données continue

  • GlusterFS agrège le stockage de plusieurs serveurs Linux en un espace unifié, sans serveur de métadonnées central
  • Le Trusted Storage Pool se forme avec gluster peer probe : un nœud peut rejoindre ou quitter le pool à chaud
  • Les volumes répliqués (replica 3) offrent la meilleure résilience pour les données critiques
  • Les bricks doivent être sur des disques dédiés formatés en XFS
  • Le Self-Heal Daemon répare automatiquement les réplicas après une panne
  • En production, isolez le trafic GlusterFS sur un réseau dédié et activez TLS
  • La réplication n’est pas un backup : sauvegardez vos données indépendamment

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn