Ce lundi 7 février, entre 15h48 et 21h, les mails, les accès FTP, WebDAV et notre propre site ont été largement indisponibles. L’ensemble des autres services n’a pas été impacté, notamment les sites Web et bases de données de nos clients, les serveurs DNS, l’accès SSH. Aucune donnée n’a été perdue.
Le déroulement précis de cette panne exceptionnelle – la plus longue de notre histoire – est détaillé dans la suite de ce billet. Nous reviendrons également sur les mesures qui seront prises pour éviter que cela ne se produise à nouveau.
Ce qui s’est passé
Vers 15h45, j’entreprends de mettre à jour les outils PostgreSQL (comprenant notamment pg_dump) en version 9.0 sur le serveur hébergeant les sites *.alwaysdata.com (nos propres sites, donc, pas les sites de nos clients) et notre base de données de production.
Pour ce faire, je dois préalablement supprimer les outils de la version 8.4 ; or la suppression de ces outils entraîne la suppression de PostgreSQL lui-même (le serveur). Malgré la demande de confirmation, je valide, croyant à tort qu’il s’agit de fichiers communs et non de la partie serveur de PostgreSQL. De cette terrible erreur humaine découleront 5h de panne.
MISE À JOUR : Plusieurs personnes nous ont fait remarquer qu’il serait préférable d’effectuer les mises à jour sensibles la nuit, et de les tester auparavant. Je me suis donc mal exprimé : il ne s’agissait pas d’une mise à jour de PostgreSQL, mais simplement d’un paquet annexe et totalement secondaire. Ce genre d’opération est effectuée quotidiennement et ne pose aucun risque. Sans cette erreur humaine, j’aurais simplement annulé la commande au moment de confirmer. Les mises à jour présentant le moindre risque sont, elles, bien testées sur un serveur de test puis effectuées la nuit.
Hélas, la suppression de PostgreSQL entraîne – sous Debian – la suppression des données elles-mêmes, et non simplement du logiciel (ce qui est à mon sens une très mauvaise idée). Malgré une CTRL+C quasiment immédiat, une partie des fichiers de notre base de données de production a été supprimée. Pour maximiser les chances de restauration, j’arrête tout ce qui tourne sur le serveur et démonte la partition.
À cet instant – 15h48 – notre base de données de production est inaccessible. Or cette base, en plus d’être utilisée par nos sites et notre interface d’administration – est également utilisée pour l’authentification SMTP, IMAP/POP, FTP et WebDAV. C’est pourquoi il est désormais impossible de se connecter à une boîte mail, d’envoyer/recevoir un mail, ou de se connecter en FTP/WebDAV. Les utilisateurs déjà connectés (en IMAP ou en FTP par exemple) ne sont pas concernés.
Je réalise rapidement que le contenu de notre base de production est intact, mais que les fichiers de la base système de PostgreSQL sont touchés. Dans ce cas de figure, il n’y a malheureusement pas de méthode systématique pour pouvoir réaccéder aux données ; il faut mettre les mains dans le cambouis. Il est impossible de donner une estimation d’heure pour le retour à la normale : cela peut prendre 15 minutes, ou beaucoup plus.
Après presque deux heures sans succès, et voyant que la situation risque de perdurer, nous décidons de remettre une sauvegarde en ligne, accessible en lecture seule uniquement, et servant au FTP, WebDAV et POP/IMAP. À 17h38, donc, ces services sont de nouveau opérationnels, sauf pour les comptes récemment créés (ne se trouvant pas dans la dernière sauvegarde). Le SMTP est exclu pour éviter de refuser (et donc perdre) des emails entrants pour les nouveaux comptes.
Il nous faudra encore près de 3h avant de parvenir à restaurer intégralement la base de production, sans aucune perte de données.
Éviter que cela ne se reproduise
À chaque panne que nous rencontrons, de la plus petite à la plus importante, nous nous interrogeons systématiquement sur les moyens à mettre en place pour éliminer – ou du moins largement atténuer – les risques qu’elle ne se reproduise.
Commençons par évoquer l’origine du problème : l’erreur humaine. Il est possible, dans certains cas, de minimiser les chances de faire une erreur. Nous avions ainsi instauré l’année dernière certains changements : distinction des machines de développement et de production en rajoutant de la couleur au prompt, installation d’un outil empêchant de supprimer (via rm) des données vitales. Dans le cas présent, malgré la demande de confirmation, ma confusion m’a fait prendre une décision désastreuse. À ce niveau-là, je ne vois pas de moyen miracle d’empêcher que cela ne se reproduise.
La solution est donc d’ordre technique. Notre base de production, cruciale pour le fonctionnement de plusieurs de nos services, représente un évident SPOF (Single Point of Failure). La solution, tout aussi évidente, est donc de la dupliquer. Triste ironie, nous avions déjà prévu cette amélioration qui devait intervenir très prochainement…
Depuis PostgreSQL 9.0, un mécanisme de synchronisation des données en temps réel est inclus en standard. C’est ce que nous allons utiliser pour avoir une base miroir, accessible en lecture seule, sur un second serveur indépendant (situé dans un datacenter différent du premier). Ainsi, en cas de suppression sauvage de la base – ou de tout autre problème sur le serveur primaire – le serveur secondaire prendra immédiatement le relai, et aucun des services cruciaux ne sera perturbé.
Cette synchronisation en temps réel ne résout toutefois pas un autre problème potentiel : celui d’une suppression des données au niveau SQL (via un DELETE ou un DROP). Toute modification de la base sur le serveur primaire se fait instantanément sur le serveur secondaire, donc les données seraient définitivement perdues.
Pour pallier ce problème potentiel, nous allons renforcer notre fréquence des sauvegardes de cette base. Aujourd’hui quotidienne, nous allons la passer à une fréquence plus élevée – probablement chaque heure. Notre serveur secondaire sera basé sur EC2, où le système de snapshot permettra de gérer ces sauvegardes automatiques de manière très simple.
En conclusion
Nous présentons naturellement nos plus sincères excuses à tous nos clients pour cette panne exceptionnelle. Sachez qu’à aucun moment vos données n’ont été menacées.
Nous travaillons maintenant depuis plusieurs semaines exclusivement sur le renforcement de notre stabilité générale, concernant tous les services – c’est la raison pour laquelle les nouveautés sont peu nombreuses en ce moment. Le déploiement de notre nouvelle architecture, première source d’indisponibilité en 2010, est désormais bien derrière nous, et 2011 s’annonce sous les meilleurs auspices, à tous points de vue.
À très bientôt pour des nouvelles plus agréables :)
tout d’abord, bravo pour cette autopsie ; ça fait toujours du bien de voir que les erreurs sont assumées et qu’elles mènent à une réflexion.
Suggestion « comme ça » : mais attention, disclaimer, je suis pas sysadmin et je ne sais pas dans quelle mesure cette suggestion est pertinente / faisable / coûteuse, etc.
Pourquoi ne pas, avant chaque mise à niveau ou opération potentiellement « dangereuse » sur les serveurs de production ne pas « répéter » l’opération auparavant, sur un serveur « poubelle », de test ou « d’entraînement » ? J’explique : avoir un serveur annexe, secondaire, miroir le plus exact possible de la prod actuelle. Mettre en route sur ce serveur la séquence des opérations, identifier les erreurs possibles ou les dangers de ces opérations. Si besoin, tout arrêter, remonter le miroir « from scratch », et répéter l’opération autant que nécessaire pour être bien sûr que l’enchaînement soit maîtrisé.
Avec ce « sparring partner », on peut même imaginer s’entraîner à des opérations moins périlleuses, pour des stagiaires de passage ou des expérimentations…
voilà.
Un nouveau client, j’etais nerveux lundi, mais rassure maintenant de voir cette explication honnete et pleine du probleme.
merci !
Thank you for the update, this kind of detailed explanation is very helpful and reassuring.
Bravo, pour votre franchise cela permet aussi devoir que le vieil adage sur les admin unix est toujours vrai :
« il existe 2 catégories d’admin unix :
– ceux qui ont fait une bétise avec root
– ceux qui vont faire une bétise avec root »
Continuez comme ca
A+
No” : tu n’es pas le premier à faire cette remarque, c’est donc que j’ai manqué de précision dans mon explication.
La mise à jour ne concernait que les outils PostgreSQL, pas le serveur lui-même. C’est une opération absolument triviale, sans risque, si bien sûr je n’avais pas eu cette confusion dramatique.
Que les choses soient claires, il ne s’agissait donc pas de migrer de PostgreSQL 8.4 vers 9.0 ; ce genre d’opération est évidemment systématiquement testé et retesté sur un serveur à part, copie à l’identique du serveur de production, et ensuite seulement effectué en production (de nuit).
Non, là ce n’était une simple mise à jour d’un paquet, le genre d’opération que je fais quasiment quotidiennement…
Bonsoir,
Je reconnais bien là la transparence d’AlwaysData, toujours réactif et au service du client.
Cependant, j’aurais une question.
Selon les conditions contractuelles, je cite :
« Grâce aux multiples redondances dont nous disposons (matériel, réseau, datacenter), nous sommes en mesure de vous garantir une disponibilité de 99,9 % en hébergement dédié (avec une GTI de 30 minutes et GTR de 60 minutes), et de 99,8 % en hébergement mutualisé. Ces garanties sont contractuelles et donnent lieu à des pénalités en cas de non respect. »
Après un rapide (mais fastidieux, c’est loin la terminale S :) ) calcul, j’obtiens :
0.002 * 30 * 24 = Un peu moins d’1h30 d’indisponibilité par mois.
Or, d’après ce que j’ai pu lire dans votre billet, on a dépassé ce temps-ci d’indisponibilité (partielle, certes, mais personnellement certains mails sont assez importants à mes yeux, notamment du point de vue professionnel), et je pense donc que, du fait de cette indisponibilité, les clients d’un hébergement mutualisé devraient bénéficier d’un « remboursement » (ajout d’un ou plusieurs jours sur leur hébergement, que sais-je encore).
Qu’en pensez-vous ?
jmsche : il n’y a aucun doute possible, les garanties de disponibilité ne seront malheureusement pas respectées ce mois-ci. Veuillez ouvrir un ticket pour bénéficier du remboursement.
Cela dit, d’où sortez-vous ce paragraphe ? Nos CGV actuelles (dont le lien se trouve dans notre footer) n’ont pas cette formulation-là :)
Je l’avais lu à l’époque sous l’ancienne version d’AlwaysData, et je l’ai retrouvé aujourd’hui ici : http://www.alwaysdata.com/features/ha/
:)
Merci pour votre billet et vos explications.
On se sent toujours mieux face a un syadmin qui reconnait ses erreurs.
Etant nouveau client, je suis très agreablement surpris par la qualité de votre service. Surtout ne changez rien, votre reactivité, disponibilité et franchise valent de l’or. Pour ma part je ne vous demanderai pas de remboursement car j’estime que vous avez très bien fait votre travail.
Je suis venu chez vous pour django et python, je vais y rester pour le serieux et la confiance que vous m’inspirer.
Tous mes encouragements pour la suite de vos travaux,
Cordialement,
Nicolas (neagee)
J’ai l’impression que le « patern » est toujours le même (en fonction de ma propre expérience, pas spécifiquement chez vous :-)) :
- c’est toujours la partie non redondée qui foire
– si on redonde en temps réel, une erreur humaine vient détruire la partie redondée quasi instantanément
J’en déduis :
– qu’il faut tout redonder
– qu’il faut backuper le redond (?) à une fréquence utile (= le temps le plus long possible permettant de se rendre compte que les données sont corrompues, le plus court possible afin de perdre le moins possible de données)
Un sacré chalenge, bon courage et bravo pour la transparence !
Philippe : oui, c’est exactement ce que nous allons mettre en place (redondance temps réel + backup très fréquent du serveur secondaire).
Cela dit, il arrive qu’une partie redondée foire, c’est juste que dans ces cas-là personne ne s’en rend compte (à part le sysadmin) :)
Merci pour cette transparence. Les tweets sont bien utiles dans ces situations pour penser à prévenir les clients.
Comme tout le monde, bravo pour la franchise.
Merci aussi pour les explications et bonne continuation.
Comme providenz le note, les tweets sont bien utiles dans ces cas.
A+
Bonjour à tous,
Mais pourquoi diable mettre à jour les utilitaires PostgreSQL si on ne change pas de version de serveur ? Zarb ça ! Vouliez-vous une version 9.0 de pg_dump pour pouvoir dumper des bases et les remonter en 9.0 ?
Sinon pour 2011 j’ai quand-même un peu peur, car si l’hospice s’annonce ce n’est pas vraiment un très bon auspice !
Salutations,
Guillaume
Guillaume : phpPgAdmin requiert pg_dump pour faire ses exports, or nous sommes depuis quelques semaines déjà en 9.0 pour les bases de données de nos clients, et le pg_dump de la 8.4 refusait de fonctionner (ce qu’on venait de me faire remarquer). Voilà ce qui a déclenché la mise à jour.
Quant aux hospices, c’est corrigé ; je suis vert de honte.
Merci pour la transparence et la réactivité pour résoudre ce problème.
Bonjour à tous,
Le vrai professionnalisme, c’est d’essayer de comprendre activement l’origine de ses erreurs et de modifier notablement ses futures actions. Vous êtes bien dans cette voie !
Votre franchise vous honneur et me fournit une raison supplémentaire, pour vous confier plus de données :-)
Merci pour vos explications
hello there,
Interresting post here will came back
Keep like this