Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Dernière révision Les deux révisions suivantes | ||
formation:anfbigdata [2016/12/14 11:31] equemene [Création d'un volume de type ''distributed'' (équivalent ''linear'')] |
formation:anfbigdata [2016/12/15 18:43] equemene |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Travaux pratiques GlusterFS ====== | + | ====== Travaux pratiques GlusterFS pour ANF Bigdata ====== |
- | GlusterFS ou la quête de la simplicité | + | Support de Travaux pratiques dans le cadre de [[https://indico.mathrice.fr/event/5/|Des données au BigData : exploitez le stockage distribué]] |
+ | ===== CQQCOQP (Comment ? Quoi ? Qui, Combien ? Où ? Quand ? Pourquoi ?) ===== | ||
+ | |||
+ | * **Pourquoi ?** Survoler les principales fonctionnalités de GlusterFS et se faire sa propre idée | ||
+ | * **Quoi ?** Tester au travers d'exemples simples en appliquant le modèles STNPPNFP | ||
+ | * **Quand ?** Jeudi 15 décembre de 9h à 12h | ||
+ | * **Combien ?** 12GB d'espace disque, 3GB de RAM, 5 VM | ||
+ | * **Où ?** Sur une machine unique, dans en environnement VirtualBox | ||
+ | * **Qui ?** Pour des admin'sys soucieux d'expérimenter rapidement | ||
+ | * **Comment ?** En appliquant une série de commandes simples au travers d'un terminal | ||
===== Objectif de la séance ===== | ===== Objectif de la séance ===== | ||
+ | C'est de donner un aperçu des différentes fonctionnalités de GlusterFS dans un environnement propre, en insistant sur sa simplicité d'installation, de configuration, d'administration. | ||
===== Préparation de la séance ===== | ===== Préparation de la séance ===== | ||
Ligne 606: | Ligne 615: | ||
<code> | <code> | ||
- | root@peer4: 271 | + | root@peer4: 0 |
- | root@peer2: 270 | + | root@peer4: ls: impossible d'accéder à /MyGlusterLinear/File.*: Aucun fichier ou dossier de ce type |
- | root@peer1: 236 | + | root@peer1: 506 |
- | root@peer3: 223 | + | root@peer2: 494 |
+ | root@peer3: 0 | ||
+ | root@peer3: ls: impossible d'accéder à /MyGlusterLinear/File.*: Aucun fichier ou dossier de ce type | ||
</code> | </code> | ||
| | ||
- | Il y a donc à peu près équirépartition des écritures entre les différents serveurs : GlusterFS remplit donc son office ! | + | Il y a donc à peu près équirépartition des écritures entre les serveurs **peer1** et **peer2** : GlusterFS remplit donc son office ! |
- | Effaçons ces fichiers : | + | Ajoutons une brique avec **peer3** : |
<code> | <code> | ||
- | rm /media/MyGlusterLinear/File.* | + | ssh root@peer1 gluster volume add-brick MyGlusterLinear peer3:/MyGlusterLinear force |
+ | </code> | ||
+ | En cas de succès, nous obtenons : | ||
+ | <code> | ||
+ | volume add-brick: success | ||
</code> | </code> | ||
- | Démontons le volume | ||
<code> | <code> | ||
- | umount /media/MyGlusterLinear | + | ssh root@peer3 gluster volume info |
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | Volume Name: MyGlusterLinear | ||
+ | Type: Distribute | ||
+ | Volume ID: e6cc9af2-5f48-4599-bc8e-12a7ee9d39b1 | ||
+ | Status: Started | ||
+ | Snapshot Count: 0 | ||
+ | Number of Bricks: 3 | ||
+ | Transport-type: tcp | ||
+ | Bricks: | ||
+ | Brick1: peer1:/MyGlusterLinear | ||
+ | Brick2: peer2:/MyGlusterLinear | ||
+ | Brick3: peer3:/MyGlusterLinear | ||
+ | Options Reconfigured: | ||
+ | transport.address-family: inet | ||
+ | performance.readdir-ahead: on | ||
+ | nfs.disable: on | ||
+ | </code> | ||
+ | |||
+ | Regardons si l'espace disponible s'est étendu par la commande ''df'': | ||
+ | <code> | ||
+ | Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur | ||
+ | udev 10M 0 10M 0% /dev | ||
+ | tmpfs 200M 3,0M 197M 2% /run | ||
+ | /dev/sda1 3,8G 1,7G 1,9G 47% / | ||
+ | tmpfs 499M 0 499M 0% /dev/shm | ||
+ | tmpfs 5,0M 0 5,0M 0% /run/lock | ||
+ | tmpfs 499M 0 499M 0% /sys/fs/cgroup | ||
+ | peer1:MyGlusterLinear 5,6G 2,5G 2,8G 47% /media/MyGlusterLinear | ||
+ | </code> | ||
+ | |||
+ | L'espace s'est étendu d'autant ! | ||
+ | |||
+ | Lançons le mécanisme de répartition avec ''balance'' : | ||
+ | <code> | ||
+ | ssh root@peer1 gluster volume rebalance MyGlusterLinear start | ||
+ | </code> | ||
+ | <code> | ||
+ | volume rebalance: MyGlusterLinear: success: Rebalance on MyGlusterLinear has been started successfully. Use rebalance status command to check status of the rebalance process. | ||
+ | ID: 58ce178d-5fd8-44b2-b484-382f71ad0a02 | ||
+ | </code> | ||
+ | Cette procédure pouvant être assez longue, l'état du ''rebalance'' s'obtient par un simple ''status'' à la place de ''start''. | ||
+ | <code> | ||
+ | ssh root@peer1 gluster volume rebalance MyGlusterLinear status | ||
+ | Node Rebalanced-files size scanned failures skipped status run time in h:m:s | ||
+ | --------- ----------- ----------- ----------- ----------- ----------- ------------ -------------- | ||
+ | localhost 171 2.7KB 506 0 0 completed 0:0:8 | ||
+ | peer3 0 0Bytes 2 0 0 completed 0:0:0 | ||
+ | peer2 0 0Bytes 494 0 147 completed 0:0:4 | ||
+ | volume rebalance: MyGlusterLinear: success | ||
+ | </code> | ||
+ | |||
+ | Si nous regardons la redistribution, nous obtenons : | ||
+ | <code> | ||
+ | clush -w root@peer[1-4] 'ls /MyGlusterLinear/File.* | wc -l' | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | root@peer2: 494 | ||
+ | root@peer1: 335 | ||
+ | root@peer4: ls: impossible d'accéder à /MyGlusterLinear/File.*: Aucun fichier ou dossier de ce type | ||
+ | root@peer4: 0 | ||
+ | root@peer3: 318 | ||
+ | </code> | ||
+ | |||
+ | La redistribution n'est pas parfaite, mais elle reste correcte ! | ||
+ | |||
+ | Supprimons maintenant la brique issue de **peer1** à partir de **peer2** : | ||
+ | <code> | ||
+ | ssh root@peer2 gluster volume remove-brick MyGlusterLinear peer1:/MyGlusterLinear start | ||
+ | </code> | ||
+ | |||
+ | Le message suivant indique que la procédure a démarré | ||
+ | <code> | ||
+ | |||
+ | </code> | ||
+ | |||
+ | Contrôlons la progression de la migration des données issues de la demande de suppression : | ||
+ | <code> | ||
+ | ssh root@peer2 gluster volume remove-brick MyGlusterLinear peer1:/MyGlusterLinear status | ||
+ | </code> | ||
+ | |||
+ | Nous distinguons que le processus est en cours : | ||
+ | <code> | ||
+ | </code> | ||
+ | |||
+ | Une fois terminé, nous avons pour la même commande précédente : | ||
+ | <code> | ||
+ | |||
+ | </code> | ||
+ | |||
+ | Relançons la commande pour voir la distribution sur les différents serveurs | ||
+ | <code> | ||
+ | |||
+ | </code> | ||
+ | |||
+ | Validons la suppression | ||
+ | <code> | ||
+ | ssh root@peer2 gluster volume remove-brick MyGlusterLinear peer1:/MyGlusterLinear commit | ||
+ | </code> | ||
+ | |||
+ | Un petit message nous invite à la prudence, pour, au pire, restaurer les données : | ||
+ | <code> | ||
+ | |||
+ | </code> | ||
+ | |||
+ | <code>ssh root@peer3 gluster volume info</code> | ||
+ | |||
+ | <code> | ||
+ | Volume Name: MyGlusterLinear | ||
+ | Type: Distribute | ||
+ | Volume ID: e6cc9af2-5f48-4599-bc8e-12a7ee9d39b1 | ||
+ | Status: Started | ||
+ | Snapshot Count: 0 | ||
+ | Number of Bricks: 3 | ||
+ | Transport-type: tcp | ||
+ | Bricks: | ||
+ | Brick1: peer2:/MyGlusterLinear | ||
+ | Brick2: peer4:/MyGlusterLinear | ||
+ | Brick3: peer3:/MyGlusterLinear | ||
+ | Options Reconfigured: | ||
+ | transport.address-family: inet | ||
+ | performance.readdir-ahead: on | ||
+ | nfs.disable: on | ||
+ | </code> | ||
+ | |||
+ | Si nous regardons la répartitions des fichiers avec | ||
+ | <code> | ||
+ | clush -w root@peer[1-4] 'ls /MyGlusterLinear/File.* | wc -l' | ||
+ | </code> | ||
+ | Nous avons : | ||
+ | <code> | ||
+ | root@peer3: 318 | ||
+ | root@peer1: 347 | ||
+ | root@peer2: 335 | ||
+ | root@peer4: 347 | ||
+ | </code> | ||
+ | Nous voyons que la "charge" de **peer1** a été transféré sur **peer4**. Cependant, en regardant la signature des fichiers, nous constatons qu'ils sont vides sur **peer1**. | ||
+ | |||
+ | |||
+ | Effaçons ces fichiers et démontons le volume monté sur le client : | ||
+ | <code> | ||
+ | rm /media/MyGlusterLinear/File.* | ||
+ | sudo umount /media/MyGlusterLinear | ||
</code> | </code> | ||
Ligne 632: | Ligne 791: | ||
<code> | <code> | ||
ssh root@peer1 gluster volume create MyGlusterRAID0 stripe 2 peer1:/MyGlusterRAID0 peer2:/MyGlusterRAID0 force | ssh root@peer1 gluster volume create MyGlusterRAID0 stripe 2 peer1:/MyGlusterRAID0 peer2:/MyGlusterRAID0 force | ||
+ | ssh root@peer1 gluster volume start MyGlusterRAID0 | ||
</code> | </code> | ||
<code> | <code> | ||
- | volume create: stripe: success: please start the volume to access data | + | volume create: MyGlusterRAID0: success: please start the volume to access data |
+ | volume start: MyGlusterRAID0: success | ||
</code> | </code> | ||
<code> | <code> | ||
- | ssh root@peer1 gluster volume start MyGlusterRAID0 | + | ssh root@peer1 gluster volume info MyGlusterRAID0 |
</code> | </code> | ||
- | Montage sur le client | + | <code> |
+ | Volume Name: MyGlusterRAID0 | ||
+ | Type: Stripe | ||
+ | Volume ID: 4b7451de-36cc-4679-925e-f0846e4325b9 | ||
+ | Status: Started | ||
+ | Snapshot Count: 0 | ||
+ | Number of Bricks: 1 x 2 = 2 | ||
+ | Transport-type: tcp | ||
+ | Bricks: | ||
+ | Brick1: peer1:/MyGlusterRAID0 | ||
+ | Brick2: peer2:/MyGlusterRAID0 | ||
+ | Options Reconfigured: | ||
+ | transport.address-family: inet | ||
+ | performance.readdir-ahead: on | ||
+ | nfs.disable: on | ||
+ | </code> | ||
+ | |||
+ | Montage sur le client & réglages de droits d'accès | ||
<code> | <code> | ||
mkdir /media/MyGlusterRAID0 | mkdir /media/MyGlusterRAID0 | ||
- | mount -t glusterfs peer1:MyGlusterRAID0 /media/MyGlusterRAID0 | + | sudo mount -t glusterfs -o noatime peer1:MyGlusterRAID0 /media/MyGlusterRAID0 |
+ | sudo chmod 777 /media/MyGlusterRAID0 | ||
+ | sudo chmod o+t /media/MyGlusterRAID0 | ||
</code> | </code> | ||
Ecriture de données & cohérence des données | Ecriture de données & cohérence des données | ||
- | + | <code> | |
- | Rajout d'une brique | + | seq -w 1000 | /usr/bin/time xargs -P 1000 -I '{}' bash -c "echo Hello File '{}' > /media/MyGlusterRAID0/File.'{}'" |
+ | </code> | ||
- | ===== Création d'un volume de type ''replica'' (équivalent ''RAID1'') ===== | + | Si nous regardons les MD5 dans ''/media/MyGlusterRAID0/'' et sur les deux serveurs **peer1** et **peer2** dans ''/MyGlusterRAID0/'', nous constatons uniquement des fichiers de taille nulle sont sur **peer2** et les mêmes signature sur **peer1** : ceci est dû à la taille au delà de laquelle les données sont découpées. |
- | Objectif : création et manipulation d'un volume redondé sur 4 disques. | + | En effet, la commande ''ssh root@peer1 gluster volume get MyGlusterRAID0 all | grep stripe-block-size'' |
+ | <code> | ||
+ | cluster.stripe-block-size 128KB | ||
+ | </code> | ||
- | Etapes : | + | Essayons avec 10 fichiers de 1MB générés aléatoirement pour dépasser cette limite |
- | - création d'une racine de volume GlusterFS de nom MyGlusterRAID1 | + | <code> |
- | - création & démarrage et visualisation d'un volume de nom MyGlusterRAID1 avec une redondance de 2 | + | rm /media/MyGlusterRAID0/File.* |
- | - montage du volume MyGlusterRAID1 sur le client | + | seq -w 10 | /usr/bin/time xargs -P 10 -I '{}' bash -c "base64 /dev/urandom | head -c 1048576 > /media/MyGlusterRAID0/File.'{}'" |
- | - écriture parallèle de 1000 fichiers de signatures différentes | + | </code> |
- | - vérification de la cohérence et redondance des fichiers | + | |
- | - vérification de la distribution des données | + | <code> |
- | - application du mécanisme de balance | + | ls /media/MyGlusterRAID0/File.* | xargs -P 10 -I '{}' md5sum '{}' | sort |
- | - vérification du mécanisme de balance | + | ssh root@peer1 "ls /MyGlusterRAID0/File.* | xargs -I '{}' md5sum '{}'" | sort |
- | + | ssh root@peer2 "ls /MyGlusterRAID0/File.* | xargs -I '{}' md5sum '{}'" | sort | |
- | Création d'une racine de volume GlusterFS | + | </code> |
+ | |||
+ | Nous voyons que les sommes MD5 ne sont pas identiques... En cas de plantage de GlusterFS, il n'y a pas possibilité de récupérer les informations en allant les chercher "à la main". | ||
+ | |||
+ | ===== Création d’un volume de type ''replica'' (équivalent RAID1) ===== | ||
+ | |||
+ | <code> | ||
+ | clush -w root@peer[1-4] mkdir /MyGlusterRAID1 | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | ssh root@peer1 gluster volume create MyGlusterRAID1 replica 2 peer1:/MyGlusterRAID1 peer3:/MyGlusterRAID1 force | ||
+ | ssh root@peer1 gluster volume start MyGlusterRAID1 | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | volume create: MyGlusterRAID1: success: please start the volume to access data | ||
+ | volume start: MyGlusterRAID1: success | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | ssh root@peer3 gluster volume info MyGlusterRAID1 | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | Volume Name: MyGlusterRAID1 | ||
+ | Type: Replicate | ||
+ | Volume ID: 7bb3b6dd-a82c-45bd-bb28-5f9545438d84 | ||
+ | Status: Started | ||
+ | Snapshot Count: 0 | ||
+ | Number of Bricks: 1 x 2 = 2 | ||
+ | Transport-type: tcp | ||
+ | Bricks: | ||
+ | Brick1: peer1:/MyGlusterRAID1 | ||
+ | Brick2: peer3:/MyGlusterRAID1 | ||
+ | Options Reconfigured: | ||
+ | transport.address-family: inet | ||
+ | performance.readdir-ahead: on | ||
+ | nfs.disable: on | ||
+ | </code> | ||
+ | |||
+ | Montage sur le client & réglages de droits d'accès | ||
+ | <code> | ||
+ | mkdir /media/MyGlusterRAID1 | ||
+ | sudo mount -t glusterfs -o noatime peer1:MyGlusterRAID1 /media/MyGlusterRAID1 | ||
+ | sudo chmod 777 /media/MyGlusterRAID1 | ||
+ | sudo chmod o+t /media/MyGlusterRAID1 | ||
+ | </code> | ||
+ | |||
+ | Ecriture de données & cohérence des données | ||
+ | <code> | ||
+ | seq -w 1000 | /usr/bin/time xargs -P 1000 -I '{}' bash -c "echo Hello File '{}' > /media/MyGlusterRAID1/File.'{}'" | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | ls /media/MyGlusterRAID1/File.* | xargs -P 1000 -I '{}' md5sum '{}' | sort | awk '{ print $1 }' > /tmp/Gluster.md5 | ||
+ | ssh root@peer1 "ls /MyGlusterRAID1/File.* | xargs -P 1000 -I '{}' md5sum '{}'" | sort | awk '{ print $1 }' > /tmp/GlusterPeer1.md5 | ||
+ | ssh root@peer3 "ls /MyGlusterRAID1/File.* | xargs -P 1000 -I '{}' md5sum '{}'" | sort | awk '{ print $1 }' > /tmp/GlusterPeer3.md5 | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | md5sum /tmp/Gluster.md5 /tmp/GlusterPeer1.md5 /tmp/GlusterPeer3.md5 | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | 521e443b0dd9b639f7610c0a7e0dd001 /tmp/Gluster.md5 | ||
+ | 521e443b0dd9b639f7610c0a7e0dd001 /tmp/GlusterPeer1.md5 | ||
+ | 521e443b0dd9b639f7610c0a7e0dd001 /tmp/GlusterPeer3.md5 | ||
+ | </code> | ||
+ | |||
+ | Essayons avec 10 fichiers de 1MB générés aléatoirement pour dépasser cette limite | ||
+ | <code> | ||
+ | rm /media/MyGlusterRAID1/File.* | ||
+ | seq -w 10 | /usr/bin/time xargs -P 10 -I '{}' bash -c "base64 /dev/urandom | head -c 1048576 > /media/MyGlusterRAID1/File.'{}'" | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | ls /media/MyGlusterRAID1/File.* | xargs -P 10 -I '{}' md5sum '{}' | sort | ||
+ | ssh root@peer1 "ls /MyGlusterRAID1/File.* | xargs -I '{}' md5sum '{}'" | sort | ||
+ | ssh root@peer3 "ls /MyGlusterRAID1/File.* | xargs -I '{}' md5sum '{}'" | sort | ||
+ | </code> | ||
+ | |||
+ | Même pour des fichiers de taille plus importante, la cohérence des données est respectée. | ||
+ | |||
+ | |||
+ | AJout d'une brique sur le replica : | ||
+ | |||
+ | Etant donné que nous sommes en mode ''replica'', il est nécessaire d'associer une brique contenant deux espaces : | ||
+ | <code> | ||
+ | ssh root@peer1 gluster volume add-brick MyGlusterRAID1 replica 2 peer2:/MyGlusterRAID1 peer4:/MyGlusterRAID1 force | ||
+ | </code> | ||
+ | |||
+ | Le ''gluster volume info MyGlusterRAID1'' fournit : | ||
+ | <code> | ||
+ | Volume Name: MyGlusterRAID1 | ||
+ | Type: Distributed-Replicate | ||
+ | Volume ID: 7bb3b6dd-a82c-45bd-bb28-5f9545438d84 | ||
+ | Status: Started | ||
+ | Snapshot Count: 0 | ||
+ | Number of Bricks: 2 x 2 = 4 | ||
+ | Transport-type: tcp | ||
+ | Bricks: | ||
+ | Brick1: peer1:/MyGlusterRAID1 | ||
+ | Brick2: peer3:/MyGlusterRAID1 | ||
+ | Brick3: peer2:/MyGlusterRAID1 | ||
+ | Brick4: peer4:/MyGlusterRAID1 | ||
+ | Options Reconfigured: | ||
+ | transport.address-family: inet | ||
+ | performance.readdir-ahead: on | ||
+ | nfs.disable: on | ||
+ | </code> | ||
+ | |||
+ | Lançons un ''rebalance'' sur le volume ''ssh root@peer4 gluster volume rebalance MyGlusterRAID1 start'' | ||
+ | <code> | ||
+ | volume rebalance: MyGlusterRAID1: success: Rebalance on MyGlusterRAID1 has been started successfully. Use rebalance status command to check status of the rebalance process. | ||
+ | ID: 12d11627-146d-4057-b1f7-e041f9b1b218 | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | ssh root@peer4 gluster volume rebalance MyGlusterRAID1 status | ||
+ | </code> | ||
+ | <code> | ||
+ | Node Rebalanced-files size scanned failures skipped status run time in h:m:s | ||
+ | --------- ----------- ----------- ----------- ----------- ----------- ------------ -------------- | ||
+ | localhost 0 0Bytes 0 0 0 completed 0:0:0 | ||
+ | peer1.gluster.zone 4 4.0MB 10 0 0 completed 0:0:1 | ||
+ | peer3 0 0Bytes 0 0 0 completed 0:0:0 | ||
+ | peer2 0 0Bytes 0 0 0 completed 0:0:1 | ||
+ | volume rebalance: MyGlusterRAID1: success | ||
+ | </code> | ||
===== Eléments de sécurité sous GlusterFS ===== | ===== Eléments de sécurité sous GlusterFS ===== | ||
Ligne 672: | Ligne 985: | ||
==== Résilience de l'accès au serveur ==== | ==== Résilience de l'accès au serveur ==== | ||
- | Objectif : étudier et agir sur la disponibilité de l'accès au serveur. | + | Démontons le volume ''MyGlusterRAID1'' sur le client : |
<code> | <code> | ||
- | mount -t glusterfs -obackup-volfile-servers=peer1:peer2:peer3:peer4,noatime peer1:/MyGlusterRAID1 /media/MyGlusterRAID1 | + | sudo umount /media/GlusterRAID1/ |
</code> | </code> | ||
+ | |||
+ | Simulons une panne en arrêtant le démon ''glusterd'' sur **peer1** : | ||
+ | <code> | ||
+ | ssh root@peer1 systemctl stop glusterfs-server.service | ||
+ | </code> | ||
+ | |||
+ | Essayons de remonter le volume ''MyGlusterRAID1'': | ||
+ | <code> | ||
+ | sudo mount -t glusterfs peer1:MyGlusterRAID1 /media/MyGlusterRAID1/ | ||
+ | </code> | ||
+ | Ca ne fonctionne pas avec le message : | ||
+ | <code> | ||
+ | Mount failed. Please check the log file for more details. | ||
+ | </code> | ||
+ | |||
+ | En allant regarder dans les logs d'erreur : | ||
+ | <code> | ||
+ | sudo cat /var/log/glusterfs/media-MyGlusterRAID1.log | grep ' E ' | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | [2016-12-14 14:43:55.901290] E [socket.c:2309:socket_connect_finish] 0-glusterfs: connection to 10.20.16.1:24007 failed (Connexion refusée) | ||
+ | [2016-12-14 14:43:55.901332] E [glusterfsd-mgmt.c:1902:mgmt_rpc_notify] 0-glusterfsd-mgmt: failed to connect with remote-host: peer1 (Noeud final de transport n'est pas connecté) | ||
+ | </code> | ||
+ | |||
+ | Etant donné que notre volume est reparti sur 4 serveurs dont 1 indisponible, nous pouvons monter le partage en utilisant l'option ''backup-volfile-servers'' : | ||
+ | <code> | ||
+ | sudo mount -t glusterfs -obackup-volfile-servers=peer1:peer2:peer3:peer4,noatime peer1:MyGlusterRAID1 /media/MyGlusterRAID1/ | ||
+ | </code> | ||
+ | |||
+ | Le volume se monte et les données sont accessibles. | ||
+ | |||
+ | Réactivons quand même le service GlusterFS sur **peer1** : | ||
+ | <code> | ||
+ | ssh root@peer1 systemctl start glusterfs-server.service | ||
+ | </code> | ||
+ | |||
+ | Vérifions que le démon est bien opérationnel par ''ssh root@peer1 gluster volume info MyGlusterRAID1'' | ||
+ | |||
==== Contrôle d'accès par adresse ==== | ==== Contrôle d'accès par adresse ==== | ||
Objectif : filtrer l'accès au volume GlusterFS par adresse IP | Objectif : filtrer l'accès au volume GlusterFS par adresse IP | ||
+ | |||
+ | Démontons le volume du client | ||
+ | <code> | ||
+ | sudo umount /media/MyGlusterRAID1 | ||
+ | </code> | ||
Détermination de l'IP des machines | Détermination de l'IP des machines | ||
- | Restriction à uniquement les serveurs du pool | + | Les serveurs disposent d'une adresse de **10.20.16.1** à **10.20.16.4**. |
- | ssh root@peer1 gluster volume set distonet auth.allow 10.20.16.0 | + | Restriction à uniquement les serveurs du pool avec l'attribut ''auth.allow'' définit à toutes les IP des serveurs de **peer1** à **peer4**. |
+ | <code> | ||
+ | ssh root@peer1 gluster volume set MyGlusterRAID1 auth.allow 10.20.16.1,10.20.16.2,10.20.16.3,10.20.16.4 | ||
+ | </code> | ||
+ | <code> | ||
gluster volume info | gluster volume info | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | Volume Name: MyGlusterRAID1 | ||
+ | Type: Distributed-Replicate | ||
+ | Volume ID: 7bb3b6dd-a82c-45bd-bb28-5f9545438d84 | ||
+ | Status: Started | ||
+ | Snapshot Count: 0 | ||
+ | Number of Bricks: 2 x 2 = 4 | ||
+ | Transport-type: tcp | ||
+ | Bricks: | ||
+ | Brick1: peer1:/MyGlusterRAID1 | ||
+ | Brick2: peer3:/MyGlusterRAID1 | ||
+ | Brick3: peer2:/MyGlusterRAID1 | ||
+ | Brick4: peer4:/MyGlusterRAID1 | ||
+ | Options Reconfigured: | ||
+ | auth.allow: 10.20.16.1,10.20.16.2,10.20.16.3,10.20.16.4 | ||
+ | nfs.disable: on | ||
+ | performance.readdir-ahead: on | ||
+ | transport.address-family: inet | ||
+ | </code> | ||
+ | |||
+ | Lançons la commande de montage sur le client | ||
+ | <code> | ||
+ | sudo mount -t glusterfs peer1:MyGlusterRAID1 /media/MyGlusterRAID1/ | ||
+ | </code> | ||
+ | |||
+ | La commande s'exécute mais rien ne se monte : ''df | grep MyGlusterRAID1'' permet de s'en assurer... | ||
+ | |||
+ | Si nous rajoutons l'IP du client **10.20.16.254**, avec la commande : | ||
+ | <code> | ||
+ | ssh root@peer1 gluster volume set MyGlusterRAID1 auth.allow 10.20.16.1,10.20.16.2,10.20.16.3,10.20.16.4,10.20.16.254 | ||
+ | </code> | ||
+ | Nous pouvons monter le volume ''MyGlusterRAID1''. | ||
+ | |||
+ | Pour réinitialiser une valeur, nous utilisons : la commande ''reset'' sur l'attribut, ici ''auth.allow'' | ||
+ | <code> | ||
+ | ssh root@peer1 gluster volume reset MyGlusterRAID1 auth.allow | ||
+ | </code> | ||
+ | |||
+ | |||
+ | Démontage du volume du client par ''sudo umount /media/MyGlusterRAID1'' | ||
==== Chiffrement de la communication ==== | ==== Chiffrement de la communication ==== | ||
Objectif : assurer une confidentialité forte sur l'accès et le transit | Objectif : assurer une confidentialité forte sur l'accès et le transit | ||
+ | |||
+ | Démontage de | ||
Création de la clé OpenSSL, des certificats serveurs et client | Création de la clé OpenSSL, des certificats serveurs et client | ||
<code> | <code> | ||
openssl genrsa -out glusterfs.key 1024 | openssl genrsa -out glusterfs.key 1024 | ||
- | openssl req -new -x509 -days 3650 -key glusterfs.key -subj /CN=gluster-client -out glusterfs.pem | + | openssl req -new -x509 -days 3650 -key glusterfs.key -subj /CN=gluster-client -out gluster-client.pem |
- | seq 4 | xargs -I ' ' openssl req -new -x509 -days 3650 -key glusterfs.key -subj /CN=peer' ' -out peer' '.pem | + | seq 4 | xargs -I '{}' openssl req -new -x509 -days 3650 -key glusterfs.key -subj /CN=peer'{}' -out peer'{}'.pem |
</code> | </code> | ||
<code> | <code> | ||
- | cat glusterfs.pem peer* >> glusterfs.ca | + | cat peer* >> glusterfs.ca |
</code> | </code> | ||
<code> | <code> | ||
- | seq 4 | xargs -I ' ' scp glusterfs.key peer' ':/etc/ssl | + | seq 4 | xargs -I '{}' scp glusterfs.key root@peer'{}':/etc/ssl |
- | seq 4 | xargs -I ' ' scp glusterfs.ca peer' ':/etc/ssl | + | seq 4 | xargs -I '{}' scp glusterfs.ca root@peer'{}':/etc/ssl |
</code> | </code> | ||
<code> | <code> | ||
- | ssh root@peer1 gluster volume set MyGlusterLinear client.ssl on | + | ssh root@peer1 gluster volume set MyGlusterRAID1 client.ssl on |
- | ssh root@peer1 gluster volume set MyGlusterLinear server.ssl on | + | ssh root@peer1 gluster volume set MyGlusterRAID1 server.ssl on |
- | ssh root@peer1 gluster volume set MyGlusterLinear ssl.own-cert /etc/ssl/glusterfs.ca | + | ssh root@peer1 gluster volume set MyGlusterRAID1 ssl.own-cert /etc/ssl/glusterfs.ca |
</code> | </code> | ||
+ | |||
<code> | <code> | ||
- | ssh root@peer1 "echo y | gluster volume stop MyGlusterLinear" | + | Volume Name: MyGlusterRAID1 |
- | ssh root@peer1 gluster volume start MyGlusterLinear | + | Type: Distributed-Replicate |
+ | Volume ID: 7bb3b6dd-a82c-45bd-bb28-5f9545438d84 | ||
+ | Status: Started | ||
+ | Snapshot Count: 0 | ||
+ | Number of Bricks: 2 x 2 = 4 | ||
+ | Transport-type: tcp | ||
+ | Bricks: | ||
+ | Brick1: peer1:/MyGlusterRAID1 | ||
+ | Brick2: peer3:/MyGlusterRAID1 | ||
+ | Brick3: peer2:/MyGlusterRAID1 | ||
+ | Brick4: peer4:/MyGlusterRAID1 | ||
+ | Options Reconfigured: | ||
+ | ssl.own-cert: /etc/ssl/glusterfs.ca | ||
+ | server.ssl: on | ||
+ | client.ssl: on | ||
+ | nfs.disable: on | ||
+ | performance.readdir-ahead: on | ||
+ | transport.address-family: inet | ||
</code> | </code> | ||
+ | Création des points de montage & montage sur les serveurs : | ||
+ | <code> | ||
+ | clush -w root@peer[1-4] mkdir /media/MyGlusterRAID1 | ||
+ | clush -w root@peer[1-4] mount -t glusterfs peer1:MyGlusterRAID1 /media/MyGlusterRAID1 | ||
+ | </code> | ||
+ | |||
+ | Normalement, cela ne fonctionne pas et cela donne les messages suivants : | ||
+ | <code> | ||
+ | root@peer2: Mount failed. Please check the log file for more details. | ||
+ | clush: root@peer2: exited with exit code 1 | ||
+ | root@peer4: Mount failed. Please check the log file for more details. | ||
+ | clush: root@peer4: exited with exit code 1 | ||
+ | root@peer3: Mount failed. Please check the log file for more details. | ||
+ | clush: root@peer3: exited with exit code 1 | ||
+ | root@peer1: Mount failed. Please check the log file for more details. | ||
+ | clush: root@peer1: exited with exit code 1 | ||
+ | </code> | ||
+ | Il est en effet nécessaire d'arrêter et redémarrer le volume GlusterFS pour permettre l'accès au volume chiffré : | ||
+ | <code> | ||
+ | ssh root@peer1 "echo y | gluster volume stop MyGlusterRAID1" | ||
+ | ssh root@peer1 gluster volume start MyGlusterRAID1 | ||
+ | </code> | ||
+ | |||
+ | Après cette opération : | ||
+ | <code> | ||
+ | clush -w root@peer[1-4] mount -t glusterfs peer1:MyGlusterRAID1 /media/MyGlusterRAID1 | ||
+ | clush -w root@peer[1-4] df | grep MyGlusterRAID1 | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | root@peer1: peer1:MyGlusterRAID1 3903488 1730432 1934592 48% /media/MyGlusterRAID1 | ||
+ | root@peer3: peer1:MyGlusterRAID1 3903488 1730432 1934592 48% /media/MyGlusterRAID1 | ||
+ | root@peer4: peer1:MyGlusterRAID1 3903488 1730432 1934592 48% /media/MyGlusterRAID1 | ||
+ | root@peer2: peer1:MyGlusterRAID1 3903488 1730432 1934592 48% /media/MyGlusterRAID1 | ||
+ | </code> | ||
+ | |||
+ | Essayons maintenant de monter le volume chiffré sur le client : | ||
+ | <code> | ||
+ | sudo mount -t glusterfs peer1:MyGlusterRAID1 /media/MyGlusterRAID1 | ||
+ | </code> | ||
+ | Le message d'erreur est sans équivoque | ||
+ | <code> | ||
+ | Mount failed. Please check the log file for more details. | ||
+ | </code> | ||
+ | Si vous regardons les logs d'erreurs, nous trouvons : | ||
+ | <code> | ||
+ | [2016-12-14 15:16:13.200191] E [dht-helper.c:1666:dht_inode_ctx_time_update] (-->/usr/lib/x86_64-linux-gnu/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x4b19a) [0x7fa7a4b3c19a] -->/usr/lib/x86_64-linux-gnu/glusterfs/3.8.4/xlator/cluster/distribute.so(+0x33d09) [0x7fa7a489cd09] -->/usr/lib/x86_64-linux-gnu/glusterfs/3.8.4/xlator/cluster/distribute.so(+0xa464) [0x7fa7a4873464] ) 0-MyGlusterRAID1-dht: invalid argument: inode [Argument invalide] | ||
+ | </code> | ||
+ | |||
+ | Ceci est dû au fait que, lorsque nous avons agrégé les certificats (commande ''cat peer*.pem >> glusterfs.ca'', nous avons omis celui du client ''gluster-client.pem''. | ||
+ | |||
+ | Effectuons les opérations suivantes : | ||
+ | <code> | ||
+ | # Demontage des volumes montes | ||
+ | clush -w root@peer[1-4] umount /media/MyGlusterRAID1 | ||
+ | # Arret du volume MyGlusterRAID1 | ||
+ | ssh root@peer1 "echo y | gluster volume stop MyGlusterRAID1" | ||
+ | # Creation du nouvel agregat de certificats | ||
+ | cat peer*pem gluster-client.pem >> glusterfs.ca | ||
+ | # Diffusion de l'agregat de certificats | ||
+ | seq 4 | xargs -I '{}' scp glusterfs.ca root@peer'{}':/etc/ssl | ||
+ | # Copie locale de la clé dans le bon dossier | ||
+ | sudo cp glusterfs.key /etc/ssl | ||
+ | # Copie locale de l'agregat de certificat | ||
+ | sudo cp glusterfs.ca /etc/ssl | ||
+ | # Demarrage du volume MyGlusterRAID1 | ||
+ | ssh root@peer1 gluster volume start MyGlusterRAID1 | ||
+ | </code> | ||
+ | |||
+ | Nous pouvons (enfin) monter le volume de manière chiffrée : | ||
+ | <code> | ||
+ | sudo mount -t glusterfs peer1:MyGlusterRAID1 /media/MyGlusterRAID1 | ||
+ | </code> | ||
+ | Et vérifier son accès : | ||
+ | <code> | ||
+ | md5sum /media/MyGlusterRAID1/File.* | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | e0cebe0d913746ff4b506a4da55f986c /media/MyGlusterRAID1/File.01 | ||
+ | e49e69ae967bc7bc0ffad0aa8e713300 /media/MyGlusterRAID1/File.02 | ||
+ | 6e34c25900be11e3ed58ddee62f3d241 /media/MyGlusterRAID1/File.03 | ||
+ | de5256d745e9edcd0b006303fd7a9f7f /media/MyGlusterRAID1/File.04 | ||
+ | fa748e331d8c0fd6fd87f7b7f9299cc3 /media/MyGlusterRAID1/File.05 | ||
+ | 407a43d7a3fa120faff14357c2724503 /media/MyGlusterRAID1/File.06 | ||
+ | cb5432658b53aa208fcd9289bffb7106 /media/MyGlusterRAID1/File.07 | ||
+ | 93949c9c1b1f685a2feff0572afff008 /media/MyGlusterRAID1/File.08 | ||
+ | eefcff95428ca6d18fdaf0562a43b33e /media/MyGlusterRAID1/File.09 | ||
+ | 0130dc26e947eb016197bad4a8f6d0ee /media/MyGlusterRAID1/File.10 | ||
+ | </code> | ||
===== Fonctionnalités avancées ==== | ===== Fonctionnalités avancées ==== | ||
Ligne 721: | Ligne 1234: | ||
<code> | <code> | ||
- | clush -w peer[1-4] mkdir /MyGlusterReplica | + | clush -w root@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 create MyGlusterReplica replica 2 transport tcp peer1:/MyGlusterReplica peer3:/MyGlusterReplica force | ||
ssh root@peer1 gluster volume start MyGlusterReplica | ssh root@peer1 gluster volume start MyGlusterReplica | ||
ssh root@peer1 gluster volume info | ssh root@peer1 gluster volume info | ||
- | ssh peer1 gluster volume tier MyGlusterReplica attach replica 2 peer2:/MyGlusterReplica peer4:/MyGlusterReplica force | + | </code> |
- | ssh root@peer1 gluster tier status | + | <code> |
+ | Volume Name: MyGlusterReplica | ||
+ | Type: Replicate | ||
+ | Volume ID: 93689088-b6b5-413f-8a4b-3b395f6b965c | ||
+ | Status: Started | ||
+ | Snapshot Count: 0 | ||
+ | Number of Bricks: 1 x 2 = 2 | ||
+ | Transport-type: tcp | ||
+ | Bricks: | ||
+ | Brick1: peer1:/MyGlusterReplica | ||
+ | Brick2: peer3:/MyGlusterReplica | ||
+ | Options Reconfigured: | ||
+ | transport.address-family: inet | ||
+ | performance.readdir-ahead: on | ||
+ | nfs.disable: on | ||
+ | </code> | ||
+ | |||
+ | Activation du //tiering// sur les deux autres pairs **peer2** et **peer4** : | ||
+ | <code> | ||
+ | ssh root@peer1 gluster volume tier MyGlusterReplica attach replica 2 peer2:/MyGlusterReplica peer4:/MyGlusterReplica force | ||
+ | </code> | ||
+ | <code> | ||
+ | Tiering Migration Functionality: MyGlusterReplica: success: Attach tier is successful on MyGlusterReplica. use tier status to check the status. | ||
+ | ID: f1084e85-f5cb-475e-8457-fe258dca4533 | ||
+ | </code> | ||
+ | <code> | ||
+ | ssh root@peer1 gluster volume tier status | ||
+ | </code> | ||
+ | <code> | ||
+ | ssh root@peer1 gluster volume tier MyGlusterReplica status | ||
+ | Node Promoted files Demoted files Status | ||
+ | --------- --------- --------- --------- | ||
+ | localhost 0 0 in progress | ||
+ | peer4 0 0 in progress | ||
+ | peer3 0 0 in progress | ||
+ | peer2 0 0 in progress | ||
+ | Tiering Migration Functionality: MyGlusterReplica: success | ||
+ | </code> | ||
+ | <code> | ||
ssh root@peer1 gluster volume info | ssh root@peer1 gluster volume info | ||
</code> | </code> | ||
Ligne 756: | Ligne 1307: | ||
</code> | </code> | ||
+ | Montage du volume sur le client | ||
+ | <code> | ||
+ | sudo mkdir /media/MyGlusterReplica | ||
+ | sudo mount -t glusterfs -o noatime peer1:MyGlusterReplica /media/MyGlusterReplica | ||
+ | sudo chmod 777 /media/MyGlusterReplica | ||
+ | sudo chmod o+t /media/MyGlusterReplica | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | seq -w 1000 | /usr/bin/time xargs -P 1000 -I '{}' bash -c "echo Hello File '{}' > /media/MyGlusterReplica/File.'{}'" | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | clush -w root@peer[1-4] 'ls /MyGlusterReplica/File.* | wc -l' | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | root@peer1: 1000 | ||
+ | root@peer3: 1000 | ||
+ | root@peer4: 1000 | ||
+ | root@peer2: 1000 | ||
+ | </code> | ||
Résilience des disques | Résilience des disques | ||