Ceci est une ancienne révision du document !
GlusterFS ou la quête de la simplicité
De manière à ce que les travaux pratiques de chacun entraînent le minimum d'effets de bord, il est proposé de réaliser toute cette séance dans un environnement virtualisé installé sur chaque machine d'auditeur.
Les archives des machines virtuelles fournies sont issus de l'outil VirtualBox
Devant héberger le gestionnaire de machines virtuelles VirtualBox, la machine “hôte” doit disposer de :
Le système d'exploitation hôte doit disposer :
Une allergie à la commande en ligne rend la réalisation de ces exercices très très difficile. Il est donc recommandé d'avoir une certaine expérience d'un shell quelconque.
Les machines virtuelles fournies sont basées sur la distribution Debian Jessie. De manière à disposer d'une version récente de GlusterFS, l'archive de rétroportage officielle (paquets backports ) ont été tous installés. Cela permet de disposer d'un noyau de version 4.7 et de GlusterFS de version 3.8.4.
Deux archives de machines virtuelles sont à télécharger puis à intégrer.
L'installation de la machine ANF-GlusterClient ne requiert aucune modification (ni sur le nom, ni sur l'adresse MAC).
En effet, pour éviter tout effet de bord sur les communications réseau, un réseau interne privé de nom forgluster est intégré pour chaque machine virtuelle.
Cette machine ANF-GlusterClient , disposant de 2 interfaces, établit une communication entre l’extérieur (communication avec l’hôte et Internet) et le réseau interne forgluster . Elle dispose également des services réseau internes classiques comme le DHCP et le DNS.
Cette machine intègre en outre un environnement graphique XFCE permettant de se connecter simplement et de suivre
les serveurs. Au démarrage de la machine, cet environnement se connecte automatiquement sur le login alpha de mot de passe AlphaANF2016 .
Si le mode graphique de VirtualBox ne convient pas, il est possible d'accéder directement à ANF-GlusterClient à partir de la machine hôte (ou du réseau local) en utilisant le protocole SSH ou x2go sur le port 22322.
L'installation des 4 serveurs GlusterFS s'effectue par clonage à l'installation de la machine ANF-GlusterMatrix.
Le clonage s'effectue en installant plusieurs fois la matrice mais en procédant à deux modifications :
Le serveurs ont leurs adresses IP fournies par la machine Gluster-Client. Il est donc indispensable de d'abord démarrer le Gluster-Client.
Une fois la machine ANF-GlusterClient démarrée (directement sur le compte de l'utilisateur alpha), les machines serveurs peuvent être démarrées à leur tour.
En démarrant ANF-GlusterServer1, puis ANF-GlusterServer2, ensuite ANF-GlusterServer3, enfin ANF-GlusterServer4 successivement, les serveurs doivent disposer respectivement des noms peer1, peer2, peer3, peer4.
root
: GlusterANF2016
alpha
: AlphaANF2016
La commande clush
de ClusterShell est utilisée pour vérifier que les 4 serveurs sont bien accessibles par le client. Elle permet de s'adresser à un groupe de machines en leur appliquant la même commande.
Pour la suite du TP, tout ou presque se fera par la commande en ligne. Donc, il est nécessaire d'ouvrir un terminal (icône en bas du bureau). De plus, la majorité des commandes sont à exécuter comme root
.
De manière à simplifier le déroulé du TP en effectuant des copier/coller, il est possible d'installer un navigateur graphique dans gluster-client. Pour cela, taper dans un terminal :
sudo apt-get install -t jessie-backports -y firefox-esr
Appliquons la commande w
aux quatres serveurs de peer1 à peer4, nous avons :
clush -w root@peer[1-4] w
Nous avons comme résultat quelque chose de comparable à :
peer2: 15:30:54 up 23 min, 0 users, load average: 0,00, 0,00, 0,00 peer2: USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT peer3: 15:30:54 up 22 min, 0 users, load average: 0,08, 0,02, 0,01 peer3: USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT peer4: 15:30:54 up 21 min, 0 users, load average: 0,00, 0,00, 0,00 peer4: USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT peer1: 15:30:53 up 25 min, 0 users, load average: 0,00, 0,00, 0,00 peer1: USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
Si nous cherchons à vérifier que chaque serveur dispose d'un serveur GlusterFS démarré (de nom glusterd
) :
clush -w root@peer[1-4] ps aux | grep glusterd
Nous obtenons comme résultat (au numéros de PID près) :
peer4: root 1344 0.0 3.5 400828 17888 ? Ssl 15:09 0:00 /usr/sbin/glusterd -p /var/run/glusterd.pid peer3: root 1321 0.0 3.6 400828 18192 ? Ssl 15:08 0:00 /usr/sbin/glusterd -p /var/run/glusterd.pid peer2: root 1333 0.0 3.5 400828 18128 ? Ssl 15:07 0:00 /usr/sbin/glusterd -p /var/run/glusterd.pid peer1: root 1341 0.0 3.5 400828 18024 ? Ssl 15:05 0:00 /usr/sbin/glusterd -p /var/run/glusterd.pid
Toutes les commandes permettant de gérer des volumes GlusterFS, les pairs, le chiffrement, des géoréplication, etc… exploitent la commande gluster
.
Sous GlusterFS, tous les serveurs sont équivalents : il n'existe pas de serveurs de méta-données, de frontale de connexion. Ainsi, chaque composant d'une grappe de stockage distribué est équivalent à l'autre.
Ces composants assurant indifféremment stockage, gestion des méta-données et service de fichiers sont appelés des “pairs” (peer en anglais) et leur gestion se réalise par la commande unique gluster peer
Objectifs :
La première commande consiste à lister les pairs (les serveurs) susceptibles de partager des volumes.
gluster peer status
Pour la lancer sur un des serveurs en particulier, par exemple peer1 à partir du client
ssh root@peer1 gluster peer status
La commande renvoit :
Number of Peers: 0
Pour le lancer sur tous les serveurs :
clush -w root@peer[1-4] gluster peer status
La commande clush
renvoit alors :
peer1: Number of Peers: 0 peer3: Number of Peers: 0 peer4: Number of Peers: 0 peer2: Number of Peers: 0
Il suffit de se connecter sur un des serveurs et de préciser le serveur à associer. Par exemple, pour associer le peer4 au peer1, il suffit de taper :
gluster peer probe peer4
Pour réaliser cette opération directement à partir de la machine cliente, nous utilisons :
ssh root@peer1 gluster peer probe peer4
En cas de succès, la commande renvoit comme message :
peer probe: success.
Pour assurer l'association des pairs peer3 et peer2 :
ssh root@peer1 gluster peer probe peer3
peer probe: success.
ssh root@peer1 gluster peer probe peer2
peer probe: success.
De manière à vérifier que les serveurs peer1 à peer4 font désormais partie de la même grappe, nous utilisons :
ssh root@peer1 gluster pool list
La commande renvoit :
UUID Hostname State 26898237-86c7-4687-8660-703de9cd48b0 peer4 Connected d7ae008b-1269-4992-bb1b-bd858eeb1ccc peer3 Connected a6fd556e-7fa9-4c3c-8190-8b33805d47d3 peer2 Connected 25dbbaa2-980d-42a8-bd04-426218d9673a localhost Connected
La machine peer1 sur laquelle nous avons lancée notre commande répond avec son nom local localhost.
Les UUID présentés dans le résultat (et unique pour chacun de nous) de la dernière commande permettent d’identifier de manière unique un serveur. Ces UUID sont présents dans le fichier /var/lib/glusterd/glusterd.info
.
Pour nous en assurer, nous utilisons :
clush -w root@peer[1-4] cat /var/lib/glusterd/glusterd.info
La commande renvoit :
peer1: UUID=25dbbaa2-980d-42a8-bd04-426218d9673a peer1: operating-version=30800 peer3: UUID=d7ae008b-1269-4992-bb1b-bd858eeb1ccc peer3: operating-version=30800 peer4: UUID=26898237-86c7-4687-8660-703de9cd48b0 peer4: operating-version=30800 peer2: UUID=a6fd556e-7fa9-4c3c-8190-8b33805d47d3 peer2: operating-version=30800
Maintenant, nous sommes prêts à créer notre premier volume GlusterFS.
La première étape pour créer un volume GlusterFS est d'abord de définir une racine dans laquelle GlusterFS va stocker tout le nécessaire au stockage des données et à la gestion des méta-données.
Nous allons aussi créer un point de montage de ce volume
Objectifs :
Etapes :
/MyGluster
sur le pair peer1 MyGluster
sur le pair peer1 MyGluster
MyGluster
MyGluster
/media/MyGluster
MyGluster
dans le dossier /media/MyGluster
TestFile.txt
dans le dossier /media/MyGluster
contenant “Premier Test” sur le clientTestFile.txt
dans le dossier monté sur le serveurTestFile.txt
dans le dossier de stockage du serveurMyGluster
MyGluster
MyGluster
en NFS sur le client dans le dossier /media/MyGlusterNFS
préabalement crééTestFile.txt
dans le dossier NFSCréation d’un dossier pour le premier partage
ssh root@peer1 mkdir /MyGluster
Création du volume GlusterFS de nom MyGluster
sur ce point de montage /MyGluster
sur le serveur 1 nommé peer1
ssh root@peer1 gluster volume create MyGluster peer1:/MyGluster force
L’option force
est indispensable dans ce cas : en effet, tout le système des machines virtuelles créées repose sur une unique partition. GlusterFS le détecte et ne recommande pas cette opération. Nous lui forçons la main !
volume create: MyGluster: success: please start the volume to access data
L’indication précédente invite à le monter, c’est ce que nous faisons :
ssh root@peer1 gluster volume start MyGluster
volume start: MyGluster: success
La commande gluster volume info
permet à tout instant de visualiser la configuration
ssh root@peer1 gluster volume info
Volume Name: MyGluster Type: Distribute Volume ID: 70b68cd9-357c-40aa-bcfc-9c1b1a51b4b7 Status: Started Snapshot Count: 0 Number of Bricks: 1 Transport-type: tcp Bricks: Brick1: peer1:/MyGluster Options Reconfigured: transport.address-family: inet performance.readdir-ahead: on nfs.disable: on
Cet espace de stockage est déjà montable sur n’importe quelle machine, sur le serveur lui même :
ssh root@peer1 mkdir /media/MyGluster ssh root@peer1 mount -t glusterfs peer1:MyGluster /media/MyGluster
ssh root@peer1 df
Sys. de fichiers blocs de 1K Utilise Disponible Uti devtmpfs 239524 0 239524 0 tmpfs 252128 0 252128 0 tmpfs 252128 6636 245492 3 tmpfs 5120 0 5120 0 tmpfs 252128 0 252128 0 /dev/sda1 1951744 847456 981376 47 peer1:MyGluster 1951744 847488 981376 47
Ou sur le client :
sudo mount -t glusterfs peer1:MyGluster /media/MyGluster
Il est possible d'utiliser la commande plus compacte mount.glusterfs
en lieu et place de mount -t glusterfs
. Cependant, cette commande n'est pas recommandée parce qu'elle empêche l'utilisation de l'option noatime
bien utile pour ne pas surcharger le système de fichiers hôte à chaque accès de fichiers.
df
Sys. de fichiers blocs de 1K Utilise Disponible Uti udev 10240 0 10240 0 tmpfs 204068 2988 201080 2 /dev/sda1 3905536 1519816 2165432 42 tmpfs 510168 0 510168 0 tmpfs 5120 0 5120 0 tmpfs 510168 0 510168 0 peer1:MyGluster 1951744 847488 981248 47
Écrivons un premier fichier dans le volume monté sur le client et récupérons sa signature MD5 à des fins de vérification :
sudo sh -c 'echo "Premier Test" > /media/MyGluster/TestFile.txt' md5sum /media/MyGluster/TestFile.txt
La commande renvoit :
6a55620050029ce24a149a6b02cf9f73 /media/MyGluster/TestFile.txt
Nous pouvons également vérifier la cohérence du fichier dans le volume en lançant la commande sur un autre client, par exemple le serveur lui même !
ssh root@peer1 md5sum /media/MyGluster/TestFile.txt
La commande renvoit :
6a55620050029ce24a149a6b02cf9f73 /media/MyGluster/TestFile.txt
GlusterFS permet de pouvoir exploiter un volume GlusterFS en NFS standard.
L'activation du partage NFS se fait très simplement sur le volume gluster. Il suffit de désactiver le paramètre nfs.disable
ssh root@peer1 gluster volume set MyGluster nfs.disable off
La commande renvoir en cas de succès :
volume set: success
Créons alors un nouveau point de montage et montons ce partage GlusterFS en NFS
sudo mkdir /media/MyGlusterNFS sudo mount -t nfs peer1:/MyGluster /media/MyGlusterNFS
Assurons-nous du montage par la commande df
laquelle renvoit :
Sys. de fichiers blocs de 1K Utilise Disponible Uti udev 10240 0 10240 0 tmpfs 204068 2992 201076 2 /dev/sda1 3905536 1519816 2165432 42 tmpfs 510168 0 510168 0 tmpfs 5120 0 5120 0 tmpfs 510168 0 510168 0 peer1:MyGluster 1951744 847616 981248 47 peer1:/MyGluster 1951744 846848 982016 47
Là aussi, un petit test pour voir si le document est consistant :
md5sum /media/MyGlusterNFS/TestFile.txt ssh root@peer1 md5sum /media/MyGluster/TestFile.txt
La sortie des 2 commandes précédentes est la suivante :
6a55620050029ce24a149a6b02cf9f73 /media/MyGlusterNFS/TestFile.txt 6a55620050029ce24a149a6b02cf9f73 /media/MyGluster/TestFile.txt
Il est aussi intéressant de “voir” comment, où et de quelle manière GlusterFS stocke les informations. Le dossier /MyGluster
sur peer1 contient tous les documents que nous avons créés, mais plus encore :
ssh root@peer1 ls -la /MyGluster
total 24 drwxr-xr-x 1 root root 88 nov. 30 17:02 . drwxr-xr-x 1 root root 210 nov. 30 16:49 .. drw------- 1 root root 208 nov. 30 17:02 .glusterfs -rw-r--r-- 2 root root 13 nov. 30 16:55 TestFile.txt drwxr-xr-x 1 root root 22 nov. 30 16:51 .trashcan
Si nous regardons la signature des fichiers que nous avons créés :
ssh root@peer1 md5sum /MyGluster/TestFile.txt
6a55620050029ce24a149a6b02cf9f73 /MyGluster/TestFile.txt
Nous retrouvons donc bien, à l’endroit où nous avons placé “physiquement” les données, le fichier dans sa totalité, avec la cohérence associée.
Pour visualiser les clients qui ont monté le volume, la commande gluster volume status
peut-être utilisée :
ssh root@peer1 gluster volume status
Client connections for volume MyGluster ---------------------------------------------- Brick : peer1:/MyGluster Clients connected : 6 Hostname BytesRead BytesWritten -------- --------- ------------ 10.20.16.1:49145 5968 4692 10.20.16.254:49149 10165 9268 10.20.16.1:49146 4516 4400 10.20.16.3:49148 1708 1228 10.20.16.4:49148 1708 1228 10.20.16.2:49148 1708 1228
Vient maintenant le moment de clore ce premier contact avec un volume GlusterFS atomique
, sur un seul serveur, en démontant d'abord tous les clients connectés :
Nous démontons d'abord sur le client les volumes montés en GlusterFS et NFS :
sudo umount /media/MyGlusterNFS sudo umount /media/MyGluster
Nous démontons ensuite sur le serveur
ssh root@peer1 umount /media/MyGluster
ssh root@peer1 gluster volume status MyGluster clients
Client connections for volume MyGluster ---------------------------------------------- Brick : peer1:/MyGluster Clients connected : 4 Hostname BytesRead BytesWritten -------- --------- ------------ 10.20.16.1:49146 4860 4848 10.20.16.3:49148 1708 1228 10.20.16.4:49148 1708 1228 10.20.16.2:49148 1708 1228
Il ne reste finalement que les 4 serveurs qui sont clients d’eux mêmes pour diffuser les données.
Arrêt & suppression d’un volume GlusterFS
Les commandes d'arrêt et de suppression de volume nécessitent une validation par y
. Pour la valider en forçant, nous préfixons la commande de echo y |
.
Arrêt du volume
ssh root@peer1 "echo y | gluster volume stop MyGluster"
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) volume stop: MyGluster: success
Suppression du volume
ssh root@peer1 "echo y | gluster volume delete MyGluster"
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) volume delete: MyGluster: success
Vérification de suppression
ssh root@peer1 gluster volume info
No volumes present
Le mode d'agrégation par défaut de GlusterFS s'apparente au mode linear
de la gestion par mdadm
. Il consiste simplement à agréger des volumes.
Création des racines de stockages
Nous créons sur chaque pair peer1 à peer4 une nouvelle racine de stockage.
clush -w root@peer[1-4] mkdir /MyGlusterLinear /media/MyGlusterLinear
Création du volume de montage
Dans notre cas, nous créons un volume de nom MyGlusterLinear
agrégeant les racines de stockage /MyGlusterLinear
des pairs peer1, peer2 :
ssh root@peer1 gluster volume create MyGlusterLinear transport tcp peer1:/MyGlusterLinear peer2:/MyGlusterLinear force
En cas de succès, la commande renvoit :
volume create: MyGlusterLinear: success: please start the volume to access data
Démarrage du volume
Comme dans le cas précédent, un volume créé demande d'être activé :
ssh root@peer1 gluster volume start MyGlusterLinear
En cas de succès :
volume start: MyGlusterLinear: success
Information sur le volume créé
Pour visualiser la configuration du volume créé, nous utilisons :
ssh root@peer1 gluster volume info MyGlusterLinear
La commande renvoit :
Volume Name: MyGlusterLinear Type: Distribute Volume ID: e77e82d8-f1e6-49f1-b72a-7e25ba3465b4 Status: Started Snapshot Count: 0 Number of Bricks: 2 Transport-type: tcp Bricks: Brick1: peer1:/MyGlusterLinear Brick2: peer2:/MyGlusterLinear Options Reconfigured: transport.address-family: inet performance.readdir-ahead: on nfs.disable: on
Comme nouveauté, nous voyons que les nombres de bricks composant le volume est de 2, et que ces briques
sont listées sous forme de leur pair associé à la racine de stockage.
Montage d'un volume Distribute & investigations
Montons sur le client ce volume après création d'un point spécifique :
sudo mkdir /media/MyGlusterLinear sudo mount -t glusterfs peer1:MyGlusterLinear /media/MyGlusterLinear
Explorons l'espace disponible :
df -h | grep Gluster
Nous disposons donc de 1.7GB d'espace libre :
peer1:MyGlusterLinear 3,8G 1,7G 1,9G 47% /media/MyGlusterLinear
Si nous regardons quel espace est disponible sur les serveurs
clush -w root@peer[1-2] df -h | grep sda
root@peer2: /dev/sda1 1,9G 835M 951M 47% / root@peer1: /dev/sda1 1,9G 835M 951M 47% /
Nous constatons que chacun dispose de 828MB ce qui représente le quart de l'espace identifié plus haut : une solution donc simple pour concaténer les espaces disponibles de serveurs.
Configurons l'espace de stockage comme un espace /scratch
(avec des droits comparables à du /tmp
):
sudo chmod 777 /media/MyGlusterLinear sudo chmod o+t /media/MyGlusterLinear ls -ltra /media/MyGlusterLinear
Test d'écritures parallèles & investigations
Lançons un test écrivant un millier de fichiers en parallèle :
seq -w 1000 | /usr/bin/time xargs -P 1000 -I '{}' bash -c "echo Hello File '{}' > /media/MyGlusterLinear/File.'{}'"
Cette commande prend autour de 50 secondes sur une machine lente.
Lançons maintenant une lecture tout aussi parallèle
ls /media/MyGlusterLinear/File.* | /usr/bin/time xargs -P 1000 -I '{}' md5sum '{}'
Cette commande prend autour de 12 secondes.
Il est possible de voir comment sont distribués les fichiers sur les différents serveurs :
clush -w root@peer[1-4] 'ls /MyGlusterLinear/File.* | wc -l'
root@peer4: 271 root@peer2: 270 root@peer1: 236 root@peer3: 223
Il y a donc à peu près équirépartition des écritures entre les différents serveurs : GlusterFS remplit donc son office !
Effaçons ces fichiers :
rm /media/MyGlusterLinear/File.*
Démontons le volume
umount /media/MyGlusterLinear
clush -w root@peer[1-4] mkdir /MyGlusterRAID0
ssh root@peer1 gluster volume create MyGlusterRAID0 stripe 2 peer1:/MyGlusterRAID0 peer2:/MyGlusterRAID0 force
volume create: stripe: success: please start the volume to access data
ssh root@peer1 gluster volume start MyGlusterRAID0
Montage sur le client
mkdir /media/MyGlusterRAID0 mount -t glusterfs peer1:MyGlusterRAID0 /media/MyGlusterRAID0
Ecriture de données & cohérence des données
Rajout d'une brique
Objectif : création et manipulation d'un volume redondé sur 4 disques.
Etapes :
Création d'une racine de volume GlusterFS
Objectif : étudier et agir sur la disponibilité de l'accès au serveur.
mount -t glusterfs -obackup-volfile-servers=peer1:peer2:peer3:peer4,noatime peer1:/MyGlusterRAID1 /media/MyGlusterRAID1
Objectif : filtrer l'accès au volume GlusterFS par adresse IP
Détermination de l'IP des machines
Restriction à uniquement les serveurs du pool
ssh root@peer1 gluster volume set distonet auth.allow 10.20.16.0
gluster volume info
Objectif : assurer une confidentialité forte sur l'accès et le transit
Création de la clé OpenSSL, des certificats serveurs et client
openssl genrsa -out glusterfs.key 1024 openssl req -new -x509 -days 3650 -key glusterfs.key -subj /CN=gluster-client -out glusterfs.pem seq 4 | xargs -I ' ' openssl req -new -x509 -days 3650 -key glusterfs.key -subj /CN=peer' ' -out peer' '.pem
cat glusterfs.pem peer* >> glusterfs.ca
seq 4 | xargs -I ' ' scp glusterfs.key peer' ':/etc/ssl seq 4 | xargs -I ' ' scp glusterfs.ca peer' ':/etc/ssl
ssh root@peer1 gluster volume set MyGlusterLinear client.ssl on ssh root@peer1 gluster volume set MyGlusterLinear server.ssl on ssh root@peer1 gluster volume set MyGlusterLinear ssl.own-cert /etc/ssl/glusterfs.ca
ssh root@peer1 "echo y | gluster volume stop MyGlusterLinear" ssh root@peer1 gluster volume start MyGlusterLinear
clush -w peer[1-4] mkdir /MyGlusterReplica ssh root@peer1 gluster volume create MyGlusterReplica replica 2 transport tcp peer1:/MyGlusterReplica peer3:/MyGlusterReplica force ssh root@peer1 gluster volume start MyGlusterReplica ssh root@peer1 gluster volume info ssh peer1 gluster volume tier MyGlusterReplica attach replica 2 peer2:/MyGlusterReplica peer4:/MyGlusterReplica force ssh root@peer1 gluster tier status ssh root@peer1 gluster volume info
Volume Name: MyGlusterReplica Type: Tier Volume ID: 4502aaf9-f9c6-4eec-9c73-a889f3b457c7 Status: Started Snapshot Count: 0 Number of Bricks: 4 Transport-type: tcp Hot Tier : Hot Tier Type : Replicate Number of Bricks: 1 x 2 = 2 Brick1: peer4:/MyGlusterReplica Brick2: peer2:/MyGlusterReplica Cold Tier: Cold Tier Type : Replicate Number of Bricks: 1 x 2 = 2 Brick3: peer1:/MyGlusterReplica Brick4: peer3:/MyGlusterReplica Options Reconfigured: cluster.tier-mode: cache features.ctr-enabled: on transport.address-family: inet performance.readdir-ahead: on nfs.disable: on
Résilience des disques
Gestion des disques par LVM
Localiser son fichier
getfattr -n trusted.glusterfs.pathinfo -e text /media/MyGluster/File.txt
https://access.redhat.com/documentation/en-US/Red Hat Storage/3.1/html/Administration Guide/ch26s02.html
Voir les fichiers accédés
https://access.redhat.com/documentation/en-US/Red Hat Storage/2.0/html/Administration Guide/sect-User Guide-Monitor Workload-Displaying Volume Status.html