Récupération GlusterFS suite à la perte d'un brick
Cette page indique comment remettre en service un volume GlusterFS suite à la perte d'un node.
Situation initiale:
- 1 volume GlusterFS est répliqué entre deux serveurs physiques
- Le volume n'est constitué que de deux bricks (1 par serveur), et repose sur un FS XFS, lui même au dessus d'un volume LVM thin
- Pas de quorum ni d'arbitrer
- Suite à un arrêt inopiné (pb d'alimentation électrique), les méta données du pool thin sont corrompues, ne peuvent être réparées avec lvconvert, et l'ensemble des données d'un node est donc perdu
- Testé sur la version 3.5.3 de GlusterFS (mais devrait être identique sur les versions plus récentes)
Il faut donc re-créer des volume, et réintégrer ce node défectueux au cluster, en étant sûr du sens de la synchronisation.
Couper les process gGluster sur le node en défaut
Pour éviter les mauvaise surprises, il faut arrêter tous les processus glusterd, et glusterfsd sur le node en défaut.
Restaurer /var/lib/glusterfs
La première étape est de restaurer le contenu du répertoire /var/lib/glusterfs si nécessaire (ce répertoire devrait toujours être sauvegardé, la procédure est plus complexe si sont contenu est perdu)
Noter l'ID du volume GlusterFS depuis le bon node
Sur le bon node, il faut récupérer l'ID du volume GlusterFS. En utilisant la commande getfattr. Dans cet exemple, le point de montage du brick est /mnt/bricks/vmstore. La commande est
getfattr -d -e hex -m. /mnt/bricks/vmstore
C'est la valeur de l'attribut trusted.glusterfs.volume-id qui nous intéresse ici
Recréer des volumes vierges sur le mauvais node
Sur le node en défaut, on peut jeter notre pool Thin et le recréer, puis recréer les volumes vides, et les formater
lvremove vg_data/vmstore lvremove vg_data/pool lvcreate --thin -L13T vg_data/pool lvcreate --thin -V10T -n vmstore vg_data/pool mkfs.xfs -L VMSTORE -i size=512 /dev/vg_data/vmstore
Puis, on remonte ces FS au même endroit qu'avant l'incident
Restaurer les attributs étendus
Sur le node en défaut, on restaure les attributs étendus utilisé par GlusterFS
setfattr -n trusted.glusterfs.volume-id -v 0x7ed967f13b3346d789080bb78c6e9199 /mnt/bricks/vmstore setfattr -n trusted.gfid -v 0x00000000000000000000000000000001 /mnt/bricks/vmstore
Forcer la sélection du bon node comme source
Pour s'assurer que le bon node sera utilisé comme source de synchro, on va faire des modification au dessus du point de montage GlusterFS. Dans cet exemple, le volume est monté sur /var/lib/libvirt/images
mkdir /var/lib/libvirt/images/xxxx rmdir /var/lib/libvirt/images/xxxx setfattr -n trusted.non-existent-key -v abc /var/lib/libvirt/images/ setfattr -x trusted.non-existent-key /var/lib/libvirt/images/
Redémarrer glusterd sur le node en défaut
On peut maintenant relancer glusterd sur le node en défaut, il devrait se reconnecter automatiquement et commencer le heal