Was ist eine gute Protokollierungspraxis für verteilte Aufgaben?

14

Ich habe folgende Einstellung:

Erstellen Sie mehrere Worker, führen Sie eine Berechnung durch und beenden Sie sie, nachdem die Berechnung abgeschlossen ist.

Jedes Mal, wenn die Task von einer anderen Instanz ausgeführt wird, hat jeder Host eine eigene Protokolldatei. Dies führt zu einer riesigen Liste von Dateien.

Ist es eine gute Übung? Wenn nicht, wie lässt sich die Task-Verarbeitung in diesem speziellen Anwendungsfall besser protokollieren?

PS: Meine Infrastruktur ist serverlos. Derzeit logge ich mich in (AWS) CloudWatch ein. Beantworten Sie die Frage jedoch bitte unabhängig von AWS und passen Sie so gut wie möglich zu einem serverlosen Setup.

Dawny33
quelle

Antworten:

12

"Serverlos" bedeutet meist nur, dass Sie relativ einfache Microservices haben, in der Regel nur eine kleine Webanwendung oder eine einzelne Funktion, die automatisch mit einem REST-Frontend verbunden wird. Es gelten die gleichen Konzepte wie für herkömmliche Webdienste: in der Regel eine Mischung aus Remote-Syslog- und ElasticSearch-Writern.

Netzwerk- oder Remote-Syslog gibt es schon seit langer Zeit und es gibt eine ziemlich robuste Reihe von Tools. Sie müssten den / die zentralen Syslog-Server ausführen, aber das Protokoll ist sehr einfach und es gibt reine Client-Bibliotheken in jeder Sprache, die Sie zum Senden von Protokollen verwenden können. Ein häufiges Problem bei Remote-Syslog ist, dass es traditionell auf UDP basiert. Dies bedeutet, dass unter hoher Last einige Protokollmeldungen verloren gehen können. Dies könnte eine gute Sache sein und dazu beitragen, eine Überlastung der Kaskaden zu vermeiden, aber es ist etwas, das Sie beachten sollten. Einige neuere Syslog-Daemons unterstützen auch ein TCP-basiertes Protokoll, die Client-Unterstützung ist jedoch weniger einheitlich.

Neuere, aber sehr beliebte Protokollierung in ElasticSearch. Dies ist vor allem aufgrund des Kibana-Dashboards und des beleuchteten Logstash (häufig als ELK, ElasticSearch + Logstash + Kibana bezeichnet) nützlich. Amazon bietet sogar eine gehostete ElasticSearch-Option an, die den Einstieg erleichtert. ES verwendet eine relativ einfache REST-API. Daher sollte jede Sprache mit einem HTTP-Client (gelesen: alle) mit der Protokollierung auf ES einverstanden sein. Achten Sie jedoch darauf, den Netzwerkbetrieb bei teilweisen Systemausfällen zu blockieren Die App bleibt nicht in einem Protokollierungsaufruf hängen, der niemals erfolgreich ist und die Bearbeitung von Benutzeranforderungen beendet.

Komplexere Protokollierungstopologien sind nur durch Ihre Vorstellungskraft begrenzt, obwohl Sie heutzutage die Kafka-Datenbank / Warteschlange / Was auch immer-Sie-wollen-es als einen Knotenpunkt in sehr komplexen Protokollverteilungssystemen verwenden werden .

Auf der "serverlosen" Seite möchten Sie in der Regel direkt auf Netzwerkebene in diese Systeme integrieren. Senden Sie die Protokolldaten also direkt von Ihrem Dienst / Ihrer Funktion an syslog oder ES, anstatt in lokale Dateien zu schreiben (obwohl dies möglicherweise der Fall ist) auch für lokales Debugging und Entwicklung).

coderanger
quelle
6

Bei dieser Antwort geht es eher um Überlegungen zur Skalierbarkeit - wenn die Anzahl der Mitarbeiter hoch sein kann und / oder mehrere von ihnen gleichzeitig mit hoher Geschwindigkeit Protokolle erstellen können.

Ja, es empfiehlt sich, mehrere Protokolldateien gleichzeitig zu verwenden.

Der Versuch, Protokolle mehrerer Worker in Echtzeit zu einer einzigen Protokolldatei zusammenzufassen, führt zu folgenden Problemen:

  • Durch die Verwendung blockierender Mechanismen zur Verhinderung von Nachrichtenverlusten werden die Mitarbeiter verlangsamt
  • Protokollmeldungen können in der kombinierten Protokolldatei nicht in der richtigen Reihenfolge angezeigt werden
  • Eine zentralisierte Protokollierungsfunktion, die die Protokolle kombiniert, kann aufgrund der begrenzten Schreibgeschwindigkeit überlastet werden. Nachrichten würden verloren gehen

Das Speichern von Protokolldateien (wobei mehrere Protokolldateien gleichzeitig aktiv sind) ist selbst eine Technik, die von einigen Hosting-Anbietern verwendet wird, die skalierbare, zentralisierte Protokollierungsdienste mit hoher Leistung anbieten. Wenn Sie beispielsweise Protokolle in Dateien exportieren, werden bei der StackDriver-Protokollierung von Google mehrere gespeicherte Protokolldateien erstellt. Aus Protokolleinträgen in Google Cloud Storage :

Wenn Sie Protokolle in einen Cloud-Speicher-Bucket exportieren, schreibt die Stackdriver-Protokollierung eine Reihe von Dateien in den Bucket. Die Dateien sind nach Protokolltyp und Datum in Verzeichnishierarchien organisiert. Der Protokolltyp kann ein einfacher Name syslogoder ein zusammengesetzter Name sein appengine.googleapis.com/request_log. Wenn diese Protokolle in einem Bucket namens gespeichert my-gcs-bucketwürden, würden die Verzeichnisse wie im folgenden Beispiel benannt:

my-gcs-bucket/syslog/YYYY/MM/DD/
my-gcs-bucket/appengine.googleapis.com/request_log/YYYY/MM/DD/

Ein einzelner Bucket kann Protokolle mehrerer Protokolltypen enthalten.

Die Blattverzeichnisse ( DD/) enthalten mehrere Dateien, von denen jede die exportierten Protokolleinträge für einen im Dateinamen angegebenen Zeitraum enthält. Die Dateien werden sharded und ihre Namen enden mit einer Shard-Nummer Snoder An(n = 0, 1, 2, ...). Zum Beispiel sind hier zwei Dateien, die in den folgenden Ordnern gespeichert werden können directory my-gcs-bucket/syslog/2015/01/13/:

08:00:00_08:59:59_S0.json
08:00:00_08:59:59_S1.json

Diese beiden Dateien enthalten zusammen die syslogProtokolleinträge für alle Instanzen während der Stunde ab 0800 UTC. Um alle Protokolleinträge zu erhalten, müssen Sie alle Shards für jeden Zeitraum lesen - in diesem Fall die Dateishards 0 und 1. Die Anzahl der geschriebenen Dateishards kann sich je nach Umfang der Protokolleinträge für jeden Zeitraum ändern.

Solche leistungsstarken Protokollierungsdienste können auch Alternativen zur Protokollierung in Dateien bieten. Die Verwaltung von Protokolldateien kann daher insgesamt vermieden werden, wenn dies von Interesse ist:

Schließlich - wenn das Zusammenführen von Protokolldateien in Echtzeit nicht erforderlich ist, können mehrere Protokolldateien bei der Offline-Protokollverwaltung hilfreich sein:

  • Einfach zu erstellende progressive Protokollsicherungs-, -komprimierungs-, -archivierungs- und -entsorgungsschemata
  • Die parallele Verarbeitung mehrerer Sätze von Protokollen (Protokolldateien) ist möglich, wodurch Engpässe verringert bzw. vermieden werden
  • Kein Aufteilen und erneutes Schreiben von Dateien erforderlich
Dan Cornilescu
quelle