Fin octobre 2021, le réseau mondial de jeux en ligne de Roblox est tombé en panne, une indisponibilité qui a duré trois jours. Le site est utilisé quotidiennement par 50 millions de joueurs. Les ingénieurs de Roblox et de son principal fournisseur de technologie, HashiCorp, ont dû déployer des efforts considérables pour trouver et résoudre les défaillances à l’origine de cette interruption. Á la fin du mois de janvier, dans un blog, Roblox a finalement fourni une analyse étonnante de ce qui s’était passé. Elle montre que la panne de réseau résulte de plusieurs événements concomitants. Pour toute entreprise exploitant une infrastructure en tant que code à grande échelle ou faisant un usage intensif de conteneurs et de microservices dans son infrastructure, les processus suivis par Roblox et HashiCorp pour diagnostiquer et finalement corriger les problèmes sont instructifs. Voici quelques-unes des leçons à tirer de la panne de Roblox.

Roblox a tout misé sur la pile logicielle de HashiCorp

Les jeux en ligne massivement multijoueurs de Roblox sont répartis dans le monde entier afin de fournir la latence réseau la plus faible possible et de garantir l'équité entre les joueurs qui peuvent se connecter depuis des lieux très éloignés les uns des autres. Pour gérer un ensemble de plus de 18 000 serveurs et 170 000 conteneurs répartis dans le monde entier, Roblox utilise donc Consul, Nomad et Vault de HashiCorp. Le logiciel Hashi est utilisé pour découvrir et planifier les charges de travail et pour stocker et faire tourner les clés de chiffrement. Lors de la conférence des utilisateurs HashiCorp 2020, Rob Cameron, directeur technique de l'infrastructure de Roblox, avait expliqué comment l'entreprise utilisait ces technologies et les raisons pour lesquelles elles étaient essentielles à son modèle économique (la transcription et l’enregistrement vidéo de la conférence sont disponibles ici, en anglais). M. Cameron avait déclaré que « si un joueur se trouvait aux États-Unis et qu’il voulait jouer avec un joueur situé en France », c’était tout à fait possible. « Nous trouverons une solution et nous leur donnerons les moyens de se connecter. Nous ferons en sorte de leur offrir la meilleure expérience de jeu possible en plaçant les serveurs de calcul aussi près des joueurs que possible », avait-il affirmé.

Les ingénieurs de Roblox ont suivi de fausses pistes

En recherchant la cause de la panne, les ingénieurs ont d'abord remarqué un problème de performance. D’emblée, ils ont supposé qu’un cluster matériel était défectueux, et ils l’ont remplacé par un nouveau matériel. Quand les performances ont continué à chuter, ils ont pensé à un autre motif : un trafic intense. Et l'ensemble du cluster Consul a été mis à niveau avec deux fois plus de cœurs de processeur (passant de 64 à 128 cœurs) et un stockage SSD plus rapide. D'autres actions ont été entreprises, notamment la restauration à partir d'un snapshot sain antérieur, le retour à des serveurs à 64 cœurs et d'autres changements de configuration. Mais toutes ont échoué. 

Leçon n° 1 : Même si les problèmes matériels ne sont pas rares à l'échelle à laquelle opère Roblox, mettre en cause dès le départ un problème matériel peut parfois s’avérer une fausse piste. Comme nous le verrons plus loin, la panne a été provoquée par plusieurs erreurs logicielles combinées. 

Roblox et HashiCorp identifient deux causes fondamentales

Les ingénieurs de Roblox et de HashiCorp finissent par identifier deux causes fondamentales. D’abord, ils ont trouvé un bogue dans BoltDB, une base de données open source utilisée dans Consul pour stocker certaines données de journal, qui ne nettoyait pas correctement son usage disque. Le problème a été exacerbé par une charge inhabituellement élevée sur une fonction de streaming de Consul, récemment mise en place par Roblox. 

Leçon n° 2 : Ne pas faire du neuf avec du vieux. Ce qui est intéressant dans ces causes, c'est qu'elles sont liées aux mêmes types de problèmes de gestion des ressources de bas niveau qui hantent les concepteurs de systèmes depuis les premiers jours de l'informatique. BoltDB n'a pas réussi à libérer de l'espace disque au fur et à mesure que les anciennes données du journal étaient supprimées. Le flux de données de Consul souffrait de conflits d'écriture sous des charges très élevées. Pour trouver la cause profonde de ces problèmes, il fallait savoir comment BoltDB gérait les pages libres dans son système de fichiers et comment le streaming de Consul utilisait la concurrence de Go. Le passage à l'échelle a une signification complètement différente aujourd'hui. Quand on exécute des milliers de serveurs et de conteneurs, les processus de gestion et de surveillance manuels ne sont pas vraiment possibles. Pour surveiller la santé d'un réseau aussi complexe et à grande échelle, il faut déchiffrer des tableaux de bord comme celui-ci :

Le monitoring de l'activité des ressources de Roblox n'a pas suffit à prévenir la panne de trois jours. (Roblox)

Leçon n°3 : tout fournisseur de services à grande échelle doit développer des routines d'automatisation et d'orchestration capables de repérer rapidement les défaillances ou les valeurs anormales, avant qu'elles ne mettent à mal l'ensemble du réseau. Pour Roblox, les variations de latence de quelques millisecondes sont importantes, c'est pourquoi ils utilisent la pile logicielle HashiCorp. Mais la façon dont les services sont segmentés est également essentielle. Roblox exécutait tous ses services de back-end sur un seul cluster Consul, ce qui a fini par constituer un point de défaillance unique dans son infrastructure. Depuis, Roblox a ajouté un deuxième site et a commencé à créer plusieurs zones de disponibilité pour renforcer la redondance de son cluster Consul.

Roblox utilise la pile HashiStack pour mieux maîtriser ses coûts

« Nous construisons et gérons notre propre infrastructure de base sur site car, à l'échelle à laquelle nous fonctionnerons à mesure que notre plate-forme se développera, nous pouvons contrôler les coûts de manière significative par rapport à l'utilisation du cloud public et gérer la latence de notre réseau », a écrit Roblox dans son blog. La « HashiStack » permet à Roblox de gérer efficacement un réseau mondial de services, et d'agir rapidement, en particulier en construisant des sites multi-nœuds en quelques jours. « Avec HashiStack, nous disposons d’un modèle de conception reproductible pour exécuter nos charges de travail où que nous allions », avait déclaré M. Cameron en 2020, lors de sa présentation. Cependant, trop de choses dépendaient d'un seul cluster Consul, non seulement l'ensemble de l'infrastructure de Roblox, mais aussi la surveillance et la télémétrie nécessaires pour comprendre l'état de cette infrastructure. 

Leçon n°4 : les compétences en matière de débogage réseau sont primordiales. Si l’on ne sait pas ce qui se passe dans son infrastructure réseau, on est dépassé. Mais pour déboguer des milliers de microservices, il ne suffit pas de vérifier les journaux des routeurs ; il faut aussi savoir comment s'assemblent les différents éléments en profondeur. Cette tâche était d'autant plus difficile pour Roblox qu'elle a construit toute son infrastructure sur son propre matériel serveur personnalisé. Il y avait aussi une dépendance circulaire entre les systèmes de surveillance de Roblox et de Consul. Par la suite, Roblox a supprimé cette dépendance et étendu sa télémétrie pour offrir une meilleure visibilité des performances de Consul et de BoltDB, ainsi que des schémas de trafic entre les services Roblox et Consul. 

Transparence vis-à-vis des clients en cas de pannes

Il ne suffit pas de dire « nous étions en panne, nous sommes de nouveau en ligne ». Il est important d’expliquer précisément ce qui s’est passé. Oui, il a fallu à Roblox plus de deux mois pour livrer ce bilan. Mais, le document qu'ils ont produit, détaillant les problèmes, montrant les faux départs et décrivant comment les équipes d'ingénieurs de Roblox et d'HashiCorp ont travaillé ensemble pour résoudre les problèmes, est vraiment très précieux. Il donne confiance dans Roblox, dans HashiCorp et dans leurs équipes d'ingénieurs. Quand j'ai envoyé un courriel aux relations publiques d'HashiCorp, ils m'ont répondu : « En raison du rôle essentiel que jouent nos logiciels dans les environnements de nos clients, nous collaborons activement avec eux pour leur fournir les meilleures pratiques recommandées et des conseils proactifs pour l'architecture de leurs environnements ». Espérons que votre fournisseur d'infrastructure critique sera aussi bien disposé lors de votre prochaine panne. 

Manifestement, Roblox a dépassé les limites de ce que pouvait offrir HashiStack, mais la bonne nouvelle, c'est qu'ils ont compris les problèmes et les ont finalement résolus. Résoudre une panne en trois jours n’est pas exceptionnel. Cependant, compte tenu de la taille et de la complexité de l'infrastructure de Roblox, c’est tout un accomplissement remarquable. Et il y a des leçons à tirer de cette expérience, même pour des environnements moins complexes, où une bibliothèque logicielle peut encore cacher un bogue de bas niveau qui pourrait se révéler soudainement plus tard.