« LINUX:Glusterfs - Clients » : différence entre les versions

De WIKI sur Linux (ADB)
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
 
(10 versions intermédiaires par le même utilisateur non affichées)
Ligne 92 : Ligne 92 :


===Service n°1===
===Service n°1===
Pour pallier ce problème, on peut créer un service simple que l'on nommera "glusterfsmount.service" et qu'on place dans le répertoire "/etc/systemd/system". Voici son contenu:
Le problème semble venir du côté du réseau qui n'est pas totalement prêt.
 
Normalement l'option "_netdev" force que le montage s'effectue plus tard au niveau du "target" "remote-fs" de Systemd. Celui-ci doit être activé au niveau du "target" "multi-user" de Systemd pour être effectif. Ce "target" démarre après l'activation du réseau.
systemctl enable remote-fs.target
 
En outre le service "NetworkManager-wait-online.service" doit être activé. Il sert à attendre que les couches réseaux soient totalement effectives avant de permettre le lancement de la suite des services notamment le "target" "remote-fs".
systemctl enable NetworkManager-wait-online.service
 
Ces deux points sont normalement activés lors de l'installation.
 
 
Mais malgré ces précautions, le montage des volumes Glusterfs ne se fait pas; il essaye mais n'y parvient pas.
 
Nous avons trouvé une solution en forçant un délais avant le démarrage du service "NetworkManager-wait-online.service".
 
Pour y arriver, nous créons le répertoire "NetworkManager-wait-online.service.d" dans le répertoire "/etc/systemd/system". Dans ce nouveau répertoire, nous créons le fichier "attente.conf" dont voici le contenu:
----
[Service]
ExecStartPre=/usr/bin/sleep 30
----
Avec cet ajout, on attend 30 secondes avant de lancer le processus "nm-online". Ce délais est à adapter selon votre situation.
 
 
===Service n°2===
Voici une autre solution pour pallier ce problème. On peut créer un service simple que l'on nommera "glusterfsmount.service" et qu'on place dans le répertoire "/etc/systemd/system". Voici son contenu:
----
----
  [Unit]
  [Unit]
  Description=GlusterFs : Montage
  Description=Montage de volumes GlusterFs
  After=network.target network-online.target
  After=network.target network-online.target
     
     
Ligne 107 : Ligne 131 :
  WantedBy=multi-user.target
  WantedBy=multi-user.target
----
----
Il s'exécutera toutes les 10 secondes tant qu'il est en erreur.
On l'active et on le lance:
On l'active et on le lance:
  systemctl enable glusterfsmount.service
  systemctl enable glusterfsmount.service
Ligne 114 : Ligne 140 :
Dès que ce service est arrêté:
Dès que ce service est arrêté:
  systemctl stop glusterfsmount.service
  systemctl stop glusterfsmount.service
tous ces disques distants sont démontés.
Tous ces disques distants sont démontés.




Ligne 120 : Ligne 146 :




===Service n°2===
===Service n°3===
Nous proposons une solution un peu plus complexe. Mais elle a plusieurs améliorations:
Nous proposons une solution un peu plus complexe. Elle apporte plusieurs améliorations:
* Si une des connexions ne peut s'établir, les autres le seront.
* Si une des connexions ne peut s'établir, les autres le seront.
* Si un des serveurs du cluster est inaccessible, il passera automatiquement à un autre des serveurs.
* Si un des serveurs du cluster est inaccessible, il passera automatiquement à un autre des serveurs.
Ligne 141 : Ligne 167 :




====Fichier de paramètres====
====Fichier de la liste des serveurs====
Il nous faut un fichier texte qui reprend la liste des serveurs GlusterFs du cluster. Ce fichier se nomme "hosts.txt" et est placé dans le répertoire "/manager/glusterfs".  
Il nous faut un fichier texte qui reprend la liste des serveurs GlusterFs du cluster. Ce fichier se nomme "hosts.txt" et est placé dans le répertoire "/manager/glusterfs".  


Ligne 204 : Ligne 230 :
  end
  end
  fichier:close()
  fichier:close()
----
====Fichier "fstab"====
Il ne faut pas oublier le fichier "/manager.glusterfs/fstab":
----
sv1.home.dom:/diskgfs1                    /brique1              glusterfs defaults,_netdev,transport=tcp 0 0
sv2.home.dom:/diskgfs2                    /brique2              glusterfs defaults,_netdev,transport=tcp 0 0
----
----


Ligne 215 : Ligne 249 :
  CHEMIN="/manager/glusterfs"
  CHEMIN="/manager/glusterfs"
  cd $CHEMIN
  cd $CHEMIN
  # on peut choisir de traiter les entrées du fichier /etc/fstab ou son propre fichier fstab
  <span style="color:green"># on peut choisir de traiter les entrées du fichier /etc/fstab ou son propre fichier fstab
  # cas type "glusterfs" dans //manager/glusterfs/fstab
  # cas type "glusterfs" dans //manager/glusterfs/fstab
  FICHIER="$CHEMIN/fstab"
  FICHIER="$CHEMIN/fstab"
  # cas du type "glusterfs" dans /etc/fstab
  # cas du type "glusterfs" dans /etc/fstab
  #FICHIER="/etc/fstab"
  #FICHIER="/etc/fstab"</span>
# bouclage infini !!!!
  <span style="color:red"># bouclage infini !!!!
  <span style="color:red">for (( ; ; ))
for (( ; ; ))
  do</span>
  do</span>
  # affichage de la date  
  # affichage de la date  
Ligne 289 : Ligne 323 :
   /usr/bin/df -h >> $CHEMIN/mnt.log
   /usr/bin/df -h >> $CHEMIN/mnt.log
   fi
   fi
  # pause de 60 secondes avant le passage suivant
  <span style="color:red"># pause de 60 secondes avant le passage suivant
   <span style="color:red">sleep 60
   sleep 60
  done</span>
  done</span>
exit 0
----
----
Ce script s'exécute indéfiniment afin de revalider régulièrement les montages. Si on élimine les lignes affichées en rouge, le traitement est unique.
Ce script s'exécute indéfiniment afin de revalider régulièrement les montages. Si on élimine les lignes affichées en rouge, le traitement est unique.


On peut choisir de traiter les lignes du fichier "/etc/fstab" comme classiquement ou son propre fichier local "fstab" selon la ligne active en début de script.
On peut choisir de traiter les lignes du fichier "/etc/fstab" comme classiquement ou son propre fichier local "fstab" selon la ligne active en début de script. (partie affichée en vert) Cette seconde solution peut être utilisée si nous devons utiliser en même temps plusieurs clusters. Dans ce cas, on dédouble le répertoire "/manager/glusterfs", un pour chaque cluster.
Cette seconde solution peut être utilisée si nous devons utiliser en même temps plusieurs clusters. Dans ce cas, on dédouble le répertoire "/manager/glusterfs", un pour chaque cluster.


Ensuite on aborde la boucle; un fichier journal "/manager/glusterfs/mnt.log" est créé à chaque passage. Le repérage des serveurs actifs du cluster s'effectue grâce au script LUA.
Ensuite on aborde la boucle; un fichier journal "/manager/glusterfs/mnt.log" est créé à chaque passage. Le repérage des serveurs actifs du cluster s'effectue grâce au script LUA.
Ligne 310 : Ligne 342 :




Ce script peut être mis en oeuvre de diverses façons.




====Utilisation du Cron====
Une première utilisation de se script peut être faire via le Cron.


Il faut utiliser dans ce cas la version du script Bash dont les lignes en rouge sont éliminées.


On ajoute alors dans le fichier "/etc/crontab" la ligne suivante:
----
# montage des disques GlusterFS
*/5 * * * * root /manager/glusterfs/checkgluster.boucle.bat > /manager/glusterfs/mnt1.log
----
Il va s'exécuter toutes les cinq minutes.




====Service à traitement périodique====
Une seconde utilisation va utiliser toutes les possibilités du script. La partie en rouge du script reste.
Voici le contenu de ce service que l'on nommera "glusterfsmonterboucle.service" et qu'on place dans le répertoire "/etc/systemd/system":
----
[Unit]
Description=GlusterFs : Montage de volumes GlusterFs
After=network.target network-online.target
&nbsp;
[Service]
Type=simple
ExecStart=/manager/glusterfs/checkgluster.boucle.bat
&nbsp;
[Install]
WantedBy=multi-user.target
----
Il boucle sur lui-même.
On l'active et on le lance:
systemctl enable glusterfsmonterboucle.service
systemctl start glusterfsmonterboucle.service
Il monte les volumes GlusterFs repris dans le fichier "/etc/fstab".


Dès que ce service est arrêté:
systemctl stop glusterfsmonterboucle.service
Tous ces disques distants sont démontés.





Dernière version du 16 juin 2023 à 13:14


retour au menu de Glusterfs


But

Maintenant que les serveurs sont configurés, on passe à l'utilisation de ses ressources par les clients.

Elle consiste à se connecter à une ressource disque ou volume fournie par le "pool" de serveurs GlusterFs. Il existe plusieurs possibilités.


Matériel et adressage IP

Pour nos exemples, nous nous baserons sur le matériel et son adressage IP présenté sous l'article Serveurs GlusterFs.

LINUX:Glusterfs1.pdf


Pilote natif

Le logiciel GlusterFs fournit un pilote natif nommé "Fuse" qui permet à tous client de se connecter et d'utiliser un volume GlusterFs comme on monte une partition disque locale.


Installation

Sur nos machines clients, il faut installer les paquets suivants:

dnf install glusterfs glusterfs-fuse


Configurer le mur de feu ou FireWall

Pour pouvoir se connecter aux serveurs du cluster GlusterFs, il faudra ajouter des règles dans notre FireWall si nous faisons un filtrage en sortie.

Sur base de notre exemple, voici deux règles à ajouter à Iptables:

-A OUTPUT -p tcp -m tcp --dport 24007 -m iprange --dst-range 192.168.1.71-192.168.1.76 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 49152:60999 -m iprange --dst-range 192.168.1.71-192.168.1.76 -j ACCEPT


Création du point de montage

En premier, on crée un répertoire dédié à cette connexion. Par exemple on crée le répertoire "brique1":

mkdir /brique1


Montage et démontage manuel

Les manipulations sont semblables à celles pour monter une partition d'un disque local.

On utilise la commande "mount" qui sert au montage de disque:

mount -t glusterfs <un serveur du cluster Gluster>:/<nom de volume> <répertoire de montage>

Par exemple, on désire monter le volume "diskgfs1" à partir de la machine "sv1.home.dom" sur le répertoire créé juste avant:

mount -t glusterfs sv1.home.dom:/diskgfs1 /brique1

On utilise le type de montage "glusterfs".

Pour le démontage, la commande classique est utilisée:

umount /brique1


Connexions réseaux

Au niveau des connexions réseaux, la machine client établit une connexion avec la machine serveur du cluster de connexion, ici "sv1.home.dom". C'est le port TCP 24007 à l'écoute du service "glusterd" qui assure cette connexion. Cette machine serveur peut être n'importe quelle machine du cluster même si cette machine n'intervient pas dans le volume concerné, ici "diskgfs1".


Ensuite une connexion est établie avec chaque machine serveur du cluster qui est concernée par le volume. Sur chacune de ces machines serveurs, c'est le port TCP à l'écoute du service "glusterfsd" lié au volume qui assure ces connexions. Pour notre exemple, on retrouve les machines "sv1.home.dom" et "sv2.home.dom".


Montage automatique

On utilise le fichier "/etc/fstab" bien connu. La syntaxe va différer au niveau des options:


<un serveur du cluster Gluster>:/<nom de volume> <répertoire de montage> glusterfs defaults,_netdev 0 0

Par exemple, on désire monter le volume "diskgfs1" à partir de la machine "sv1.home.dom" sur le répertoire créé juste avant:


sv1.home.dom:/diskgfs1                    /brique1              glusterfs defaults,_netdev 0 0

ou si on veut préciser le protocole TCP:


sv1.home.dom:/diskgfs1                    /brique1              glusterfs defaults,_netdev,transport=tcp 0 0

Pour le monter, manuellement, on utilise la commande classique:

mount -a

Pour le démontage, la commande classique est utilisée:

umount /brique1

Notons que dans le répertoire "/var/log/glusterfs" un fichier journal "brique1.log" est créé.

La commande:

df -h

affiche une nouvelle ligne pour le premier cas:


sv1.home.dom:/diskgfs1        149G    3,6G  146G   3% /brique1

pour le second cas:


sv1.home.dom:/diskgfs1.tcp    149G    3,6G  146G   3% /brique1


Reboot et montage automatique

Mais lors d'un redémarrage de la machine client, le montage ne se fait pas dans mon cas. Je n'est pas trouvé de solution simple; je ne semble pas être le seul. Sur les machines serveurs, il existe un service nommé "glusterfssharedstorage.service" se trouvant dans le répertoire "/usr/lib/systemd/system" qui effectue cette tâche s'il est activé.


Service n°1

Le problème semble venir du côté du réseau qui n'est pas totalement prêt.

Normalement l'option "_netdev" force que le montage s'effectue plus tard au niveau du "target" "remote-fs" de Systemd. Celui-ci doit être activé au niveau du "target" "multi-user" de Systemd pour être effectif. Ce "target" démarre après l'activation du réseau.

systemctl enable remote-fs.target

En outre le service "NetworkManager-wait-online.service" doit être activé. Il sert à attendre que les couches réseaux soient totalement effectives avant de permettre le lancement de la suite des services notamment le "target" "remote-fs".

systemctl enable NetworkManager-wait-online.service

Ces deux points sont normalement activés lors de l'installation.


Mais malgré ces précautions, le montage des volumes Glusterfs ne se fait pas; il essaye mais n'y parvient pas.

Nous avons trouvé une solution en forçant un délais avant le démarrage du service "NetworkManager-wait-online.service".

Pour y arriver, nous créons le répertoire "NetworkManager-wait-online.service.d" dans le répertoire "/etc/systemd/system". Dans ce nouveau répertoire, nous créons le fichier "attente.conf" dont voici le contenu:


[Service]
ExecStartPre=/usr/bin/sleep 30

Avec cet ajout, on attend 30 secondes avant de lancer le processus "nm-online". Ce délais est à adapter selon votre situation.


Service n°2

Voici une autre solution pour pallier ce problème. On peut créer un service simple que l'on nommera "glusterfsmount.service" et qu'on place dans le répertoire "/etc/systemd/system". Voici son contenu:


[Unit]
Description=Montage de volumes GlusterFs
After=network.target network-online.target
  
[Service]
Type=simple
ExecStart=/bin/mount -a -t glusterfs
Restart=on-failure
RestartSec=10
  
[Install]
WantedBy=multi-user.target

Il s'exécutera toutes les 10 secondes tant qu'il est en erreur.

On l'active et on le lance:

systemctl enable glusterfsmount.service
systemctl start glusterfsmount.service

Il monte les volumes GlusterFs repris dans le fichier "/etc/fstab".

Dès que ce service est arrêté:

systemctl stop glusterfsmount.service

Tous ces disques distants sont démontés.


Il y a un problème. Dans le cas où pour au moins une de ces entrées dans le fichier "/etc/fstab" a un problème, aucun des volumes n'est monté. Ce problème peut être une erreur dans la ligne (nom de serveur ou de volume incorrect) ou le service Glusterd du serveur concerné n'est pas joignable.


Service n°3

Nous proposons une solution un peu plus complexe. Elle apporte plusieurs améliorations:

  • Si une des connexions ne peut s'établir, les autres le seront.
  • Si un des serveurs du cluster est inaccessible, il passera automatiquement à un autre des serveurs.
  • Si nous utilisons plusieurs clusters différents, il est possible de le faire.
  • Il reteste les connexions établies périodiquement et corrige le tir si nécessaire.
  • Il est possible en cours de route de déconnecter un volume.


Cette approche est composée d'un script en Bash, d'un script en LUA et d'un service ou de l'utilisation du Cron.

Nous allons placer tous ces scripts dans le répertoire "/manager/glusterfs".


Installation

Pour utiliser le script en LUA, il faut installer l'interpréteur:

dnf install lua
dnf install lus-socket

Nous avons déjà rencontré cet interpréteur dans l'article sur la Configuration des services Lsyncd.


Fichier de la liste des serveurs

Il nous faut un fichier texte qui reprend la liste des serveurs GlusterFs du cluster. Ce fichier se nomme "hosts.txt" et est placé dans le répertoire "/manager/glusterfs".

Voici son contenu selon notre configuration:


sv1.home.dom
sv2.home.dom
sv3.home.dom
sv4.home.dom
sv5.home.dom
sv6.home.dom

Cet ordre se fait selon votre ordre de priorité. Si le client se situe sur une des machines du cluster, on peut ajouter l'entrée "localhost".


Script en LUA

Ce script est chargé de vérifier que le service Glusterd est bien actif sur les machines serveurs du cluster. Il utilise le fichier "hosts.txt" pour cette vérification et crée en retour un fichier "gluster.txt" qui contient la liste des serveurs accessibles. Ce script se nomme "gluster.lua" et est placé dans le répertoire "/manager/glusterfs". Il teste le port TCP 24007 du processus "glusterd".

Voici son contenu:


#!/bin/lua
  
socketbase = require("socket")
sockettcp = socketbase.tcp()
--sockettcp = assert(socketbase.tcp())
sockettcp:settimeout(1)
port = 24007
  
nomfichierhost="./hosts.txt"
fichierhost=io.open(nomfichierhost,"r")
  
machines = {}
i=0
  
for ligne in fichierhost:lines()
do
 i=i+1
 machines[i] = ligne
end
fichierhost:close()
  
nomfichier="./gluster.txt"
fichier=io.open(nomfichier,"w")
  
for ligne in fichierhost:lines()
do
 i=i+1
 machines[i] = ligne
end
fichierhost:close()
  
nomfichier="./gluster.txt"
fichier=io.open(nomfichier,"w")
  
for _, machine in ipairs( machines )
do
 local SocketMariadb, errMariadb = sockettcp:connect(machine, port)
 if SocketMariadb then
  fichier:write(machine.."\n")
  sockettcp:close()
 end
end
fichier:close()


Fichier "fstab"

Il ne faut pas oublier le fichier "/manager.glusterfs/fstab":


sv1.home.dom:/diskgfs1 /brique1 glusterfs defaults,_netdev,transport=tcp 0 0 sv2.home.dom:/diskgfs2 /brique2 glusterfs defaults,_netdev,transport=tcp 0 0



Script en Bash

Le script Bash suivant va utiliser le script Lua décrit ci-dessus. On le nomme "checkgluster.boucle.bat". Il est placé dans le répertoire "/manager/glusterfs".

Voici son contenu:


#!/usr/bin/bash
CHEMIN="/manager/glusterfs"
cd $CHEMIN
# on peut choisir de traiter les entrées du fichier /etc/fstab ou son propre fichier fstab
# cas type "glusterfs" dans //manager/glusterfs/fstab
FICHIER="$CHEMIN/fstab"
# cas du type "glusterfs" dans /etc/fstab
#FICHIER="/etc/fstab"
# bouclage infini !!!!
for (( ; ; ))
do
# affichage de la date 
 DT=`/usr/bin/date`
 echo $DT  > $CHEMIN/mnt.log
# récupération des serveurs actifs du cluster
 /usr/bin/lua gluster.lua
 TAILLE=`/usr/bin/wc -c gluster.txt | /usr/bin/awk '{printf("%s",$1)}' `
# démontage du volume si le serveur distante est inactive
 while IFS= read -r glm
 do
  IFS=$' :\t' read -r -a arr <<< "$glm"
  if [ "${arr[3]}" == "glusterfs" ]
  then
   MACHINEM=`/usr/bin/mount | grep "${arr[2]}" | /usr/bin/awk -F ":" '{printf("%s",$1)}' `
   if [ "$MACHINEM" != "" ]
   then
    MACHINE=`/usr/bin/grep $MACHINEM gluster.txt`
    if [ "$MACHINE" == "" ]
    then
     /usr/bin/umount ${arr[2]}
     echo "Démontage de ${arr[2]} - La machine ${arr[0]} est inactive" >> $CHEMIN/mnt.log
    fi
   fi
  fi
 done <<< "$(/usr/bin/sed '/^#/ d' < $FICHIER | /usr/bin/grep 'glusterfs')"
# traitement s'il y a des serveurs actifs dans le cluster
 if [ "$TAILLE" != "0" ]
 then
# démontage des volumes si la ligne commence par "##"
  while IFS= read -r glm
  do
   IFS=$' \t' read -r -a arr <<< "$glm"
   if [ "${arr[2]}" == "glusterfs" ]
   then
    if /usr/bin/mountpoint -q "${arr[1]}"
    then
     /usr/bin/umount ${arr[1]}
     echo "${arr[1]} démonté" >> $CHEMIN/mnt.log
    else
     echo "${arr[1]} est déjà démonté" >> $CHEMIN/mnt.log
    fi
   fi
  done <<< "$(/usr/bin/grep '^##' $FICHIER | grep 'glusterfs' | /usr/bin/sed 's/#//g')"
# montage des volumes non montés
  while IFS= read -r glm
  do
   IFS=$' :\t' read -r -a arr <<< "$glm"
   if [ "${arr[3]}" == "glusterfs" ]
   then
    if /usr/bin/mountpoint -q "${arr[2]}"
    then
     echo "${arr[2]} est déjà monté" >> $CHEMIN/mnt.log
    else
     MACHINE=`/usr/bin/grep ${arr[0]} gluster.txt`
     if [ "$MACHINE" == "" ]
     then
      MACHINE=`/usr/bin/head -n 1 gluster.txt`
     fi
     /usr/bin/mount -t "${arr[3]}" -o "${arr[4]}" "$MACHINE:${arr[1]}" "${arr[2]}"
     echo "${arr[2]} est monté sur la machine $MACHINE" >> $CHEMIN/mnt.log
    fi
   fi
  done <<< "$(/usr/bin/sed '/^#/ d' < $FICHIER | /usr/bin/grep 'glusterfs')"
# état des montages
  echo "=====================================================================" >> $CHEMIN/mnt.log
  /usr/bin/df -h >> $CHEMIN/mnt.log
 fi
# pause de 60 secondes avant le passage suivant
 sleep 60
done

Ce script s'exécute indéfiniment afin de revalider régulièrement les montages. Si on élimine les lignes affichées en rouge, le traitement est unique.

On peut choisir de traiter les lignes du fichier "/etc/fstab" comme classiquement ou son propre fichier local "fstab" selon la ligne active en début de script. (partie affichée en vert) Cette seconde solution peut être utilisée si nous devons utiliser en même temps plusieurs clusters. Dans ce cas, on dédouble le répertoire "/manager/glusterfs", un pour chaque cluster.

Ensuite on aborde la boucle; un fichier journal "/manager/glusterfs/mnt.log" est créé à chaque passage. Le repérage des serveurs actifs du cluster s'effectue grâce au script LUA.

A ce stade, on va boucler sur chaque serveur et si un point de montage utilise un serveur inactif, il sera démonté car va engendre des gros problèmes sur le client.

Ensuite on démonte des volumes montés s'ils ont été mis en commentaire ("##") entretemps dans le fichier "fstab".

Enfin on monte les volumes non encore montés en adaptant le serveur si celui désiré n'est pas accessible.

Le traitement se clôture par un état des espaces disques montés ("df") et on attend une minute avant un nouveau traitement.


Ce script peut être mis en oeuvre de diverses façons.


Utilisation du Cron

Une première utilisation de se script peut être faire via le Cron.

Il faut utiliser dans ce cas la version du script Bash dont les lignes en rouge sont éliminées.

On ajoute alors dans le fichier "/etc/crontab" la ligne suivante:


# montage des disques GlusterFS
*/5 * * * * root /manager/glusterfs/checkgluster.boucle.bat > /manager/glusterfs/mnt1.log

Il va s'exécuter toutes les cinq minutes.


Service à traitement périodique

Une seconde utilisation va utiliser toutes les possibilités du script. La partie en rouge du script reste.

Voici le contenu de ce service que l'on nommera "glusterfsmonterboucle.service" et qu'on place dans le répertoire "/etc/systemd/system":


[Unit]
Description=GlusterFs : Montage de volumes GlusterFs
After=network.target network-online.target
  
[Service]
Type=simple
ExecStart=/manager/glusterfs/checkgluster.boucle.bat
  
[Install]
WantedBy=multi-user.target

Il boucle sur lui-même.

On l'active et on le lance:

systemctl enable glusterfsmonterboucle.service
systemctl start glusterfsmonterboucle.service

Il monte les volumes GlusterFs repris dans le fichier "/etc/fstab".

Dès que ce service est arrêté:

systemctl stop glusterfsmonterboucle.service

Tous ces disques distants sont démontés.





retour au menu de Glusterfs