My Personal Wiki

La théorie, c'est quand on sait tout et que rien ne fonctionne.... La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

Outils pour utilisateurs

Outils du site


linux:volume-disk:glusterfs

Gluster FS Installe & Création de Volume répliqué


Documentation officielle Complète
Je vais prendre 2 serveurs pour la réplication et un client, tous sous Debian 11.
Ip Statique.
Debian1: 20.2 / Debian2: 20.3 / Debian3: 20.4 Sur chaque serveur membre avoir un disque de disponible 50go pour la maquette de réplication.

Configuration IP

Configuration en ip Fixe de préférence.
Carte N°1 Network:

nano /etc/network/interface
#Conf réseau Fixe carte VM 1:
iface ens3 inet static
  address 10.200.20.2/28
  gateway 10.200.20.1
  dns-nameservers 10.200.20.1 1.1.1.1
  dns-domain unifi.vm

Carte dédié au Gulster:

Insert Bash Code

Restart conf:

sudo systemctl restart networking.service ; sudo ifup ens3

FQDN

Dans le Fichier “hosts” de chaque serveur ajouter l'entrée suivante:
Debian1:

127.0.0.1 debian1.unifi.vm debian1 localhost
10.200.20.3 debian2.unifi.vm
10.200.20.3 debian2

Debian2:

127.0.0.1 debian2.unifi.vm debian2 localhost
10.200.20.2 debian1.unifi.vm
10.200.20.2 debian1

Il sera nécessaire de redémarrer le serveur

Debian3 Le Client Gluster:

127.0.0.1 debian3.unifi.vm debian3 localhost
10.200.20.2 debian1.unifi.vm
10.200.20.2 debian1
10.200.20.3 debian2.unifi.vm
10.200.20.3 debian2

Installation

Faire la même manipulation sur chaque serveur membre du cluster.

apt install glusterfs-server nfs-common software-properties-common lvm2 --no-install-recommends

Activation du service

systemctl start glusterd && systemctl enable glusterd

Trusted Pool

Avant d’être en mesure de gérer des volumes de stockage, les membres d’un cluster GlusterFS doivent se reconnaître entre eux et faire partie d’un même trusted pool. Sur le serveur Maitre:

gluster peer probe debian2

renvoie:

« peer probe: success. »

Sur le serveur Esclave:

gluster peer status
Resultat :
Number of Peers: 1
 
Hostname: debian1.unifi.vm
Uuid: ca4bcc87-ef16-4ffd-82a3-c8e29190f43d
State: Peer in Cluster (Connected)

Ajout de table de partition

Sur chaque serveur membre il faudra avoir un disque de disponible pour y créer le volume à mettre en miroir et de ce fait assurer la réplication.
Afin de trouver le disque à dédier au raid utiliser “lsblk”
Ajouter une table de partition sur le disque : cfdisk /dev/vdc
Créer le LVM:

pvcreate /dev/vdc1

(Volume Physique)

vgcreate lvmgfs1 /dev/vdc1

(volume Group)

lvcreate -l 100%VG -n gbrick1 lvmgfs1

(volume Logic) formatageXFS du volume logic gbrick1

mkfs.xfs -b size=1024 /dev/lvmgfs1/gbrick1

Pour le serveur Debian2 le Volume Group sera “ lvmgfs2 ” et le Volume Logique “ gbrick1


Fstab

Ajouter une entrée dans fstab:

echo '/dev/lvmgfs1/gbrick1 /mnt/glusterfs/vol0 xfs defaults 0 0' >> /etc/fstab

Créer et monter un dossier où seront « stockées » les données :

mkdir -p /mnt/glusterfs/vol0 && mount /mnt/glusterfs/vol0

Créer le dossier pour accueillir le volume GlusterFS :

mkdir /mnt/glusterfs/vol0/brick1

Sur le serveur Debian2 la Brick sera “ brick1 ” également


Volume Raid1

Creer le volume Raid1 sur le serveur Esclave depuis le maitre:

gluster volume create gvol0 replica 2 transport tcp debian1:/mnt/glusterfs/vol0/brick1 debian2:/mnt/glusterfs/vol0/brick1 force

Renvoie:

volume create: gvol0: success: please start the volume to access data
gluster volume start gvol0
renvoie: volume start: gvol0: success

Suppression d'un volume Raid
Explication:  
Je me suis trompé dans le N° de brick a mappé l'ors de la création du RAID .
Du coup cela me fait un décalage dans magestion de N° de Brick.

Voici comment faire:

Remove

sudo gluster volume remove-brick gvol0 replica 1 debian2:/mnt/glusterfs/vol0/brick2 force
Remove-brick force will not migrate files from the removed bricks, so they will no longer be available on the volume.
Do you want to continue? (y/n) y
volume remove-brick commit force: success

Le paramètre replica 1 est obligatoire afin de préciser qu'il restera plus qu'un nœud après suppression sans replica.

Add

Ajouter la nouvelle brick:

sudo gluster volume add-brick gvol0 replica 2 debian2:/mnt/glusterfs/vol0/brick1 force
volume add-brick: success

Tout dois être ok !
Vérifier en faisant un test depuis le client.
8-)

Contrôle

sudo gluster volume status
Status of volume: gvol0
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick debian1:/mnt/glusterfs/vol0/brick1    49152     0          Y       517  
Brick debian2:/mnt/glusterfs/vol0/brick1    49152     0          Y       519  
Self-heal Daemon on localhost               N/A       N/A        Y       530  
Self-heal Daemon on debian1.unifi.vm        N/A       N/A        Y       529  
 
Task Status of Volume gvol0
------------------------------------------------------------------------------
There are no active volume tasks
sudo gluster volume info
 
Volume Name: gvol0
Type: Replicate
Volume ID: 1a31d66c-a98c-40ea-8007-6893f30f65b4
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: debian1:/mnt/glusterfs/vol0/brick1
Brick2: debian2:/mnt/glusterfs/vol0/brick1
Options Reconfigured:
performance.client-io-threads: off
nfs.disable: on
transport.address-family: inet
storage.fips-mode-rchecksum: on
cluster.granular-entry-heal: on

Client(s)

Installer les binaires du Client GlusterFs:

apt-get -y install glusterfs-client

Point de Montage

Sous /mnt créer un répertoire de montage nommé “glusterfs”

mkdir /mnt/glusterfs

Monter y le volume GlusterFs du serveur Maître:

mount -t glusterfs debian1:/gvol0 /mnt/glusterfs

Persistant

echo 'debian1:/gvol0 /mnt/glusterfs glusterfs defaults,_netdev 0 0 ' >> /etc/fstab

Tester le réplica:
Créons un fichier aléatoire avec par exemple la commande ci-dessous.

dd if=/dev/urandom of=/mnt/glusterfs/Debian3.test  bs=1024 count=10240

Redondance

Il vous est possible de monter vos volume en mode redondé: 8-O

Fstab Methode

Monter le volume en utilisant le paramètre backupvolfile-server dans fstab!!

echo 'debian1:/gvol0 /mnt/glusterfs glusterfs defaults,_netdev,backupvolfile-server=debian2 0 0' >> /etc/fstab

Fichier de configuration de volume

Dans /etc/glusterfs/ creer un fichier de configuration des volumes: (datastore.vol)

nano /etc/glusterfs/datastore.vol

Contenu de la configuration

volume remote1
  type protocol/client
  option transport-type tcp
  option remote-host debian1.unifi.vm
  option remote-subvolume /mnt/glusterfs
end-volume
 
volume remote2
  type protocol/client
  option transport-type tcp
  option remote-host debian2.unifi.vm
  option remote-subvolume /mnt/glusterfs
end-volume
 
volume replicate
  type cluster/replicate
  subvolumes remote1 remote2
end-volume
 
volume writebehind
  type performance/write-behind
  option window-size 1MB
  subvolumes replicate
end-volume
 
volume cache
  type performance/io-cache
  option cache-size 512MB
  subvolumes writebehind
end-volume

Il ne vous restera plus qu'à le monter dans FSTAB :

echo'/etc/glusterfs/datastore.vol /mnt/glusterfs glusterfs rw,allow_other,default_permissions,max_read=131072 0 0' >> /etc/fstab 

Ce type de configuration est fortement recommandée dans des grosses infrastructures avec plusieurs Node.


Vérification

Pour confirmer que la réplication est fonctionnelle, il suffit de vérifier avec une simple commande ls que le fichier est présent sur les bricks de chacun des deux serveurs GlusterFS :
Sur chacun des serveurs Membres:

ls /mnt/glusterfs/vol0/brick1/

pour le serveur Debian1 (Maître)

ls /mnt/glusterfs/vol0/brick1/

pour le serveur Debian2 (Esclave) Le fichier “Debian3.test” est bien synchronisé sur chacun des serveurs Membres.

Tolérance de panne

Nous éteindrons le serveur Debian1 pour le test:

sudo halt -p

Sur le Client Debian3 dans les logs: /var/log/glusterfs/mnt-glusterfs.log

[2022-05-23 16:57:45.842409 +0000] C [rpc-clnt-ping.c:152:rpc_clnt_ping_timer_expired] 0-gvol0-client-1: server 10.200.20.3:49152 has not responded in the last 42 seconds, disconnecting.
[2022-05-23 16:57:45.843598 +0000] I [MSGID: 114018] [client.c:2227:client_rpc_notify] 0-gvol0-client-1: disconnected from client, process will keep trying to connect glusterd until brick's port is available [{conn-name=gvol0-client-1}]

Nous voyons bien la déconnexion avec un time out de 42sec.

Modifier le Time Out

Un point que vous aurez noté également, c’est que la bascule n’est pas immédiate. En pratique, le délai est de 42 secondes. Pour ramener ce délai à une valeur plus raisonnable de 5 secondes, modifions notre nœud comme suit :

sudo gluster volume set gvol0 network.ping-timeout 5
volume set: success

Pour lister vos volumes GlusterFs:

sudo gluster volume list

Ce changement est tracé dans le log /var/log/glusterfs/glustershd.log avec une ligne par nœud comme celle-ci :

[2022-05-23 17:14:43.851448 +0000] I [rpc-clnt.c:1946:rpc_clnt_reconfig] 0-gvol0-client-1: changing ping timeout to 5 (from 42)

Ligne de Commande

Peer Commands

The peer commands are used to manage the Trusted Server Pool (TSP).
Command 	Syntax 	Description
peer probe 	peer probe server 	Add server to the TSP
peer detach 	peer detach server 	Remove server from the TSP
peer status 	peer status 	Display the status of all nodes in the TSP
pool list 	pool list 	List all nodes in the TSP

Volume Comands

Command 	Syntax 	Description
volume create 	volume create volname [options] bricks 	Create a volume called volname using the specified bricks with the configuration specified by options
volume start 	volume start volname [force] 	Start volume volname
volume stop 	volume stop volname 	Stop volume volname
volume info 	volume info [volname] 	Display volume info for volname if provided, else for all volumes on the TSP
volume status 	volumes status[volname] 	Display volume status for volname if provided, else for all volumes on the TSP
volume list 	volume list 	List all volumes in the TSP
volume set 	volume set volname option value 	Set option to value for volname
volume get 	volume get volname <option|all> 	Display the value of option (if specified)for volname , or all options otherwise
volume add-brick 	volume add-brick brick-1 ... brick-n 	Expand volname to include the bricks brick-1 to brick-n
volume remove-brick 	volume remove-brick brick-1 ... brick-n \<start|stop|status|commit|force> 	Shrink volname by removing the bricks brick-1 to brick-n . start will trigger a rebalance to migrate data from the removed bricks. stop will stop an ongoing remove-brick operation. force will remove the bricks immediately and any data on them will no longer be accessible from Gluster clients.
volume replace-brick 	volume replace-brick volname old-brick new-brick 	Replace old-brick of volname with new-brick
volume delete 	volume delete volname 	Delete volname

Plus d'infosman glusterfs


Sécurité

Il est possible de restreindre l’accès à notre volume en définissant une ACL similaire à ce qui existe en NFS via le fichier /etc/exports.

gluster volume set gvol0 auth.allow 10.200.20.3
volume set: success

l est également possible de définir une wildcard, par exemple 10.200.20.* afin d’autoriser tout un réseau. Dans cet exemple, nous avons autorisé explicitement une adresse IP à se connecter au volume.

Nous aurions également pu autoriser un nom d’hôte ou plusieurs adresses IP ou noms séparés par des virgules. Le fait de définir l’attribut auth.allow a comme effet immédiat d’interdire toutes les autres machines qui n’ont pas été explicitement autorisées. Pour revenir au comportement par défaut, il faut autoriser le caractère wildcard (*) tout simplement. A l’inverse, l’attribut auth.reject n’interdit aucune machine par défaut (auth.reject avec comme valeur NONE). Il sert comme vous l’avez deviné à interdire explicitement une machine. Pour résumer, le contrôle d’accès a une logique similaire avec ce qui existe côté TCP Wrappers.


Corbeille sur le Volume

GlusterFS sait gérer une corbeille au niveau volume pour conserver les fichiers supprimés. Le dossier est créé automatiquement par gluster et ne peut être supprimé. Fait intéressant, gluster sait si on le lui dit, tirer parti de cette corbeille pour ses opérations internes. Activons donc une corbeille pour les fichiers de moins de 10 Mio.

$ gluster volume set gvol0 features.trash on
$ gluster volume set gvol0 features.trash-dir "Corbeille"
$ gluster volume set gvol0 features.trash-max-filesize 10485760
$ gluster volume set gvol0 features.trash-internal-op on

Dépannage

Node HS ? Pas de panique !

Un incident majeur sur un équipement sensible d’un système d’information, c’est bien entendu quelque chose auquel on se doit d’être préparé. Dans un système hautement disponible, tout élément qui n’est pas considéré comme un point unique de défaillance (SPOF) doit pouvoir être indisponible sans impacter fortement le bon fonctionnement du système. Nous nous retrouvons dans un état de fonctionnement dégradé. Si le système défaillant ne peut être dépanné, un processus de reconstruction doit être mis en œuvre.

Nous allons considérer que le nœud debian1 est irrémédiablement défaillant, la VM est même supprimée. Cela se vérifie par la commande suivante :

Status

gluster volume heal gvol0 info
Brick debian1:/mnt/glusterfs/vol0/brick1
Status: DisConnected
Number of entries: 0
 
Brick debian2:/mnt/glusterfs/vol0/brick1
Status: Connected
Number of entries: 0

Voyons étape par étape comment le nouveau serveur nommé Debian4 va prendre de relais de celui-ci. Pour cela, la première étape que je ne vais pas détailler consiste à provisionner un nouveau serveur avec le disque de données et les dépendances comme indiqué précédemment.

Ajout d'un nœud

Premièrement, on ajoute le nouveau nœud et on va confirmer qu’on a bien un nouveau nœud présent, et un ancien toujours connu du cluster mais manquant :

gluster peer probe Debian4
peer probe: success.
 
gluster peer status
Number of Peers: 2
 
Hostname: debian1
Uuid: a920b020-9e5a-46f6-b073-1cc8ec00ba0e
State: Peer in Cluster (Disconnected)
 
Hostname: debian4
Uuid: f2a03465-11bb-4c2a-a882-22933cfa2d08
State: Peer in Cluster (Connected)

Remplacement

Remplaçons maintenant la brick du debian1 par celle de notre nouveau serveur debian4 et vérifions son état de santé :

gluster volume replace-brick gvol0 debian1:/mnt/glusterfs/vol0/brick1 debian4:/mnt/glusterfs/vol0/brick1 commit force
volume replace-brick: success: replace-brick commit force operation successful

On réconcilie le volume :

Réconciliation

gluster volume heal gvol0 full
Launching heal operation to perform full self heal on volume gvol0 has been successful
Use heal info commands to check status
gluster volume heal gvol0 info
Brick debian4:/mnt/glusterfs/vol0/brick1
Status: Connected
Number of entries: 0
 
Brick debian2:/mnt/glusterfs/vol0/brick1
Status: Connected
Number of entries: 0

Et depuis le nouveau node (Debian4), lançons une synchronisation :

Synchronisation

root@debian4:debian4:/mnt/glusterfs/vol0/brick1# gluster volume sync debian2 gvol0
Sync volume may make data inaccessible while the sync is in progress. Do you want to continue? (y/n) y

Il nous reste une dernière étape :
répliquer le volume id dans les attributs étendus du système de fichiers et le propager au second serveur.
Pour le récupérer, il faut lancer la commande suivante :
Sur le serveur debian2.

Volume-id

root@debian2:~# getfattr -n trusted.glusterfs.volume-id /mnt/glusterfs/vol0/brick1/
getfattr: Suppression des « / » en tête des chemins absolus
# file: mnt/glusterfs/vol0/brick1/
trusted.glusterfs.volume-id=0seEhN1zXZTFOXmRGV92ibvw==

Sur le nouveau serveur, on applique l’ID du volume sur la brick :

root@debian4://mnt/glusterfs/vol0/brick1/# setfattr -n trusted.glusterfs.volume-id -v '0seEhN1zXZTFOXmRGV92ibvw==' /mnt/glusterfs/vol0/brick1/
service glusterfs-server restart

La configuration de notre volume est bien mise à jour comme on peut le voir ci-dessous. Dans le cadre d’un volume distribué, il faudrait lancer un rééquilibrage (rebalance) du volume :

Check Status

root@debian2~# gluster volume info gvol0
Volume Name: gvol0
Type: Replicate
Volume ID: 1c493043-9c2d-4be6-afcd-8512577342c9
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
brick-0=debian4:-mnt-glusterfs-vol0-brick1
brick-1=debian2:-mnt-glusterfs-vol0-brick1
Options Reconfigured:
performance.readdir-ahead: on
cluster.self-heal-daemon: enable
network.ping-timeout: 5

Enlever une Brick

Enfin, il ne reste plus qu’à retirer l’ancien nœud des peers autorisés dans le trusted pool :

root@debian2:~# gluster peer detach debian1
peer detach: success
root@debian2:~# gluster peer status
Number of Peers: 1
Hostname: debian4
Uuid: f2a03465-11bb-4c2a-a882-22933cfa2d08
State: Peer in Cluster (Connected)

Il ne doit plus apparaître dans la liste des nœuds :

gluster pool list

Vous savez désormais comment remplacer un nœud défaillant, sachant que ce processus s’applique également en cas de migration de la brick de stor0 vers un nouveau serveur.


Étendre le volume

Quand l’espace disque commence à manquer, une première solution peut être d’étendre l’espace libre sur les bricks, d’où l’intérêt d’être partis au départ sur du LVM. Une autre solution est d’étendre le cluster avec de nouveaux nœuds afin d’améliorer la disponibilité du système dans son ensemble. Cette extension du cluster se fait en outre sans interruption de service.

Pour étendre un cluster répliqué, il faut ajouter un nombre de bricks avec un nombre multiple du nombre de réplicas. Nous avons monté un volume à deux réplicas, il nous faut donc ajouter deux bricks supplémentaires. La commande gluster volume info gvol0 nous permet de le confirmer (1×2). Nous allons ajouter donc deux serveurs debian5 et debian6, avec le volume disque préparé et le package glusterfs-server installé.

La première étape consiste à autoriser les deux nœuds avec la commande gluster peer probe vue précédemment. On peut donc ensuite ajouter des bricks au volume en spécifiant les bricks de nos deux nouveaux serveurs :

root@debian4:~# gluster volume add-brick gvol0 debian5:/mnt/glusterfs/vol0/brick1 debian6:/mnt/glusterfs/vol0/brick1
 
volume add-brick: success

Vérifions notre volume, nous devons retrouver nos deux bricks supplémentaires.

root@debian4:~# gluster volume info gvol0
Volume Name: gvol0
Type: Distributed-Replicate
Volume ID: 78484dd7-35d9-4c53-9799-1195f7689bbf
Status: Started
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick debian4:/mnt/glusterfs/vol0/brick1
Brick debian2:/mnt/glusterfs/vol0/brick1
Brick debian5:/mnt/glusterfs/vol0/brick1
Brick debian6:/mnt/glusterfs/vol0/brick1
Options Reconfigured:
performance.readdir-ahead: on

Notre volume à deux réplicas comportant quatre nœuds se comporte donc désormais comme un volume distribué répliqué par la magie de l’extension du volume. Seul problème, il n’y a aucune donnée sur les serveurs debian5 et debian6, ce qui n’a pas eu pour effet de libérer de l’espace disque sur les deux premiers serveurs. Il est donc nécessaire de répartir la volumétrie sur l’ensemble des bricks qui composent le volume :

root@debian4:~# gluster volume rebalance gvol0 start< volume rebalance: gvol0: success: Rebalance on gvol0 has been started successfully. Use rebalance status command to check status of the rebalance process. 
ID: dffbed2e-3a0c-4d7d-9f43-9d978a546b04

Pour vérifier il suffit de lancer la même commande avec le paramètre status :

root@debian4:~# gluster volume rebalance gvol0 status
                                    Node Rebalanced-files          size       scanned      failures       skipped               status   run time in secs
                               ---------      -----------   -----------   -----------   -----------   -----------         ------------     --------------
                               localhost                  5        0Bytes            10             0             0            completed               2.00
                                   debian2                0        0Bytes             0             0             0            completed               1.00
                                   debian5                0        0Bytes             2             0             0            completed               1.00
                                   debian6                0        0Bytes             0             0             0            completed               1.00
volume rebalance: gvol0: success

Les Quotas

GlusterFS dispose d’un mécanisme permettant de définir des quotas au niveau dossier.
Ils ne sont pas activés par défaut. Pour changer ce comportement :

root@debian4:~# gluster volume quota gvol0 enable
volume quota : success

Nous allons appliquer une limite à 1Gio sur le sous-dossier subdir de notre volume. Ce dossier devra avoir été impérativement créé depuis le client glusterfs ajouté précédemment. Pour créer ce quota :

root@debian4:~# gluster volume quota gvol0 limit-usage /subdir 1GB
volume quota : success

Si nous avions souhaité créer un quota au niveau du volume, il suffit d’indiquer / dans le chemin. Créons un fichier approchant le quota depuis notre client GlusterFS :

root@debian3:/mnt/glusterfs/subdir# dd if=/dev/zero of=/mnt/glusterfs/subdir/toto bs=1024 count=1024000
1024000+0 enregistrements lus
1024000+0 enregistrements écrits
1048576000 bytes (1,0 GB, 1000 MiB) copied, 223,044 s, 4,7 MB/s

Et voyons l’état du quota :

root@stor1:~# gluster volume quota gvol0 list
                  Path                   Hard-limit  Soft-limit      Used  Available  Soft-limit exceeded? Hard-limit exceeded?
-------------------------------------------------------------------------------------------------------------------------------
/subdir                                    1.0GB     80%(819.2MB) 1000.0MB  24.0MB             Yes                   No

Reprenons notre commande précédente, en créant un fichier au nom différent, la création est bien interrompue sur le dépassement de quota hard :

root@debian3:/data# dd if=/dev/zero of=/mnt/glusterfs/subdir/tata bs=1024 count=1024000
dd: erreur d'écriture de '/mnt/glusterfs/subdir/tata': Débordement du quota d'espace disque
dd: fermeture du fichier de sortie '/mnt/glusterfs/subdir/tata': Débordement du quota d'espace disque

Vous trouverez les infos de config dans /var/lib/glusterd.


linux/volume-disk/glusterfs.txt · Dernière modification : de 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki