Hinweis.: Hiermit prĂ€sentieren wir Ihnen technische Details zu den Ursachen des jĂŒngsten Ausfalls des Cloud-Dienstes, der von den Entwicklern von Grafana betrieben wird. Dies ist ein klassisches Beispiel dafĂŒr, wie eine neue, scheinbar Ă€uĂerst nĂŒtzliche Funktion, die die QualitĂ€t der Infrastruktur verbessern soll⊠schĂ€dlich sein kann, wenn man nicht die zahlreichen Nuancen ihrer Anwendung in der Produktionsumgebung berĂŒcksichtigt. Es ist groĂartig, wenn solche Materialien veröffentlicht werden, die es ermöglichen, nicht nur aus eigenen Fehlern zu lernen. Die Details finden Sie in der Ăbersetzung dieses Textes des Produkt-VizeprĂ€sidenten von Grafana Labs.

Am Freitag, den 19. Juli, funktionierte der Hosted Prometheus-Dienst in Grafana Cloud fĂŒr etwa 30 Minuten nicht. Ich entschuldige mich bei all unseren Kunden, die durch diesen Ausfall betroffen waren. Unsere Aufgabe ist es, die notwendigen Ăberwachungstools bereitzustellen, und wir verstehen, dass ihre UnzugĂ€nglichkeit Ihnen das Leben erschwert. Wir nehmen diesen Vorfall sehr ernst. In diesem Hinweis erklĂ€ren wir, was passiert ist, wie wir darauf reagiert haben und was wir unternehmen, um sicherzustellen, dass sich so etwas nicht wiederholt.
Hintergrund
Der Grafana Cloud Hosted Prometheus Service basiert auf â einem CNCF-Projekt zur Schaffung eines horizontal skalierbaren, hochverfĂŒgbaren und multi-tenant (mehrmandantenfĂ€higen) Prometheus-Services. Die Architektur von Cortex besteht aus einer Reihe von separaten Microservices, die jeweils eine bestimmte Funktion erfĂŒllen: Replikation, Speicherung, Abfragen usw. Cortex wird aktiv weiterentwickelt, mit stĂ€ndig neuen Funktionen und Leistungssteigerungen. Wir implementieren regelmĂ€Ăig neue Versionen von Cortex in die Cluster, damit unsere Kunden von diesen Möglichkeiten profitieren können â zumal Cortex in der Lage ist, ohne Ausfallzeiten zu aktualisieren.
FĂŒr unterbrechungsfreie Updates benötigt der Ingester-Service von Cortex wĂ€hrend des Aktualisierungsprozesses eine zusĂ€tzliche Ingester-Replik. (Hinweis.: â ein grundlegender Bestandteil von Cortex. Seine Aufgabe besteht darin, einen kontinuierlichen Strom von Samples zu sammeln, sie in Prometheus-Chunks zu gruppieren und in Datenbanken wie DynamoDB, BigTable oder Cassandra zu speichern. Dies ermöglicht es den alten Ingester, aktuelle Daten an neue Ingester zu ĂŒbertragen. Es ist erwĂ€hnenswert, dass Ingester ressourcenintensiv sind. FĂŒr ihren Betrieb werden 4 Kerne und 15 GB RAM pro Pod benötigt, was 25 % der CPU-Leistung und des Speichers der zugrunde liegenden Maschine bei unseren Kubernetes-Clustern entspricht. In der Regel haben wir jedoch viel mehr ungenutzte Ressourcen im Cluster als die benötigten 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 verfĂŒgbar sind. Und wir streben das auch nicht an: CPU und RAM sind immer fĂŒr andere Prozesse nĂŒtzlich. Um dieses Problem zu lösen, haben wir uns entschieden, . Die Idee besteht darin, den Ingester einen höheren PrioritĂ€tswert zuzuweisen als anderen (stateless) Mikrodiensten. Wenn wir einen zusĂ€tzlichen (N+1) Ingester starten mĂŒssen, drĂ€ngen wir vorĂŒbergehend andere, kleinere Pods zurĂŒck. Diese Pods werden auf freie Ressourcen auf anderen Maschinen verschoben, wodurch ausreichend Platz fĂŒr den Start des zusĂ€tzlichen Ingester entsteht.
Am Donnerstag, dem 18. Juli, haben wir in unseren Clustern vier neue PrioritĂ€tsstufen eingefĂŒhrt: kritisch, hoch, mittel und niedrig. Diese wurden etwa eine Woche in einem internen Cluster ohne Kundenverkehr getestet. StandardmĂ€Ăig erhielten Pods ohne festgelegte PrioritĂ€t mittel PrioritĂ€t, wĂ€hrend fĂŒr Ingester eine Klasse mit hoher PrioritĂ€t eingestellt. Kritisch fĂŒr Monitoring-Dienste (Prometheus, Alertmanager, node-exporter, kube-state-metrics usw.) reserviert war. Unsere Konfiguration ist öffentlich und der PR kann eingesehen werden. .
Ausfall
Am Freitag, dem 19. Juli, hat einer der Ingenieure ein neues dediziertes Cortex-Cluster fĂŒr einen GroĂkunden gestartet. Die Konfiguration fĂŒr dieses Cluster enthielt keine neuen Pods-PrioritĂ€ten, sodass allen neuen Pods die StandardprioritĂ€t zugewiesen wurde â mittel.
Im Kubernetes-Cluster fehlten die Ressourcen fĂŒr das neue Cortex-Cluster, und das bestehende Produktions-Cortex-Cluster wurde nicht aktualisiert (Ingester hatten keinen hohen PrioritĂ€t). Da die Ingester des neuen Clusters standardmĂ€Ăig mittel PrioritĂ€t hatten und die bestehenden Pods im Produktionsumfeld ĂŒberhaupt keine PrioritĂ€t hatten, verdrĂ€ngten die Ingester des neuen Clusters die Ingester aus dem bestehenden Produktions-Cortex-Cluster.
Das ReplicaSet fĂŒr den verdrĂ€ngten Ingester im Produktions-Cluster hat den verdrĂ€ngten Pod erkannt und einen neuen erstellt, um die vorgegebene Anzahl an Kopien aufrechtzuerhalten. Dem neuen Pod wurde standardmĂ€Ăig mittel eine PrioritĂ€t zugewiesen, wodurch der Ă€ltere Ingester im Produktions-Cluster ĂŒber Ressourcen entzogen wurde. Das Ergebnis war ein lawinenartiger Prozess, der dazu fĂŒhrte, dass alle Pods mit Ingester fĂŒr die Produktionscluster von Cortex verdrĂ€ngt wurden.
Ingester sind zustandsbehaftet und speichern Daten fĂŒr die letzten 12 Stunden. Dies ermöglicht eine effizientere Komprimierung, bevor sie in einen langfristigen Speicher geschrieben werden. Zu diesem Zweck fĂŒhrt Cortex eine Daten-Sharding nach Serien durch und verwendet eine verteilte Hash-Tabelle (Distributed Hash Table, DHT) zur Replikation jeder Serie auf drei Ingester mit quorum-basierter Konsistenz im Dynamo-Stil. Cortex schreibt keine Daten in Ingester, die deaktiviert sind. Wenn also eine groĂe Anzahl von Ingester die DHT verlĂ€sst, kann Cortex keine ausreichende Replikation der Aufzeichnungen gewĂ€hrleisten, und diese âfallen ausâ.
Erkennung und Behebung
Neue Prometheus-Benachrichtigungen basierend auf dem âFehlerbudgetâ (error-budget-based â weitere Informationen werden in einem zukĂŒnftigen Artikel veröffentlicht) Ă€uĂerten sich alarmiert nach vier Minuten seit Beginn der Ausfallzeit. In den nĂ€chsten etwa fĂŒnf Minuten fĂŒhrten wir Diagnostics durch und erweiterten den darunter liegenden Kubernetes-Cluster, um sowohl neue als auch bestehende Produktionscluster zu hosten.
FĂŒnf Minuten spĂ€ter haben die alten Ingester erfolgreich ihre Daten aufgezeichnet, wĂ€hrend die neuen gestartet wurden und die Cortex-Cluster wieder verfĂŒgbar waren.
Weitere zehn Minuten benötigten wir fĂŒr die Diagnose und Behebung von Out-of-Memory (OOM)-Fehlern bei den Authentifizierungs-Proxy-Servern vor Cortex. Die OOM-Fehler wurden durch einen zehnfachen Anstieg des QPS verursacht (wie wir annehmen, aufgrund von ĂŒbermĂ€Ăig aggressiven Anfragen von den Prometheus-Client-Servern).
Folgen
Die Gesamtdauer des Ausfalls betrug 26 Minuten. Es gingen keine Daten verloren. Die Ingester haben erfolgreich alle in-memory-Daten in langfristigen Speicher ĂŒbertrĂ€gt. WĂ€hrend des Ausfalls haben die Prometheus-Server der Clients entfernte (remote) Aufzeichnungen mit Hilfe von basierend auf WAL (geschrieben von von Grafana Labs) und haben fehlgeschlagene Aufzeichnungen nach dem Ausfall wiederholt.

Schreiboperationen des Produktionsclusters
Fazit
Es ist wichtig, aus diesem Vorfall zu lernen und die notwendigen MaĂnahmen zu ergreifen, um eine Wiederholung zu vermeiden.
RĂŒckblickend sollten wir anerkennen, dass wir standardmĂ€Ăig keinen mittel PrioritĂ€t setzen sollten, bis alle Ingester in der Produktion hoch diese PrioritĂ€t erhalten haben. AuĂerdem hĂ€tte im Vorfeld auf ihre hohe PrioritĂ€t geachtet werden mĂŒssen. Jetzt ist alles behoben. Wir hoffen, dass unsere Erfahrungen anderen Organisationen helfen, die die Verwendung von Pod-PrioritĂ€ten in Kubernetes in Betracht ziehen.
Wir werden eine zusĂ€tzliche Kontrollstufe fĂŒr die Bereitstellung aller zusĂ€tzlichen Objekte hinzufĂŒgen, deren Konfigurationen global fĂŒr den Cluster sind. ZukĂŒnftig werden solche Ănderungen vongröĂtenmehr Personen bewertet. AuĂerdem wurde die Modifikation, die zu dem Ausfall fĂŒhrte, als zu geringfĂŒgig fĂŒr ein separates Projektdokument betrachtet â sie wurde nur im GitHub-Issue diskutiert. Ab sofort werden alle solchen KonfigurationsĂ€nderungen mit entsprechender Projektdokumentation begleitet.
SchlieĂlich automatisieren wir die Skalierung des Authentifizierungs-Proxy-Servers, um OOM-Probleme bei Ăberlastungen zu verhindern, die wir erlebt haben, und analysieren die standardmĂ€Ăigen Prometheus-Einstellungen im Zusammenhang mit Rollbacks und Skalierung, um zukĂŒnftig Ă€hnliche Probleme zu vermeiden.
Der erlebte Ausfall hatte auch einige positive Konsequenzen: Nachdem wir die benötigten Ressourcen erhalten hatten, konnte Cortex automatisch wiederhergestellt werden, ohne dass zusĂ€tzliches Eingreifen erforderlich war. Zudem haben wir wertvolle Erfahrungen mit â unserem neuen Log-Aggregationssystem â das uns half sicherzustellen, dass alle Ingester wĂ€hrend und nach dem Ausfall ordnungsgemÀà funktionierten.
P.S. vom Ăbersetzer
Lesen Sie auch in unserem Blog:
- «»;
- «»;
- «»;
- «».
Quelle: habr.com
