Anmerkung des Ăbersetzers.: Wir prĂ€sentieren Ihnen technische Einzelheiten zu den GrĂŒnden fĂŒr den kĂŒrzlichen Ausfall des Cloud-Dienstes, der von den Entwicklern von Grafana betrieben wird. Dies ist ein klassisches Beispiel dafĂŒr, wie eine neue und scheinbar ĂŒberaus nĂŒtzliche Funktion, die darauf abzielt, die QualitĂ€t der Infrastruktur zu verbessern ⊠schĂ€dlich sein kann, wenn nicht die zahlreichen Nuancen ihrer Anwendung in einem Produktionsumfeld berĂŒcksichtigt werden. Es ist bemerkenswert, wenn solche Materialien auftauchen, die es ermöglichen, nicht nur aus eigenen Fehlern zu lernen. Weitere Einzelheiten finden Sie in der Ăbersetzung dieses Textes von dem Produkt-VizeprĂ€sidenten aus Grafana Labs.

Am Freitag, dem 19. Juli, hörte der Hosted Prometheus-Dienst in Grafana Cloud etwa 30 Minuten lang auf zu funktionieren. Ich entschuldige mich bei allen Kunden, die von der Störung betroffen sind. Unsere Aufgabe ist es, die notwendigen Werkzeuge fĂŒr das Monitoring bereitzustellen, und wir verstehen, dass ihre NichtverfĂŒgbarkeit Ihr Leben erschwert. Wir nehmen diesen Vorfall sehr ernst. In diesem Hinweis wird erlĂ€utert, was passiert ist, wie wir darauf reagiert haben und was wir tun, um sicherzustellen, dass so etwas nicht noch einmal vorkommt.
Vorgeschichte
Der Service Grafana Cloud Hosted Prometheus basiert auf â einem CNCF-Projekt zur Erstellung eines horizontal skalierbaren, hochverfĂŒgbaren, multi-tenant (multitenanten) Prometheus-Dienstes. Die Architektur von Cortex besteht aus einer Reihe separater Mikrodienste, von denen jeder eine eigene Funktion erfĂŒllt: Replikation, Speicherung, Abfragen usw. Cortex wird aktiv weiterentwickelt, es gibt stĂ€ndig neue Funktionen und die Leistung wird verbessert. Wir fĂŒhren regelmĂ€Ăig neue Versionen von Cortex in den Clustern ein, damit die Kunden von diesen Möglichkeiten profitieren können â glĂŒcklicherweise kann Cortex ohne Ausfallzeiten aktualisiert werden.
FĂŒr unterbrechungsfreie Aktualisierungen benötigt der Ingester-Dienst von Cortex wĂ€hrend des Aktualisierungsprozesses eine zusĂ€tzliche Ingester-Replik. (Anmerkung des Ăbersetzers.: â die grundlegende Komponente von Cortex. Seine Aufgabe ist es, einen kontinuierlichen Datenstrom von Samples zu sammeln, sie in Chunk-Typen von Prometheus zu gruppieren und sie in Datenbanken wie DynamoDB, BigTable oder Cassandra zu speichern.) Dies ermöglicht es den alten Ingester, aktuelle Daten an neue Ingester weiterzuleiten. Es sollte beachtet werden, dass Ingester ressourcenintensiv sind. FĂŒr ihren Betrieb sind 4 Kerne und 15 GB RAM pro Pod erforderlich, d.h. 25 % der Prozessorleistung und des Speichers der Basismaschine in unseren Kubernetes-Clustern. Im Allgemeinen haben wir normalerweise viel mehr ungenutzte Ressourcen im Cluster als 4 Kerne und 15 GB RAM, sodass wir diese zusĂ€tzlichen Ingester wĂ€hrend der Updates problemlos starten können.
Es kommt jedoch hĂ€ufig vor, dass wĂ€hrend des normalen Betriebs auf keiner der Maschinen diese 25 % ungenutzten Ressourcen vorhanden sind. Wir streben das auch nicht an: CPU und Speicher sind immer fĂŒr andere Prozesse von Nutzen. Um dieses Problem zu lösen, haben wir uns entschieden, einzusetzen. Die Idee besteht darin, Ingester einen höheren PrioritĂ€tswert zuzuweisen als anderen (statuslosen) Mikrodiensten. Wenn wir einen zusĂ€tzlichen (N+1) Ingester starten mĂŒssen, verdrĂ€ngen wir vorĂŒbergehend andere, kleinere Pods. Diese Pods werden auf andere Maschinen mit verfĂŒgbaren Ressourcen verschoben, um genĂŒgend âRaumâ fĂŒr den Start des zusĂ€tzlichen Ingester zu lassen.
Am Donnerstag, den 18. Juli, haben wir vier neue PrioritĂ€tsstufen in unseren Clustern bereitgestellt: kritisch, hoch, mittel und niedrig. Sie wurden eine Woche lang in unserem internen Cluster ohne Kundentransaktionen getestet. StandardmĂ€Ăig erhielten Pods ohne festgelegte PrioritĂ€t mittel eine PrioritĂ€t, wĂ€hrend fĂŒr Ingester eine Klasse mit hoher PrioritĂ€t festgelegt wurde. Kritisch wurde fĂŒr das Monitoring (Prometheus, Alertmanager, Node-Exporter, Kube-State-Metrics usw.) reserviert. Unsere Konfiguration ist öffentlich, und der PR kann angesehen werden. .
Ausfall
Am Freitag, den 19. Juli, startete einer der Ingenieure einen neuen dedizierten Cortex-Cluster fĂŒr einen groĂen Kunden. Die Konfiguration fĂŒr diesen Cluster beinhaltete die neuen Pod-PrioritĂ€ten nicht, sodass allen neuen Pods die StandardprioritĂ€t zugewiesen wurde â mittel.
Im Kubernetes-Cluster standen nicht genĂŒgend Ressourcen fĂŒr den neuen Cortex-Cluster zur VerfĂŒgung, und der bestehende Produktionscluster Cortex wurde nicht aktualisiert (die Ingester hatten keinen hohen PrioritĂ€tswert). Da die Ingester des neuen Clusters standardmĂ€Ăig die mittel PrioritĂ€t hatten, wĂ€hrend die bestehenden Pods in der Produktion ĂŒberhaupt keine PrioritĂ€t hatten, verdrĂ€ngten die Ingester des neuen Clusters die Ingester aus dem bestehenden Produktionscluster Cortex.
ReplicaSet fĂŒr den verdrĂ€ngten Ingester im Produktions-Cluster hat den verdrĂ€ngten Pod erkannt und einen neuen zur Aufrechterhaltung der gewĂŒnschten Anzahl von Kopien erstellt. Dem neuen Pod wurde standardmĂ€Ăig mittel eine PrioritĂ€t zugewiesen, und ein weiterer "alter" Ingester im Produktions-Cluster verlor Ressourcen. Das Ergebnis war ein lawinenartiger Prozess, der zur VerdrĂ€ngung aller Pods mit Ingester fĂŒr die Produktions-Cluster von Cortex fĂŒhrte.
Ingester sind zustandsbehaftet und speichern Daten der letzten 12 Stunden. Dies ermöglicht uns, sie effizienter zu komprimieren, bevor sie in den Langzeit-Speicher geschrieben werden. Zu diesem Zweck fĂŒhrt Cortex eine Shard-Verteilung der Daten nach Serien durch, indem eine verteilte Hashtabelle (Distributed Hash Table, DHT) verwendet wird und repliziert jede Serie auf drei Ingester mithilfe von quorum-basierten Konsens im Dynamo-Stil. Cortex schreibt keine Daten in Ingester, die abgeschaltet werden. Somit kann Cortex, wenn eine groĂe Anzahl von Ingester die DHT verlĂ€sst, keine ausreichende Replikation der EintrĂ€ge sicherstellen, und diese "fallen".
Erkennung und Behebung
Neue Prometheus-Benachrichtigungen auf Basis des "Fehlerbudgets" (error-budget-based â Details werden in einem zukĂŒnftigen Artikel erscheinen) wurden nach 4 Minuten nach Beginn der Abschaltung laut. In den folgenden etwa fĂŒnf Minuten fĂŒhrten wir Diagnosen durch und erweiterten den darunterliegenden Kubernetes-Cluster, um sowohl neue als auch bestehende Produktions-Cluster unterzubringen.
Weitere fĂŒnf Minuten spĂ€ter haben die alten Ingester erfolgreich ihre Daten geschrieben und die neuen wurden gestartet, und die Cortex-Cluster waren wieder verfĂŒgbar.
Weitere 10 Minuten gingen fĂŒr die Diagnose und Behebung von Out-of-Memory (OOM) Fehlern von den vor Cortex stehenden Authentifizierungs-Proxy-Servern verloren. Die OOM-Fehler wurden durch einen zehnfachen Anstieg der QPS verursacht (wie wir vermuten, aufgrund ĂŒbermĂ€Ăig aggressiver Anfragen von den Prometheus-Client-Servern).
Folgen
Die Gesamtdauer des Ausfalls betrug 26 Minuten. Daten gingen nicht verloren. Ingester haben alle In-Memory-Daten erfolgreich in den Langzeit-Speicher geladen. WÀhrend der Abschaltung haben die Prometheus-Server der Clients entfernte (remote) EintrÀge mit dem basierend auf WAL (geschrieben von von Grafana Labs) gepuffert und wiederholten fehlgeschlagene EintrÀge nach dem Ausfall.

Operationsaufzeichnungen des Produktions-Clusters
Das DBMS Tarantool ist ein attraktives, zukunftstrÀchtiges Produkt zur Erstellung von hochbelasteten Anwendungen.
Es ist wichtig, aus diesem Vorfall zu lernen und die notwendigen MaĂnahmen zu ergreifen, um eine Wiederholung zu vermeiden.
Wenn man zurĂŒckblickt, sollte man zugeben, dass es nicht sinnvoll war, standardmĂ€Ăig PrioritĂ€ten zu vergeben, solange nicht alle Ingester in der Produktion diese erhalten hatten. mittel PrioritĂ€t. AuĂerdem hĂ€tte man sich im Voraus um ihren hoch hohen PrioritĂ€t kĂŒmmern sollen. Jetzt ist alles behoben. Wir hoffen, dass unsere Erfahrungen anderen Organisationen helfen, die den Einsatz von Pod-PrioritĂ€ten in Kubernetes in Betracht ziehen. Wir werden eine zusĂ€tzliche Kontrolle ĂŒber das Deployment aller zusĂ€tzlichen Objekte einfĂŒhren, deren Konfiguration global fĂŒr den Cluster ist. ZukĂŒnftig werden solche Ănderungen von
vielen Menschen bewertet werden. DarĂŒber hinaus wurde die Modifikation, die zu dem Ausfall fĂŒhrte, als zu unwesentlich fĂŒr ein separates Projekt-Dokument angesehen â sie wurde nur in einem GitHub-Issue diskutiert. Ab diesem Moment werden alle Ă€hnlichen Ănderungen der Konfigurationsdateien von der entsprechenden Projektdokumentation begleitet.oSchlieĂlich automatisieren wir die GröĂenĂ€nderung des Authentifizierungs-Reverse-Proxys, um OOM bei Ăberlastung zu verhindern, was wir erlebt haben, und analysieren die Standard-Prometheus-Parameter, die mit Rollbacks und Skalierungen zusammenhĂ€ngen, um in Zukunft Ă€hnliche Probleme zu vermeiden.
Der erlebte Ausfall hatte auch einige positive Folgen: Nachdem die notwendigen Ressourcen bereitgestellt wurden, erholte sich Cortex automatisch ohne zusĂ€tzliche Eingriffe. AuĂerdem haben wir wertvolle Erfahrungen im Umgang mit
Grafana Loki Autoskalierung und Ressourcenmanagement in Kubernetes (Ăberblick und Video-PrĂ€sentation)
P.S. vom Ăbersetzer
Lesen Sie auch in unserem Blog:
- «»;
- «»;
- «»;
- «».
Quelle: habr.com
