gluster volume heal <vol> info vous renvoie une liste de fichiers. Vous relancez. La liste ne bouge pas. Une heure plus tard, les mêmes chemins sont toujours là, en attente de réparation. Le démon de self-heal tourne, les briques répondent, et ce compteur refuse de descendre à zéro. Vous commencez à craindre que quelque chose se soit cassé en profondeur. Parfois, c’est le cas.
Un split-brain GlusterFS, c’est quand deux copies d’un même fichier divergent sans qu’aucune n’arrive à se déclarer « la bonne ». La réparation automatique tourne en rond, faute de savoir quelle version garder. Sur un volume dispersed (erasure coding), ça se lit dans les attributs internes qui ne concordent plus entre les briques.
Avant de crier au split-brain
L’erreur la plus fréquente, c’est de poser ce diagnostic trop vite. Trois causes plus banales se ressemblent, et elles se vérifient en deux commandes.
D’abord, un heal qui travaille vraiment. Sur un gros volume après un redémarrage, la reconstruction se compte en heures. Relancez gluster volume heal <vol> info à dix minutes d’intervalle : si le nombre de fichiers diminue, même lentement, laissez faire. Vous n’avez pas de split-brain. Vous avez juste à patienter.
Ensuite, une brique absente ou un réseau qui clignote. gluster volume status vous dit si toutes les briques sont en ligne. Un lien instable entre les nœuds suffit à relancer le heal en boucle : il répare, le lien saute, il recommence. Le compteur oscille sans jamais finir.
Reste le vrai cas. Briques en ligne, réseau stable, et pourtant le compteur ne bouge pas d’un fichier depuis des heures. Toujours les mêmes chemins. Là, les copies divergent pour de bon.
Lire les attributs pour trancher
Sur un volume dispersed, la vérité est dans les attributs étendus de chaque fragment. Sur chaque brique, pour un fichier suspect :
getfattr -d -m . -e hex /chemin/brique/vers/le/fichier
Comparez trusted.ec.version et trusted.ec.dirty entre les briques. La première dit quelle révision du fichier chaque fragment porte ; la seconde signale une écriture laissée en plan. Quand les versions ne concordent pas et que le self-heal n’arrive pas à recoller, vous n’avez plus affaire à une réparation en cours. Vous avez une divergence qu’aucun automatisme ne tranchera à votre place.
Le cas qui m’a pris des heures
Un volume dispersed 2+1, trois nœuds. Sur le papier, il encaisse la perte d’un nœud sans broncher. Ce jour-là, aucun nœud n’était tombé. C’étaient les trusted.ec.version qui ne s’accordaient plus, sur une poignée de fichiers seulement. Le self-heal les reprenait, échouait à reconstruire, les remettait en file, repartait. Une boucle propre et sans fin.
Je l’ai dénoué fichier par fichier. Lire les attributs sur chaque brique, repérer la version cohérente, écarter le fragment fautif pour que le heal reprenne la main sur une base saine. À la pince à épiler, un fichier après l’autre. L’erasure coding vous fait gagner du disque ; le jour où ça diverge, vous le repayez en heures d’attention.
La réparation, et pourquoi elle fait peur
Une fois la bonne version identifiée, le geste consiste à remettre les fragments d’accord : retirer la copie incohérente sur la brique fautive, ou corriger les attributs de version, puis relancer le heal pour qu’il reconstruise proprement. En théorie, deux lignes. Dans les faits, chaque commande écrit sur de la donnée de production.
Un setfattr posé sur le mauvais fragment, ou la mauvaise version retenue, et le fichier ne revient pas. Il n’y a pas d’annulation. C’est le genre d’opération qu’on fait lentement, en relisant deux fois, sur un volume dont on a pris une sauvegarde juste avant.
Quand poser les outils
Le critère est net : à la seconde où vous éditez un trusted.ec.* à la main sur un volume de prod, vous avez quitté l’auto-dépannage. Tant que vous lisez les attributs, vous diagnostiquez, et vous ne risquez rien. Dès que vous écrivez, chaque erreur est définitive.
Si la donnée compte et que vous n’êtes pas certain de la version à garder, arrêtez-vous là. Prenez une sauvegarde, et faites valider la manipulation avant de l’appliquer. Un heal qui traîne une nuit de plus coûte moins cher qu’un fichier réécrit de travers.