Der mehrstündige Ausfall von Cloudflare stellte sich als Ergebnis einer fehlerhaften Fehlerbehandlung heraus.

Das Unternehmen Cloudflare hat die Analyse eines der größten Vorfälle in seiner Infrastruktur veröffentlicht, aufgrund dessen gestern ein Großteil des Content Delivery Networks für mehr als 3 Stunden ausfiel. Der Ausfall trat nach einer Änderung in der Struktur der in ClickHouse gespeicherten Datenbank auf, nach der die Datei mit den Parametern für das System zur Bot-Abwehr sich verdoppelte. In der Datenbank wurden doppelte Tabellen erstellt, während die SQL-Abfrage zur Erstellung der Datei einfach alle Daten aus allen Tabellen nach dem Schlüssel abrief, ohne Duplikate herauszufiltern. SELECT name, type FROM system.columns WHERE table = 'http_requests_features' order by name;

Der mehrstündige Ausfall von Cloudflare stellte sich als Ergebnis einer fehlerhaften Fehlerbehandlung heraus.

Die erstellte Datei verbreitete sich über alle Knoten des Clusters, das die eingehenden Anfragen verarbeitet. Im Handler, der diese Datei zur Überprüfung auf Bot-Anfragen verwendet, wurden die im Datei angegebenen Parameter im Arbeitsspeicher gespeichert, und um übermäßigen Speicherverbrauch zu vermeiden, gab es im Code ein Limit für die maximal zulässige Dateigröße. Unter normalen Bedingungen war die tatsächliche Dateigröße deutlich kleiner als das festgelegte Limit, aber nach der Duplizierung der Tabellen überschritt sie das Limit.

Das Problem lag darin, dass anstelle einer korrekten Bearbeitung der Überschreitung des Limits und der Fortsetzung der Verwendung der vorherigen Version der Datei mit einer Benachrichtigung des Überwachungssystems über den Notfall im Handler ein Notabschalten ausgelöst wurde, das die Weiterleitung des Traffics blockierte. Der Fehler wurde durch die Verwendung der unwrap()-Methode im Rust-Code mit dem Typ Result verursacht.

Der mehrstündige Ausfall von Cloudflare stellte sich als Ergebnis einer fehlerhaften Fehlerbehandlung heraus.

Wenn der Result-Wert den Status 'Ok' hat, gibt die unwrap()-Methode das mit diesem Status verbundene Objekt zurück, aber wenn das Ergebnis nicht erfolgreich ist, führt der Aufruf zu einem Notabschalten (es wird das Makro 'panic!' ausgelöst). Normalerweise wird unwrap() während der Fehlersuche oder beim Schreiben von Testcode verwendet und nicht für den Einsatz in Produktionsprojekten empfohlen.

Der mehrstündige Ausfall von Cloudflare stellte sich als Ergebnis einer fehlerhaften Fehlerbehandlung heraus.
Der mehrstündige Ausfall von Cloudflare stellte sich als Ergebnis einer fehlerhaften Fehlerbehandlung heraus.


Quelle: opennet.ru
60GB SSD 8Gb DDR4