« LINUX:Glusterfs - Clients » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
(12 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 | 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 | 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. | |||
Ligne 120 : | Ligne 146 : | ||
===Service | ===Service n°3=== | ||
Nous proposons une solution un peu plus complexe. | 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 | ====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 207 : | Ligne 233 : | ||
====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 | |||
<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 | |||
FICHIER="$CHEMIN/fstab" | |||
# cas du type "glusterfs" dans /etc/fstab | |||
#FICHIER="/etc/fstab"</span> | |||
<span style="color:red"># bouclage infini !!!! | |||
for (( ; ; )) | |||
do</span> | |||
# 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 | |||
<span style="color:red"># pause de 60 secondes avant le passage suivant | |||
sleep 60 | |||
done</span> | |||
---- | |||
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. | |||