Comment nous avons construit une plateforme de surveillance conçue pour la croissance exponentielle de Databricks
par David Yuan, Yi Jin, Karan Bavishi, HC Zhu et Joey Beyda
L'infrastructure de surveillance de Databricks a plus que triplé de taille au cours de la dernière année, suivant désormais 5 milliards de séries chronologiques actives en temps réel et ingérant plus de 10 billions d'échantillons par jour. À cette échelle massive, nous avons constaté que les solutions prêtes à l'emploi étaient inefficaces ou difficiles à adapter à nos exigences. Cet article partage ce que nous avons construit à la place : une plateforme évolutive qui tire parti du meilleur de l'écosystème de surveillance open source tout en intégrant des personnalisations pour nos besoins uniques.
Les ingénieurs de Databricks dépendent de systèmes de surveillance qui nous alertent rapidement des problèmes, automatisent la mise à l'échelle et les restaurations, et permettent un dépannage intelligent. Ces systèmes doivent être très fiables afin que nous puissions être certains de ne pas être pris au dépourvu lors d'un incident potentiel. Cependant, développer cette infrastructure à l'échelle de Databricks s'est avéré être un défi de taille :
Face à ces défis, l'ancienne pile de surveillance de Databricks était confrontée à des problèmes de fiabilité. Nous avons entrepris de développer une nouvelle plateforme fiable qui répondrait aux attentes de nos ingénieurs. Nous avons depuis résolu 3 problèmes clés :
Les TSDB sont un composant essentiel des architectures de systèmes de surveillance traditionnels. Ces bases de données spécialisées sont conçues pour ingérer de grandes quantités de données de métriques de séries chronologiques et pour servir des lectures en temps réel à QPS élevé et à faible latence. Elles sont particulièrement optimales pour les modèles de requêtes de surveillance tels que les alertes et les actualisations de tableaux de bord, qui nécessitent d'émettre le même ensemble de requêtes de manière répétée et d'obtenir des résultats ultra-rapides basés sur les données les plus récentes.
Les anciennes TSDB de Databricks avaient été conçues pour une échelle d'un ordre de grandeur inférieur et sont devenues un goulot d'étranglement majeur pour nous ces dernières années. En fait, le problème de fiabilité n°1 pour l'ensemble de l'infrastructure de surveillance était la difficulté de faire évoluer nos TSDB. Il s'agit d'une opération peu fréquente pour de nombreuses autres entreprises, mais quelque chose que nous devions faire presque quotidiennement compte tenu de la croissance exponentielle de Databricks.
Nous avons donc développé une nouvelle TSDB, nommée Pantheon, qui est un fork du projet open source CNCF Thanos. Nous avons réussi à passer à plus de 160 instances de Thanos dans toutes les régions et chez trois fournisseurs de cloud, avec un total d'environ 5 milliards de séries chronologiques actives en mémoire et plus de 10 billions d'échantillons ingérés quotidiennement. Notre plus grande instance héberge environ 300 millions de séries chronologiques en mémoire et prend en charge près de 1 000 requêtes PromQL par seconde ; nous exécutons également de petits déploiements à 3 nœuds et tout ce qui se trouve entre les deux. En raison de l'étendue, de l'échelle et de la variété de nos déploiements, nous découvrons souvent des cas limites et des optimisations de performances de Thanos et les contribuons à la communauté open source.
La migration vers Pantheon nous a permis d'économiser des millions de dollars en coûts annuels de cloud, tout en réduisant les temps d'arrêt de l'infrastructure de surveillance d'environ 5 fois et en éliminant de nombreuses sources de travail manuel. L'architecture de Pantheon est présentée ci-dessous, et les sections suivantes expliquent plusieurs décisions de conception clés qui ont rendu ces réalisations possibles.

Un élément clé de Thanos est son architecture de stockage hiérarchisé. Les séries chronologiques les plus récentes sont conservées en mémoire, celles des dernières 24 heures sont conservées sur disque, et toutes les données plus anciennes sont stockées sur un stockage objet. Cela signifie que les alertes et autres requêtes en temps réel peuvent répondre à des exigences de performance strictes, car elles dépendent généralement des données les plus récentes. En même temps, l'utilisation du stockage objet permet au système de découpler essentiellement le calcul du stockage ; un cluster peut évoluer sans avoir besoin de rééquilibrer toutes ses données historiques entre les nœuds de la base de données.
Cette architecture a résolu notre goulot d'étranglement clé (les montées en charge) et a jeté les bases des économies de coûts de Pantheon. Nous avons appliqué plusieurs autres optimisations :
À notre échelle mondiale, les opérations manuelles, l'automatisation Kubernetes au meilleur effort ou les comportements de Thanos "vanilla" sont insuffisants. Chaque version, événement de mise à l'échelle ou défaillance d'hôte doit être géré de manière sûre, automatique et avec une intervention humaine minimale, tout en préservant le quorum et la disponibilité des données. Pour y parvenir, Pantheon introduit un plan de contrôle spécialement conçu, responsable de l'orchestration du cycle de vie et des décisions de capacité des composants Thanos. Il se compose de trois contrôleurs clés :
Les propriétaires de métriques ajoutent souvent des étiquettes telles que l'ID de nœud ou l'ID de pod pour les aider à déboguer les problèmes sur des dimensions spécifiques et à atténuer les incidents plus rapidement. Cependant, cela conduit à un défi classique d'observabilité : la gestion de la cardinalité. La cardinalité d'une métrique est le nombre de combinaisons uniques de ses étiquettes. Si le nombre de pods que vous surveillez augmente de 10 fois, la cardinalité de toute métrique avec une étiquette d'ID de pod augmente également. La cardinalité est le principal facteur d'échelle pour une TSDB, et la croissance de la cardinalité des métriques existantes augmente les coûts et la pression de mise à l'échelle sur Pantheon.
La croissance rapide de l'infrastructure est un défi dont nous bénéficions chez Databricks. Alors que notre base de clients et l'utilisation de nos produits ont considérablement augmenté, de nombreux clients ont récemment adopté notre architecture de calcul sans serveur, et notre plateforme de calcul sans serveur lance des dizaines de millions de machines virtuelles chaque jour. À mesure que de plus en plus de charges de travail passent au sans serveur, l'infrastructure que nous surveillons devient plus volatile, et la durée de vie de ces étiquettes d'identifiant ne cesse de raccourcir.
Cela a entraîné une explosion de la cardinalité, réduisant les gains de scalabilité et de coût de Pantheon. Nous avons donc dû devenir beaucoup plus intelligents quant aux données de métriques que nous stockions. C'est là qu'est intervenue l'« agrégation » : la suppression des étiquettes coûteuses des systèmes sans serveur pendant l'ingestion, tout en offrant une vue agrégée de l'ensemble du parc aux propriétaires de services. Une stratégie d'agrégation automatisée pour les métriques nous a permis de « fléchir la courbe » de la croissance de la cardinalité, garantissant que l'infrastructure de surveillance n'a pas besoin de s'adapter plus rapidement que le reste de Databricks.
Construire une infrastructure d'agrégation fiable à grande échelle est difficile car elle est stateful (avec état). Les agrégateurs gérant des millions de compteurs d'entrée doivent être capables de gérer correctement les réinitialisations – si une série chronologique d'entrée disparaît, la valeur de sortie agrégée doit continuer à augmenter de manière monotone plutôt que de chuter. Avec des métriques partitionnées entre les agrégateurs, vous devez également gérer des scénarios tels que les redémarrages de pods et le déséquilibre de charge.
Ces problèmes sont souvent résolus en utilisant un système de messagerie comme Kafka pour les attributions de partitionnement et le maintien des données précédentes ; cela est coûteux à notre échelle et ajoute un délai d'ingestion qui impacte les cas d'utilisation en temps réel. L'approche alternative consiste à stocker l'état en mémoire dans les agrégateurs et à rediriger les métriques entre les agrégateurs pour respecter l'attribution. Cependant, cela entraîne une perte de données lorsqu'un agrégateur est redéployé ; dans une version initiale de notre infrastructure d'agrégation, ce comportement rendait les métriques agrégées presque inintelligibles pour nos utilisateurs.
Pour que cela fonctionne de manière transparente, nous avons plutôt développé notre propre système d'agrégation en utilisant Telegraf et le service « auto-sharder » de Databricks, Dicer. Cette architecture utilise un routage intelligent et persistant au lieu de rediriger les métriques entre les agrégateurs, ce qui a résolu les modes de défaillance liés au redéploiement. Avec d'autres optimisations que nous avons ajoutées à Telegraf, nous avons pu faire évoluer le pipeline à plus de 1 Go/s dans notre plus grande région et des milliers de règles d'agrégation.

Ce nouveau pipeline d'agrégation est devenu le bouclier protégeant nos TSDB de la croissance de la cardinalité à long terme ainsi que des pics de métriques inattendus. Par exemple, un incident d'infrastructure récent chez Databricks a entraîné une augmentation de 2 à 5 fois de la charge des métriques dans diverses régions. Telegraf a absorbé la majeure partie de cette charge, et Pantheon n'a enregistré qu'une augmentation de 20 %, permettant aux ingénieurs de l'entreprise d'exécuter des requêtes de débogage et d'alerte sans aucun impact.
Notre infrastructure d'agrégation nous permet de protéger Pantheon de la croissance exponentielle de la cardinalité, mais cela a un coût — elle supprime les dimensions exactes dont les ingénieurs ont besoin lors des incidents. Considérez un parc mondial avec :
Les métriques agrégées vous indiquent :
Mais elles ne vous disent pas :
Les ingénieurs de Databricks avaient toujours besoin d'une solution pour les workflows de dépannage qui reposaient sur ces étiquettes à haute cardinalité. Ces scénarios de « recherche d'une aiguille dans une botte de foin » nécessitaient le stockage et le traitement efficaces de quantités massives de données brutes, ce que Pantheon ne pouvait pas faire. Pour prendre en charge ces cas d'utilisation, nous avons recherché une architecture de stockage différente qui ne serait pas limitée par la croissance de la cardinalité.
Notre idée clé : le lakehouse Databricks est parfaitement adapté ! Il découple le stockage (stockage d'objets bon marché + Delta Lake) du calcul (streaming + clusters de requêtes) et est massivement scalable sur les deux dimensions.
En utilisant les meilleures capacités de Databricks, nous avons développé une nouvelle plateforme pour les données brutes de dépannage appelée Hydra, qui a rendu le débogage à haute cardinalité pratique à grande échelle. Hydra ingère 20 milliards de séries chronologiques actives non agrégées provenant de millions de nœuds dans le monde, tout en atteignant une fraîcheur des données de bout en bout de 5 minutes et un stockage de données 50 fois moins cher que Thanos.
Ces succès ont été rendus possibles par la conception native du lakehouse d'Hydra :

Construire Hydra n'était pas seulement un défi d'infrastructure ; c'était un défi de conception d'interface. Dès le début, nous avons conçu Hydra autour des parcours utilisateurs critiques (CUJ) pour nos ingénieurs plutôt qu'autour des couches de stockage ou des pipelines d'ingestion. Notre objectif était simple : les ingénieurs devraient pouvoir travailler avec des métriques à haute cardinalité en utilisant les mêmes interfaces sur lesquelles ils s'appuient déjà.
La plupart des ingénieurs commencent leur workflow de débogage dans Grafana. Ils s'attendent à écrire du PromQL, à utiliser des tableaux de bord existants, à explorer les étiquettes et à pivoter rapidement lors des incidents.
Pour préserver ce workflow, Hydra s'intègre directement à Grafana en permettant l'exécution de requêtes PromQL sur les données stockées dans Databricks. Nous avons construit une couche de conversion PromQL-vers-SQL qui traduit les expressions PromQL en requêtes SQL exécutées sur des tables Delta dans le Lakehouse. Cette approche permet aux ingénieurs de continuer à utiliser la syntaxe et les tableaux de bord PromQL familiers sans modification. En même temps, les requêtes sous-jacentes sont exécutées sur des tables Delta à grande échelle plutôt que sur une TSDB en mémoire.
Bien que Grafana soit idéal pour le débogage en direct, certaines investigations nécessitent une analyse plus approfondie. Les ingénieurs peuvent avoir besoin de joindre des métriques avec des métadonnées de déploiement, de corréler des métriques avec des journaux, d'exécuter des analyses sur de larges plages de temps, d'effectuer une détection d'anomalies ou d'exporter des ensembles de données pour des analyses avancées.
Hydra expose également directement les tables Delta sous-jacentes au sein de Databricks. Les ingénieurs peuvent interroger ces tables à l'aide de Databricks SQL ou de notebooks, permettant une analyse flexible qui va au-delà des workflows de surveillance traditionnels.
Parce que les données résident dans le Lakehouse, elles peuvent être jointes à d'autres jeux de données d'entreprise et sont régies par les mêmes contrôles de sécurité et d'accès. Cela transforme les données d'observabilité en un actif analytique de premier ordre plutôt qu'en un silo de surveillance isolé.
Sémantique unifiée des métriques
Un principe de conception clé de Hydra est que les ingénieurs ne devraient pas avoir besoin de comprendre notre architecture d'ingestion. Qu'une métrique soit accédée via le chemin agrégé supporté par TSDB, ou le chemin de métrique brute supporté par le Lakehouse, l'interface reste cohérente.
Les noms de métriques, la sémantique des étiquettes et les dimensions des métadonn ées sont unifiés dans tous les environnements. Les équipes de service émettent des métriques une seule fois en utilisant une interface standardisée. La plateforme gère l'agrégation, la préservation des données brutes, l'ingestion, le stockage et le routage des requêtes. Ce modèle unifié réduit la charge cognitive et élimine le besoin pour les équipes de gérer des configurations distinctes pour différents backends d'observabilité.
À l'avenir, nous cherchons à améliorer les performances de Hydra afin qu'il atteigne une fraîcheur des données similaire à celle de Pantheon et que les deux expériences convergent encore davantage.
Pour faire évoluer l'infrastructure de surveillance de Databricks, nous avons dû optimiser la fiabilité, l'efficacité, l'opérabilité et les parcours des développeurs. Pour nous, « l'évolution » a signifié plus que simplement augmenter la taille de nos déploiements. Cela a signifié :
Ce seront des parcours sans fin pour nous, et ils illustrent pourquoi l'ingénierie d'infrastructure est un domaine si dynamique chez Databricks. Si vous aimez résoudre des problèmes d'ingénierie complexes et souhaitez vous joindre à nous pour l'aventure, consultez databricks.com/careers !
(Cet article de blog a été traduit à l'aide d'outils basés sur l'intelligence artificielle) Article original
Abonnez-vous à notre blog et recevez les derniers articles directement dans votre boîte mail.