Provision du Datacenter - Installation d'un Serveur de fichiers GlusterFS - [Raspberry PI 4/Rock64]

[ NIVEAU ] Débutant

Cette procédure permet l’installation d’un serveur permettant de stocker des fichiers. Il distribura ses fichiers pour l’ensemble du Datacenter par l’intermédiaire du service “GlusterFS”.

Pré-requis

Pour exécuter cette opération vous devez :

  • disposer d’un serveur Raspberry PI4 muni de RaspiOS 64bits ou bien d’un Rock64 muni de ArmBian 64Bits
  • avoir suivi la procédure : Suivre la procédure concernant l’installation des systèmes d’exploitation
  • savoir exécuter une commande dans une console Linux
  • savoir utiliser l’éditeur “vi”
  • être connecté “root” à la console, pour les utilisateur sudo : tapez sudo bash
  • disposer d’un disque de stockage USB, pour des raisons de performance, préférez un disque SSD - USB3. Adaptez la taille du volume à vos besoins.

Pourquoi GlusterFS ?

Le plus simple aurait été d’installer un serveur NFS, mais la particularité de GlusterFS est qu’il peut être étendu comme un service RAID. Si dans le temps pour souhaitez disposer d’une copie “temps réel” de vos fichiers, il suffira d’ajouter un serveur et de l’intégrer au cluster GlusterFS.

Installation et montage du disque SSD chiffré.

Suivre la procédure permettant de chiffrer le contenu d’un disque.

Installation des paquets nécessaires

apt-get -y update
apt-get -y install glusterfs-server
# enable at boot
systemctl enable glusterd
systemctl start glusterd
systemctl status glusterd

La console doit renvoyer “Active: active” :

glusterd.service - GlusterFS, a clustered file-system server
   Loaded: loaded (/lib/systemd/system/glusterd.service; disabled; vendor preset: enabled)
   Active: active (running) since Wed 2020-12-23 18:18:22 CET; 8s ago

Paramétrage GlusterFs

Création des volumes GlusterFS

L’objet de cette procédure est de créer deux volumes GlusterFS pour : nextcloud et matrix. Le disque est monté sur "/Disk1" et dispose de deux répertoires : “nextcloud”, “matrix” Je vais donc créer deux volumes qui seront ensuite partagés par GlusterFS.

ATTENTION : Pour des répertoires comportant déjà des fichiers : voir plus bas le chapitre “Problèmes rencontrés”

# Initialisation du réseau Gluster
gluster peer probe $(hostname)
# Réponse :
#    peer probe: success.
# Création des volumes nommé gfsvol-nextcloud et gfsvol-matrix
gluster volume create gfsvol-nextcloud  $(hostname):/Disk1/nextcloud
# Réponse :
#    volume create: gfsvol-nextcloud: success: please start the volume to access data
gluster volume create gfsvol-matrix  $(hostname):/Disk1/matrix
# Réponse :
#    volume create: gfsvol-matrix: success: please start the volume to access data
# Démarrage du volume 
gluster volume start gfsvol-nextcloud
# Réponse :
#    volume start: glusterfsvolume: success
gluster volume start gfsvol-matrix
# Réponse :
#    volume start: glusterfsvolume: success

Gestion des volumes

Opérations Commandes Remarques
Créér un volume gluster volume create [nom du volume] $(hostname):[Chemin du répertoire local]
Démarrer un volume gluster volume start [nom du volume] démarrre le partage
Stopper un volume gluster volume stop [nom du volume] stoppe le partage
Supprimer un volume gluster volume delete [nom du volume] Ne supprime pas les données contenu dans le volume

Statut du cluster

gluster v status

Doit renvoyer un résultat similaire :

Status of volume: gfsvol-matrix
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick raspi6:/Disk1/matrix-synapse          49153     0          Y       1043 
 
Task Status of Volume gfsvol-matrix
------------------------------------------------------------------------------
There are no active volume tasks
 
Status of volume: gfsvol-nextcloud
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick raspi6:/Disk1/nextcloud               49152     0          Y       1000 
 
Task Status of Volume gfsvol-nextcloud
------------------------------------------------------------------------------
There are no active volume tasks

Vérifications Post-installation

Il est important de vérifier à partir d’un autre serveur, l’accessibilité des volumes :

apt-get -y install glusterfs-client
# Puis monter un volume
mount -t glusterfs [Ip serveur gluster]:[nom de volume] [Point de montage]
# ex : mount -t glusterfs 192.168.1.53:nextcloud-config /mnt

Vérifier :

  • Le système de fichier comporte des fichiers (commande ls)
  • Le contenu d’un fichier (commande cat)
  • Créer un dossier/répertoire
  • Supprimer un dossier/répertoire.
# Démonter le système de fichier
umount /mnt

Ouverture des ports de communication (Firewall)

Protocole Port Sens Remarque
TCP 24007 Input
TCP 49152 Input Premier volume partagé
TCP 49153 Input Second volume partagé
TCP 4915X Input Xeme volume partagé
TCP 491XX Input XXeme volume partagé

Glusterfs utilise un port par volume partagé, et commence à 49152.

Liste des ports ouverts par Glusterfs

En utilisant la commande gluster v status :

echo "Ports ouverts pour les volumes Gluster"
PORTS=`service glusterd status | grep "listen-port" | sed 's/.*\.listen-port=//'|sort -u`
echo "$PORTS"

Ajout des règles firewall

## Interface réseau datacenter
IFACE=eth0
## Chemin iptables
IPT="/usr/sbin/iptables"
## Liste des ports
PORTS=`service glusterd status | grep "listen-port" | sed 's/.*\.listen-port=//'|sort -u`
## Ajout des règles - Ouverture firewall input/output
for P in $PORTS
do
   echo "Opening port $P"
   $IPT -m comment --comment "[GLUSTERFS] Volume INPUT $P" -A INPUT -i $IFACE -p tcp -m tcp --dport $P -j ACCEPT
   if [ "$?" != "0" ];then
      echo "Error - iptables - INPUT $P"
      exit 1
   fi
   $IPT -m comment --comment "[GLUSTERFS] Volume OUTPUT $P" -A OUTPUT -o $IFACE -p tcp -m tcp --sport $P -m state --state RELATED,ESTABLISHED -j ACCEPT
   if [ "$?" != "0" ];then
      echo "Error - iptables - OUTPUT $P"
      exit 1
   fi
done
echo "Sauvegarde des règles"
/usr/sbin/iptables-save > /etc/iptables/rules.v4

Sauvegarde/Restauration des fichiers

Personnellement j’effectue une sauvegarde quotidienne externe, vers une “box de stockage” joignable par sshs ou borgbackup. Avec “Borgbackup”, les fichiers sont chiffrés au moyen d’une clé personnelle, l’hébergeur ne peut, par conséquent, pas “voir” le contenu du stockage.

Conclusion

Le service GlusterFS est démarré. Cette procédure n’aborde pas la réplication, mais une fois initialisé, il est assez trivial d’ajouter des serveurs pour implémenter une réplication.

Problèmes rencontrés

Déplacement de volumes - volume create: xxxxxxx: failed: xxxx/xxx is already part of a volume

J’ai déplacé un répertoire associé à un volume Gluster sans le stopper, il est donc impossible de le recréer. Il faut réinitialiser les attributs du volume, exemple le problème est situé sur /Disk/config, impossible de créer le volume avec le message “volume create: nextcloud-config: failed: /Disk/config is already part of a volume”

setfattr -x trusted.glusterfs.volume-id /Disk/config
setfattr -x trusted.gfid /Disk/config
rm -rf /Disk/config/.glusterfs

ou bien supprimer le répertoire (ici /Disk/config) puis le re-créer, cà marche aussi :)

Création d’un volume avec des données existantes

J’ai créé un volume à partir d’un répertoire disposant déjà de tous les fichiers de données Nextcloud. Ce n’est pas la bonne pratique, puisque ce sont les clients Gluster qui permettent de mettre à jour les meta-données de GlusterFS. La conséquence : Les données sur le serveurs existent, mais les clients ne “voient” qu’une partie de ces fichiers. J’ai trouvé un lien permmettant d’y remédier, je ne l’ai pas essayé (lien trouvé après avoir reinjecté les donnéees au travers d’un client gluster) :

Exemple:

  • déplacez vos données nextcloud vers /Disk1/datanextcloud,
  • création du volume glusterfs, avec ce répertoire qui comporte une multitude de fichiers : gluster v create gfs-nextcloudata $(hostname):/Disk1/datanextcloud
  • Je me connecte avec un client, le client ne voit qu’une dizaine de fichiers !!!!
  • Proposition de Chris :
# Sur le serveur Gluster
# Monter le volume incriminé 
mount -t glusterfs 127.0.0.1:gfs-nextcloudata /mnt
cd /Disk/datanextcloud
find . -exec stat '/mnt/{}' \;

By doing this on each server, you’re accessing each and every one of those files and folders causing Gluster to create the metadata and that makes the data appear in the Gluster volume. Hooray!