Hier vers 12h40, une erreur humaine nous a fait perdre un petit nombre de bases de données clients. Nous avons été contraints de restaurer les bases concernées à partir des dernières sauvegardes. Tous les clients concernés ont reçu un email indiquant les bases touchées ainsi que la date de la sauvegarde précédente utilisée. Nous vous présentons nos plus sincères excuses, et revenons en détail dans ce billet sur ce qui s’est passé, ainsi que les mesures que nous allons prendre pour éviter que cela ne se reproduise à nouveau.
Ce qui s’est passé
Une commande de suppression (rm ‑fr) a été exécutée sur le serveur de production alors qu’elle était destinée à un serveur de développement. Cette commande a eu le temps de tourner environ une seconde avant d’être arrêtée, mais cela a suffi à supprimer une partie des bases de données. Nous avons alors immédiatement commencé à faire la liste des bases disparues. Une fois cette liste obtenue, nous avons recréé les bases à partir des dernières sauvegardes (effectuées chaque jour).
Et la redondance ?
Comme vous le savez, nos serveurs sont systématiquement redondés dans un second datacenter. Mais ce mécanisme n’est utile que lors des pannes de serveur ou de datacenter, pas pour les erreurs humaines. La synchronisation entre les datacenters se fait en temps réel, et les données modifiées sont immédiatement répercutées sur le serveur de secours.
Sitôt un fichier supprimé sur le serveur principal, il l’est également sur le serveur secondaire. Ce dernier ne nous est donc d’aucune aide dans ce cas précis, et seules les sauvegardes régulières peuvent nous aider à récupérer une version précédente des bases et fichiers.
Comment éviter un nouvel incident ?
Disons-le tout de suite : on ne pourra jamais exclure complètement l’erreur humaine, et cet incident n’a pas pour origine une négligence particulière de notre côté. Mais ça ne veut pas dire qu’on ne va rien faire suite à cet incident.
Il y a deux axes sur lesquels nous allons travailler : comment éviter une nouvelle erreur humaine, et comment être mieux préparé si elle devait se reproduire.
Éviter l’erreur humaine
À nouveau, il y a deux composantes pour atteindre cet objectif : par la technique, et par la prévention humaine.
Techniquement, nous allons réfléchir à mettre en place :
- un système de protection des suppressions sur les serveurs en production. safe-rm pourrait être une première solution ;
- un système de distinction visuelle (par exemple, des prompts de couleur différente) entre les serveurs en production et les autres.
Humainement, nous allons réfléchir à édicter des règles d’utilisation pour limiter les risques, par exemple :
- se déconnecter systématiquement d’un serveur en production une fois qu’on a effectué ce qu’on avait à faire dessus, pour éviter qu’une session inutile ne reste ouverte ;
- si on doit malgré tout garder une session ouverte, s’obliger à différencier le terminal, par exemple en évitant de rester sur le shell mais en démarrant une commande de type top ou nano.
Se préparer au pire
Une fois les fichiers supprimés, nous avons dû travailler à restaurer au plus vite les bases de données perdues. Une telle suppression sauvage des fichiers internes aux bases de données rend MySQL et PostgreSQL instables, et nous avons donc dû nous hâter de faire des tests sur un serveur temporaire pour s’assurer de la marche à suivre.
Par ailleurs, nous n’avions aucune méthode éprouvée pour détecter les bases supprimées puis réinstaller les dernières sauvegardes. Ce n’était pas très compliqué, mais cela a nécessité l’écriture de scripts et de tests pour s’assurer du bon fonctionnement de la procédure. C’est seulement ensuite que nous avons pu restaurer pour de bon les bases supprimées, d’où environ 2 heures de délai entre la suppression des fichiers et la restauration effective des bases.
Nous avons décidé il y a quelques semaines de lancer un programme de simulation des différents problèmes possibles sur notre architecture (panne de machine/réseau/datacenter, pénétration de nos systèmes, suppression de données). Ce n’est pas encore en place parce qu’il y a tout un travail technique en amont pour pouvoir dupliquer un serveur de production et y faire des simulations, mais cet incident nous montre une fois de plus l’intérêt d’être préparé à de multiples scénarios catastrophe.
Par ailleurs, nous sommes en train de travailler sur un nouveau système de redondance. Rien n’est encore fait, nous en sommes encore au stade de l’expérimentation, mais ce système pourrait nous permettre de faire des « snapshots » réguliers (par exemple, toutes les heures) de l’intégralité de nos données. S’il avait été en place, ce système nous aurait permis non pas de partir sur des sauvegardes datant de plusieures heures, mais maximum d’une heure. Nous aurons l’occasion de faire un billet à ce sujet si ce système se concrétise.
Ce qui a bien fonctionné
Terminons sur une note positive : nous pouvons relever que notre politique de communication en temps réel et de transparence, via notre compte Twitter, fonctionne bien en cas d’incident. Il faudrait encore l’améliorer en affichant, dans l’administration alwaysdata et sur notre forum, les incidents en cours (tout le monde n’est pas sur Twitter). Nous avons également pu contacter personnellement chacun de nos clients par email en leur indiquant précisément les bases touchées et la date de dernière restauration.
En outre, les sauvegardes ont été d’une grande utilité. Ce n’est pas une surprise, et chacun peut d’ailleurs accéder librement à ses sauvegardes via un répertoire de son compte. Mais c’était la première fois qu’elles ont été utilisées à grande échelle.
Pour conclure, j’aimerais présenter une nouvelle fois toutes nos excuses au nom de l’équipe alwaysdata pour ce malheureux incident. Merci à tous les messages d’encouragement que nous avons reçus, ils sont toujours très appréciés, a fortiori en situation de crise.
Cette transparence dans la transmission de l’info, cette rapidité dans les interventions et ce bon-sens dans les modes opératoires font d’Alwaysdata le meilleur hébergeur mutualisé que je connaisse, et Dieu sait si j’en ai testé.
C’est sûrement la faute du stagiaire.
Pour en avoir testé beaucoup moi aussi, je suis bien d’accord avec Jean-Benoit.
Et avec Cedric aussi :)
Je me doutais que la question du fautif arriverait. C’est Pierre qui a tapé la commande, mais la responsabilité m’incombe entièrement.
D’une part, parce que je ne l’ai pas sensibilisé sur la vigilance particulière à avoir lorsqu’on travaille sur plusieurs serveurs en même temps. D’autre part, parce c’est moi-même qui lui ai conseillé quelques minutes avant l’incident d’aller voir un fichier de configuration sur le serveur de production. Pas très malin.
C’est pourquoi s’il faut pointer du doigt quelqu’un, c’est uniquement moi. Ce billet a montré les différents éléments que nous allons mettre en place pour éviter que cela ne se reproduise, parce que ça aurait très bien pu m’arriver (d’ailleurs, ça m’est arrivé dans ma jeunesse).
Bon, pour l’exemple, on lui a quand même coupé un doigt.
L’erreur humaine existera toujours, travaillant dans le web je sais combien ça peut arriver bêtement… Pas besoin de pointer quelqu’un du doigt.
Du moment que l’équipe a appris de cette erreur, et que nous clients avons eu droit à une réaction rapide de votre part et à une totale transparence dans les explications, il n’y a rien à rajouter.
Bravo encore pour votre travail, votre réactivité, votre service est très bon et je suis fier d’en faire partie.
Bravo pour votre réactivité et transparence.
Du goudron et des plumes pour le stagiaire ;)
Il est vrai que la transparence sur ce type d’évènements est un vrai plus chez AD.
Par contre, si c’était juste pour « voir un fichier de configuration » que Pierre c’est connecté en root sur le serveur de production, il est de bon aloi de créer un utiliseur ayant uniquement des droits de lecture uniquement et d’utiliser sudo ?! Bosser en root, c’est pas bien ;)
YvesTan : je ne partage pas le point de vue classique qui préconise l’utilisation de sudo sur des serveurs (en desktop c’est différent). Dans 99,9 % des cas, lorsqu’on se connecte sur un serveur, c’est pour y effectuer des tâches qui nécessitent d’être root (même consulter un fichier de configuration). Du coup, il faudrait préfixer chacune de nos commandes par sudo, ce qui est fastidieux et n’apporterait aucune protection supplémentaire.
Si on utilisait sudo, il y a fort à parier que l’erreur humaine de vendredi n’aurait pas été évitée : au lieu de “rm ‑fr” on aurait tapé “sudo rm ‑fr” :)
Nous avons mis en place ce matin tous les points évoqués dans « Éviter l’erreur humaine ». Le prompt de couleur et, surtout, safe-rm, rendent impossible un incident similaire à celui de vendredi :
# rm ‑fr /data/
safe-rm : skipping /data/
#
Bien sûr, il reste beaucoup d’autres erreurs humaines possibles, je n’annonce malheureusement pas que nous sommes immunisés.
Bravo et merci à vous pour la transparence et la réactivité (mais c’est une habitude chez vous :-)
Bien sur, personne n’est infaillible et une erreur est toujours possible mais quand on sait, comme vous, apprendre de ses erreurs on tire vers l’excellence.
Cordialement
Il faut aussi mettre dans votre site web un système d’affichage des Tweets depuis votre compte Twitter .
Bravo pour votre transparence, vous marquez (encore) un point.
Bon, il ne faudrait pas que ça se reproduise trop souvent (la perte de données) ;-)
Point besoin de montrer le « coupable » du doigt, sauf s’il récidive…
Et pour ce qui est de l’erreur « site de prod » versus « site de test », c’est malheureusement un classique, qui reviendra : pour moi, la dernière fois, c’était entre 2 serveurs http://FTP...
PS : j’ai reçu le mail d’explication, très bien.
Continuez comme ça,
M.
L’erreur est humaine, pour ma part ca n’entache pas la qualité du service.
J’ai eu certes quelques petits messages de mes clients, mais rien de bien grave.
Pour 1000 et une bonne chose de chez AlwaysData, une petite erreur, ce n’est pas la mort !
Je soutient toujours ce service et j’en suis fiers.
Je crois que j’ai un pb avec ma base car du 04 au 06 juin j’ai effectué un transfert qui a très mal echoué et depuis seules les données que j’ai essayé de transferer ne le sont plus par contre tout va bien. Je cherche encore comment les faire intégrer.
Merci pour la clairvoyance et votre serenité.
tsarison : je n’ai pas bien compris votre problème. Pourriez-vous ouvrir un ticket en nous décrivant en détails ce qui ne va pas ?
Bravo et merci à vous pour la transparence et la réactivité (mais c’est une habitude chez vous :-)
Bien sur, personne n’est infaillible et une erreur est toujours possible mais quand on sait, comme vous, apprendre de ses erreurs on tire vers l’excellence.
Cordialement