Come abbiamo costruito una piattaforma di monitoraggio progettata per la crescita esponenziale di Databricks
di David Yuan, Yi Jin, Karan Bavishi, HC Zhu e Joey Beyda
L'infrastruttura di monitoraggio di Databricks è cresciuta di oltre tre volte nell'ultimo anno, tracciando ora 5 miliardi di serie temporali attive in tempo reale e ingerendo oltre 10 trilioni di campioni al giorno. A questa scala massiccia, abbiamo scoperto che le soluzioni pronte all'uso erano inefficienti o difficili da adattare alle nostre esigenze. Questo post condivide ciò che abbiamo costruito invece: una piattaforma scalabile che sfrutta il meglio dell'ecosistema di monitoraggio open-source, integrando personalizzazioni per le nostre esigenze uniche.
Gli ingegneri di Databricks si affidano a sistemi di monitoraggio che ci avvisano rapidamente sui problemi, automatizzano lo scaling e i rollback e abilitano il troubleshooting intelligente. Questi sistemi devono essere altamente affidabili in modo da poter essere certi di non operare alla cieca durante un potenziale incidente. Tuttavia, si è rivelato non facile sviluppare questa infrastruttura per la scala di Databricks:
Di fronte a queste sfide, il vecchio stack di monitoraggio di Databricks era afflitto da problemi di affidabilità. Ci siamo prefissati di sviluppare una nuova piattaforma affidabile che soddisfacesse le aspettative dei nostri ingegneri. Da allora abbiamo affrontato 3 problemi chiave:
I TSDB sono una componente fondamentale delle architetture tradizionali dei sistemi di monitoraggio. Questi database specializzati sono progettati per ingerire grandi quantità di dati di metriche di serie temporali e servire letture in tempo reale ad alta QPS e bassa latenza. Sono particolarmente ottimali per i modelli di query di monitoraggio come alert e aggiornamenti di dashboard, che richiedono l'emissione ripetuta dello stesso set di query e l'ottenimento di risultati fulminei basati sui dati più recenti.
I vecchi TSDB di Databricks erano stati costruiti per una scala di un ordine di grandezza inferiore e sono diventati un collo di bottiglia importante per noi negli ultimi anni. Infatti, il problema di affidabilità #1 per l'intera infrastruttura di monitoraggio era la difficoltà di scalare i nostri TSDB. Questa è un'operazione infrequente per molte altre aziende, ma qualcosa che dovevamo fare quasi quotidianamente data la crescita esponenziale di Databricks.
Quindi abbiamo sviluppato un nuovo TSDB nome in codice Pantheon, che è un fork del progetto open-source CNCF Thanos. Siamo riusciti a scalare fino a oltre 160 istanze di Thanos in tutte le regioni di tre provider cloud, con un totale di circa 5 miliardi di serie temporali attive in memoria e oltre 10 trilioni di campioni ingeriti giornalmente. La nostra istanza più grande ospita circa 300 milioni di serie temporali in memoria e supporta quasi 1.000 query PromQL al secondo; gestiamo anche piccole implementazioni a 3 nodi e tutto ciò che sta nel mezzo. A causa dell'ampiezza, della scala e della varietà delle nostre implementazioni, scopriamo spesso casi limite di Thanos e ottimizzazioni delle prestazioni e contribuiamo a questi alla comunità open-source.
La migrazione a Pantheon ci ha permesso di risparmiare milioni di dollari in costi cloud annuali, riducendo al contempo i tempi di inattività dell'infrastruttura di monitoraggio di circa 5 volte ed eliminando molte fonti di lavoro manuale. L'architettura di Pantheon è mostrata di seguito, e le sezioni seguenti spiegano diverse decisioni di progettazione chiave che hanno reso possibili questi risultati.

Un elemento chiave di Thanos è la sua architettura di storage a livelli. Le serie temporali più recenti sono mantenute in memoria, le serie temporali delle ultime 24 ore sono mantenute su disco e tutti i dati più vecchi sono mantenuti sullo storage a oggetti. Ciò significa che gli alert e altre query in tempo reale possono soddisfare requisiti di prestazioni rigorosi, poiché tipicamente dipendono dai dati più recenti. Allo stesso tempo, l'utilizzo dello storage a oggetti consente al sistema di disaccoppiare essenzialmente il calcolo dallo storage; un cluster può scalare senza dover ribilanciare tutti i suoi dati storici sui nodi del database.
Questa architettura ha affrontato il nostro collo di bottiglia chiave (scaleup) e ha gettato le basi per i risparmi sui costi di Pantheon. Abbiamo applicato diverse altre ottimizzazioni:
Alla nostra scala globale, le operazioni manuali, l'automazione Kubernetes best-effort o i comportamenti Thanos standard non sono sufficienti. Ogni rilascio, evento di scaling o guasto dell'host deve essere gestito in modo sicuro, automatico e con il minimo intervento umano, preservando il quorum e la disponibilità dei dati. Per raggiungere questo obiettivo, Pantheon introduce un piano di controllo appositamente creato, responsabile dell'orchestrazione del ciclo di vita dei componenti Thanos e delle decisioni sulla capacità. È composto da tre controller chiave:
I proprietari delle metriche aggiungono spesso etichette come ID nodo o ID pod per aiutarli a eseguire il debug di problemi su dimensioni specifiche e mitigare gli incidenti più velocemente. Tuttavia, questo porta a una classica sfida di osservabilità: la gestione della cardinalità. La cardinalità di una metrica è il numero di combinazioni univoche delle sue etichette. Se il numero di pod che stai monitorando aumenta di 10 volte, aumenta anche la cardinalità di qualsiasi metrica con un'etichetta ID pod. La cardinalità è il principale fattore di scalabilità per un TSDB, e la crescita della cardinalità delle metriche esistenti aumenta i costi e la pressione di scalabilità su Pantheon.
La rapida crescita dell'infrastruttura è una sfida di cui siamo fortunati ad avere in Databricks. Contemporaneamente alla crescita significativa della nostra base di clienti e dell'utilizzo dei prodotti, molti clienti hanno recentemente adottato la nostra architettura di calcolo serverless, e la nostra piattaforma di calcolo serverless avvia decine di milioni di VM ogni giorno. Man mano che più carichi di lavoro passano al serverless, l'infrastruttura che monitoriamo diventa più soggetta a churn e la durata di queste etichette identificative continua a diminuire.
Ciò ha causato un aumento esponenziale della cardinalità, erodendo i vantaggi di scalabilità e costi di Pantheon. Pertanto, abbiamo dovuto diventare molto più intelligenti riguardo ai dati delle metriche che memorizzavamo. È qui che è entrata in gioco l'"aggregazione": eliminare etichette costose dai sistemi serverless durante l'ingestione, pur fornendo una vista aggregata dell'intera flotta ai proprietari dei servizi. Una strategia di aggregazione automatizzata per le metriche ci ha permesso di "curvare la curva" della crescita della cardinalità, garantendo che l'infrastruttura di monitoraggio non debba scalare più velocemente del resto di Databricks.
Costruire un'infrastruttura di aggregazione affidabile su larga scala è difficile perché è stateful. Gli aggregatori che gestiscono milioni di contatori di input devono essere in grado di gestire correttamente i reset: se una serie temporale di input scompare, il valore di output aggregato dovrebbe continuare ad aumentare monotonicamente anziché diminuire. Con le metriche partizionate tra gli aggregatori, è necessario anche gestire scenari come riavvii di pod e squilibri di carico.
Questi problemi vengono spesso risolti utilizzando un sistema di messaggistica come Kafka per le assegnazioni di partizione e il mantenimento dei dati precedenti; questo è costoso su larga scala e aggiunge ritardi di ingestione che influiscono sui casi d'uso in tempo reale. L'approccio alternativo è memorizzare lo stato in memoria negli aggregatori e reindirizzare le metriche tra gli aggregatori per rispettare l'assegnazione. Tuttavia, ciò comporta perdite di dati quando un aggregatore viene ridistribuito; in una versione iniziale della nostra infrastruttura di aggregazione, questo comportamento rendeva le metriche aggregate quasi incomprensibili per i nostri utenti.
Per far funzionare tutto questo senza problemi, abbiamo invece sviluppato il nostro sistema di aggregazione utilizzando Telegraf e il servizio "auto-sharder" di Databricks Dicer. Questa architettura utilizza uno routing sticky intelligente invece di reindirizzare le metriche tra gli aggregatori, il che ha risolto i problemi di fallimento della ridistribuzione. Con altre ottimizzazioni che abbiamo aggiunto a Telegraf, siamo stati in grado di scalare la pipeline a oltre 1 GB/s nella nostra regione più grande e migliaia di regole di aggregazione.

Questa nuova pipeline di aggregazione è diventata di fatto lo scudo che protegge i nostri TSDB dalla crescita della cardinalità a lungo termine e dagli improvvisi picchi di metriche. Ad esempio, un recente incidente nell'infrastruttura di Databricks ha causato un picco di carico di metriche da 2 a 5 volte in varie regioni. Telegraf ha assorbito la maggior parte di questo carico e Pantheon ha visto solo un picco del 20%, consentendo agli ingegneri di tutta l'azienda di eseguire query di debug e alerting senza alcun impatto.
La nostra infrastruttura di aggregazione ci consente di proteggere Pantheon dalla crescita esponenziale della cardinalità, ma ciò ha un costo: rimuove le dimensioni esatte di cui gli ingegneri hanno bisogno durante gli incidenti. Considera una flotta globale con:
Le metriche aggregate ti dicono:
Ma non ti dicono:
Gli ingegneri di Databricks avevano ancora bisogno di una soluzione per la risoluzione dei problemi dei flussi di lavoro che si basava su queste etichette ad alta cardinalità. Questi scenari "ago nel pagliaio" richiedevano l'archiviazione e l'elaborazione efficiente di enormi quantità di dati grezzi, cosa che Pantheon non poteva fare. Per supportare questi casi d'uso, abbiamo cercato un'architettura di archiviazione diversa che non fosse limitata dalla crescita della cardinalità.
La nostra intuizione chiave: il lakehouse di Databricks è una soluzione perfetta! Disaccoppia l'archiviazione (economico storage di oggetti + Delta Lake) dal calcolo (cluster di streaming + query) ed è massicciamente scalabile in entrambe le dimensioni.
Utilizzando il meglio delle capacità di Databricks, abbiamo sviluppato una nuova piattaforma per dati di troubleshooting grezzi chiamata Hydra, che ha reso il debug ad alta cardinalità pratico su larga scala. Hydra ingerisce 20 miliardi di serie temporali attive non aggregate da milioni di nodi in tutto il mondo, raggiungendo una freschezza dei dati end-to-end di 5 minuti e un costo di archiviazione dati 50 volte inferiore rispetto a Thanos.
Questi vantaggi sono stati resi possibili dal design nativo del lakehouse di Hydra:

La costruzione di Hydra non è stata solo una sfida infrastrutturale; è stata una sfida di progettazione dell'interfaccia. Fin dall'inizio, abbiamo progettato Hydra attorno ai Percorsi Utente Critici (CUJ) per i nostri ingegneri piuttosto che attorno ai livelli di archiviazione o alle pipeline di ingestione. Il nostro obiettivo era semplice: gli ingegneri dovrebbero essere in grado di lavorare con metriche ad alta cardinalità utilizzando le stesse interfacce su cui fanno già affidamento.
Query tramite Grafana
La maggior parte degli ingegneri inizia il proprio flusso di lavoro di debug in Grafana. Si aspettano di scrivere PromQL, utilizzare dashboard esistenti, approfondire le etichette e pivotare rapidamente durante gli incidenti.
Per preservare questo flusso di lavoro, Hydra si integra direttamente con Grafana abilitando query PromQL da eseguire sui dati archiviati in Databricks. Abbiamo creato uno strato di conversione da PromQL a SQL che traduce le espressioni PromQL in query SQL eseguite su tabelle Delta nel Lakehouse. Questo approccio consente agli ingegneri di continuare a utilizzare la sintassi e le dashboard PromQL familiari senza modifiche. Allo stesso tempo, le query sottostanti vengono eseguite su tabelle Delta su larga scala anziché su un TSDB in memoria.
Accesso SQL diretto in Databricks
Mentre Grafana è ideale per il debug live, alcune indagini richiedono analisi più approfondite. Gli ingegneri potrebbero dover unire metriche con metadati di deployment, correlare metriche con log, eseguire scansioni di ampie finestre temporali, eseguire il rilevamento di anomalie o esportare dataset per analisi avanzate.
Hydra espone anche le tabelle Delta sottostanti direttamente all'interno di Databricks. Gli ingegneri possono interrogare queste tabelle utilizzando Databricks SQL o notebook, consentendo analisi flessibili che vanno oltre i tradizionali flussi di lavoro di monitoraggio.
Poiché i dati risiedono nel Lakehouse, diventano unibili con altri set di dati aziendali e governati sotto gli stessi controlli di sicurezza e accesso. Questo trasforma i dati di osservabilità in un asset analitico di prima classe anziché in un silo di monitoraggio isolato.
Semantica delle metriche unificate
Un principio chiave di progettazione di Hydra è che gli ingegneri non dovrebbero aver bisogno di comprendere la nostra architettura di ingestione. Sia che una metrica venga acceduta tramite il percorso aggregato basato su TSDB, sia tramite il percorso della metrica grezza basato su Lakehouse, l'interfaccia rimane coerente.
I nomi delle metriche, la semantica delle etichette e le dimensioni dei metadati sono unificati tra gli ambienti. I team di servizio emettono metriche una volta utilizzando un'interfaccia standardizzata. La piattaforma gestisce l'aggregazione, la conservazione grezza, l'ingestione, l'archiviazione e l'instradamento delle query. Questo modello unificato riduce il carico cognitivo ed elimina la necessità per i team di gestire configurazioni separate per diversi backend di osservabilità.
In futuro, stiamo cercando di migliorare le prestazioni di Hydra in modo che raggiunga una freschezza dei dati simile a Pantheon e le due esperienze convergano ulteriormente.
Per scalare l'infrastruttura di monitoraggio di Databricks, abbiamo dovuto ottimizzare per affidabilità, efficienza, operatività e percorsi degli sviluppatori. Per noi "scalare" ha significato più che semplicemente aumentare le nostre distribuzioni. Ha significato:
Questi saranno percorsi senza fine per noi e sono illustrativi del motivo per cui l'ingegneria delle infrastrutture è uno spazio così dinamico in Databricks. Se ti piace risolvere complessi problemi di ingegneria e ti piacerebbe unirti a noi per questo viaggio, dai un'occhiata a databricks.com/careers!
(Questo post sul blog è stato tradotto utilizzando strumenti basati sull'intelligenza artificiale) Post originale
Iscriviti al nostro blog e ricevi gli ultimi articoli direttamente nella tua casella di posta.