Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Konfiguration von Amazon-ECS-Protokollen für hohen Durchsatz
Für Szenarien mit hohem Protokolldurchsatz empfehlen wir, den awsfirelens Protokolltreiber mit FireLens und zu verwenden. Fluent Bit Fluent Bitist ein leichter Protokollprozessor, der effizient mit Ressourcen umgeht und Millionen von Protokolldatensätzen verarbeiten kann. Um eine optimale Leistung im großen Maßstab zu erreichen, ist jedoch eine Anpassung der Konfiguration erforderlich.
In diesem Abschnitt werden fortgeschrittene Fluent Bit Optimierungstechniken für den Umgang mit hohem Protokolldurchsatz bei gleichzeitiger Wahrung der Systemstabilität und Vermeidung von Datenverlusten behandelt.
Hinweise zur Verwendung von benutzerdefinierten Konfigurationsdateien mit FireLens finden Sie unterEine benutzerdefinierte Konfigurationsdatei verwenden. Weitere Beispiele finden Sie unter Amazon FireLens ECS-Beispiele
Anmerkung
Einige Konfigurationsoptionen in diesem Abschnitt, wie z. B. workers undthreaded, sind AWS für Fluent Bit Version 3 oder höher erforderlich. Informationen zu verfügbaren Versionen finden Sie unter AWS Fluent Bit-Versionen
Verwenden Sie die Dateisystempufferung
Fluent BitPuffert standardmäßig alle Daten im Speicher. Wenn Daten schneller aufgenommen werden, als sie in die Ausgaben übertragen werden können, füllt sich der Puffer. Sobald der Speicher voll ist, pausiert das Eingabe-Plugin, bis Pufferspeicher verfügbar ist. Dies kann zu Gegendruck führen und Ihre Anwendung verlangsamen.
Für Szenarien mit hohem Durchsatz empfehlen wir die Verwendung der Dateisystempufferung. Weitere Informationen zur Fluent Bit Verwaltung von Pufferung und Speicherung finden Sie in der Dokumentation unter Pufferung und
Die Pufferung von Dateisystemen bietet die folgenden Vorteile:
-
Größere Pufferkapazität — Festplattenspeicher ist in der Regel umfangreicher als Arbeitsspeicher.
-
Persistenz — Gepufferte Daten Fluent Bit überstehen Neustarts.
-
Graduelle Verschlechterung — Bei Ausgabeausfällen sammeln sich Daten auf der Festplatte an, anstatt zu einer Speichererschöpfung zu führen.
Um die Dateisystempufferung zu aktivieren, stellen Sie eine benutzerdefinierte Konfigurationsdatei bereit. Fluent Bit Das folgende Beispiel zeigt die empfohlene Konfiguration:
[SERVICE] # Flush logs every 1 second Flush 1 # Wait 120 seconds during shutdown to flush remaining logs Grace 120 # Directory for filesystem buffering storage.path /var/log/flb-storage/ # Limit chunks stored 'up' in memory (reduce for memory-constrained environments) storage.max_chunks_up 32 # Flush backlog chunks to destinations during shutdown (prevents log loss) storage.backlog.flush_on_shutdown On [INPUT] Name forward unix_path /var/run/fluent.sock # Run input in separate thread to prevent blocking threaded true # Enable filesystem buffering for persistence storage.type filesystem [OUTPUT] Name cloudwatch_logs Match * regionus-west-2log_group_name/aws/ecs/my-applog_stream_name $(ecs_task_id) # Use multiple workers for parallel processing workers 2 # Retry failed flushes up to 15 times retry_limit 15 # Maximum disk space for buffered data for this output storage.total_limit_size 10G
Die wichtigsten Konfigurationsparameter:
storage.path-
Das Verzeichnis, in dem gepufferte Chunks auf der Festplatte Fluent Bit gespeichert werden.
storage.backlog.flush_on_shutdown-
Wenn diese Option aktiviert ist, wird Fluent Bit versucht, beim Herunterfahren alle Backlog-Dateisystem-Chunks an ihre Ziele zu leeren. Dies trägt dazu bei, die Datenzustellung zu gewährleisten, bevor sie Fluent Bit unterbrochen wird, kann jedoch die Zeit für das Herunterfahren verlängern.
storage.max_chunks_up-
Die Anzahl der Chunks, die im Speicher verbleiben. Die Standardeinstellung ist 128 Chunks, was mehr als 500 MB Speicher beanspruchen kann, da jeder Chunk bis zu 4—5 MB beanspruchen kann. In Umgebungen mit eingeschränktem Speicher sollten Sie diesen Wert verringern. Wenn Sie beispielsweise 50 MB für die Pufferung zur Verfügung haben, legen Sie diesen Wert auf 8—10 Blöcke fest.
storage.type filesystem-
Aktiviert den Dateisystemspeicher für das Eingabe-Plugin. Trotz des Namens ordnet es Fluent Bit Chunks sowohl
mmapdem Arbeitsspeicher als auch der Festplatte zu und sorgt so für Persistenz ohne Leistungseinbußen. threaded true-
Führt die Eingabe in einem eigenen Thread aus, getrennt von der Fluent Bit Hauptereignisschleife. Dadurch wird verhindert, dass langsame Eingaben die gesamte Pipeline blockieren.
Optimieren Sie die Ausgangskonfiguration
Netzwerkprobleme, Dienstausfälle und die Drosselung von Zielen können die Übermittlung von Protokollen verhindern. Die richtige Ausgangskonfiguration gewährleistet Ausfallsicherheit ohne Datenverlust.
Wenn ein Output-Flush fehlschlägt, Fluent Bit kann der Vorgang erneut versucht werden. Die folgenden Parameter steuern das Verhalten beim erneuten Versuch:
retry_limit-
Die maximale Anzahl von Wiederholungsversuchen vor dem Löschen von Datensätzen. Der Standardwert ist 1. Für Produktionsumgebungen empfehlen wir 15 oder mehr, was einen Ausfall von mehreren Minuten mit exponentiellem Backoff abdeckt.
scheduler.base-
Die Mindestanzahl von Sekunden zwischen Wiederholungen. Wir empfehlen 10 Sekunden.
scheduler.cap-
Die maximale Anzahl von Sekunden zwischen Wiederholungen bei Verwendung von exponentiellem Backoff. Wir empfehlen 60 Sekunden.
workers-
Die Anzahl der Threads für die parallel Ausgangsverarbeitung. Mehrere Worker ermöglichen gleichzeitige Löschvorgänge, wodurch der Durchsatz bei der Verarbeitung vieler Blöcke verbessert wird.
Der Grace Parameter in [SERVICE] diesem Abschnitt legt die Fluent Bit Wartezeit beim Herunterfahren fest, bis die gepufferten Daten geleert werden. Der Grace Zeitraum muss mit dem des Containers abgestimmt werden. stopTimeout Stellen Sie sicher, dass der Grace Zeitraum stopTimeout überschritten wird, Fluent Bit damit der Spülvorgang vor dem Empfang SIGKILL abgeschlossen werden kann. Wenn der Wert beispielsweise 120 Sekunden Grace beträgt, stellen Sie ihn stopTimeout auf 150 Sekunden ein.
Das folgende Beispiel zeigt eine vollständige Fluent Bit Konfiguration mit allen empfohlenen Einstellungen für Szenarien mit hohem Durchsatz:
[SERVICE] # Flush logs every 1 second Flush 1 # Wait 120 seconds during shutdown to flush remaining logs Grace 120 # Directory for filesystem buffering storage.path /var/log/flb-storage/ # Limit chunks stored 'up' in memory (reduce for memory-constrained environments) storage.max_chunks_up 32 # Flush backlog chunks to destinations during shutdown (prevents log loss) storage.backlog.flush_on_shutdown On # Minimum seconds between retries scheduler.base 10 # Maximum seconds between retries (exponential backoff cap) scheduler.cap 60 [INPUT] Name forward unix_path /var/run/fluent.sock # Run input in separate thread to prevent blocking threaded true # Enable filesystem buffering for persistence storage.type filesystem [OUTPUT] Name cloudwatch_logs Match * regionus-west-2log_group_name/aws/ecs/my-applog_stream_name $(ecs_task_id) # Use multiple workers for parallel processing workers 2 # Retry failed flushes up to 15 times retry_limit 15 # Maximum disk space for buffered data for this output storage.total_limit_size 10G
Verwenden Sie aus Gründen der Zuverlässigkeit die Protokollierung mehrerer Ziele
Durch das Senden von Protokollen an mehrere Ziele werden einzelne Fehlerquellen vermieden. Wenn CloudWatch Logs beispielsweise ausfällt, erreichen die Protokolle immer noch Amazon S3.
Die Protokollierung mehrerer Ziele bietet die folgenden Vorteile. Das Amazon S3 S3-Ausgabe-Plugin unterstützt auch Komprimierungsoptionen wie Gzip und Parquet-Format, wodurch die Speicherkosten gesenkt werden können. Weitere Informationen finden Sie in der Fluent Bit Dokumentation unter S3-Komprimierung
Die Protokollierung mehrerer Ziele kann die folgenden Vorteile bieten:
-
Redundanz — Wenn ein Ziel ausfällt, erreichen die Protokolle immer noch das andere.
-
Wiederherstellung — Rekonstruieren Sie Lücken in einem System vom anderen.
-
Haltbarkeit — Archivieren Sie Protokolle zur langfristigen Aufbewahrung in Amazon S3.
-
Kostenoptimierung — Bewahren Sie aktuelle Protokolle in einem schnellen Abfrageservice wie CloudWatch Logs mit kürzerer Aufbewahrung auf und archivieren Sie gleichzeitig alle Protokolle zur langfristigen Aufbewahrung auf kostengünstigerem Amazon S3 S3-Speicher.
Die folgende Fluent Bit Konfiguration sendet CloudWatch Protokolle sowohl an Logs als auch an Amazon S3:
[OUTPUT] Name cloudwatch_logs Match * regionus-west-2log_group_name/aws/ecs/my-applog_stream_name $(ecs_task_id) workers 2 retry_limit 15 [OUTPUT] Name s3 Match * bucketmy-logs-bucketregionus-west-2total_file_size 100M s3_key_format /fluent-bit-logs/$(ecs_task_id)/%Y%m%d/%H/%M/$UUID upload_timeout 10m # Maximum disk space for buffered data for this output storage.total_limit_size 5G
Beide Ausgaben verwenden dasselbe Match * Muster, sodass alle Datensätze unabhängig voneinander an beide Ziele gesendet werden. Während eines Ausfalls eines Ziels fließen die Protokolle weiter zum anderen, während sich fehlgeschlagene Leerungen im Dateisystempuffer ansammeln, sodass sie es später erneut versuchen können.
Verwenden Sie die dateibasierte Protokollierung mit dem Tail-Input-Plugin
Für Szenarien mit hohem Durchsatz, in denen der Verlust von Protokollen ein kritisches Problem darstellt, können Sie einen alternativen Ansatz verwenden: Lassen Sie Ihre Anwendung Protokolle in Dateien auf der Festplatte schreiben und konfigurieren Sie sie so, dass sie mithilfe des Fluent Bit tail Eingabe-Plug-ins gelesen werden. Bei diesem Ansatz wird die Treiberschicht für die Docker-Protokollierung vollständig umgangen.
Die dateibasierte Protokollierung mit dem Tail-Plugin bietet die folgenden Vorteile:
-
Offset-Tracking — Das Tail-Plugin kann Datei-Offsets in einer Datenbankdatei speichern (mit der
DBOption) und sorgt so für Stabilität bei Neustarts. Fluent Bit Dies trägt dazu bei, den Verlust von Protokollen bei Container-Neustarts zu verhindern. -
Pufferung auf Eingabeebene — Sie können die Speicherpuffergrenzen direkt im Eingabe-Plugin konfigurieren
Mem_Buf_Limit, sodass Sie die Speichernutzung genauer steuern können. -
Vermeidet Docker-Overhead — Protokolle werden direkt von Datei zu Datei übertragen, Fluent Bit ohne die Protokollpuffer von Docker zu durchlaufen.
Um diesen Ansatz zu verwenden, muss Ihre Anwendung Protokolle statt in Dateien schreiben. stdout Sowohl der Anwendungscontainer als auch der Fluent
Bit Container mounten ein gemeinsam genutztes Volume, auf dem die Protokolldateien gespeichert werden.
Das folgende Beispiel zeigt eine Konfiguration mit Tail-Eingaben mit bewährten Methoden:
[INPUT] Name tail # File path or glob pattern to tail Path/var/log/app.log# Database file for storing file offsets (enables resuming after restart) DB /var/log/flb_tail.db # when true, controls that only fluent-bit will access the database (improves performance) DB.locking true # Skip long lines instead of skipping the entire file Skip_Long_Lines On # How often (in seconds) to check for new files matching the glob pattern Refresh_Interval 10 # Extra seconds to monitor a file after rotation to account for pending flush Rotate_Wait 30 # Maximum size of the buffer for a single line Buffer_Max_Size 10MB # Initial allocation size for reading file data Buffer_Chunk_Size 1MB # Maximum memory buffer size (tail pauses when full) Mem_Buf_Limit 75MB
Beachten Sie bei der Verwendung des Tail-Input-Plug-ins Folgendes:
-
Implementieren Sie die Protokollrotation für Ihre Anwendungsprotokolle, um eine Überlastung der Festplatte zu verhindern. Überwachen Sie die zugrunde liegenden Volumenmetriken, um die Leistung zu messen.
-
Erwägen Sie Einstellungen wie
Ignore_OlderRead_from_Head, und mehrzeilige Parser, die auf Ihrem Protokollformat basieren.
Weitere Informationen finden Sie in der Dokumentation unter Tail
Loggen Sie sich direkt ein bei FireLens
Wenn der awsfirelens-Protokolltreiber in einer Aufgabendefinition angegeben wird, injiziert der Amazon ECS Container-Agent die folgenden Umgebungsvariablen in den Container:
FLUENT_HOST-
Die IP-Adresse, die dem FireLens Container zugewiesen ist.
Anmerkung
Wenn Sie EC2 im
bridgeNetzwerkmodus verwenden, kann dieFLUENT_HOSTUmgebungsvariable in Ihrem Anwendungscontainer nach einem Neustart des FireLens Log-Router-Containers (des Containers mit demfirelensConfigurationObjekt in seiner Containerdefinition) ungenau werden. Das liegt daran, dassFLUENT_HOSTeine dynamische IP-Adresse ist, die sich nach einem Neustart ändern kann. Die direkte Protokollierung vom Anwendungs-Container zurFLUENT_HOSTIP-Adresse kann nach einer Adressänderung fehlschlagen. Weitere Informationen zum Neustart einzelner Container finden Sie unter Einzelne Container in Amazon-ECS-Aufgaben mit Richtlinien für den Container-Neustart neu starten. FLUENT_PORT-
Der Port, über den das Fluent Forward-Protokoll kommuniziert.
Sie können diese Umgebungsvariablen verwenden, um sich direkt von Ihrem Anwendungscode aus mit dem Fluent Forward-Protokoll Fluent
Bit beim Log Router anzumelden, anstatt in diesen zu schreiben. stdout Bei diesem Ansatz wird die Treiberschicht für die Docker-Protokollierung umgangen, was die folgenden Vorteile bietet:
-
Geringere Latenz — Protokolle werden direkt an die Protokollierungsinfrastruktur von Docker weitergeleitet, Fluent Bit ohne sie zu passieren.
-
Strukturierte Protokollierung — Senden Sie strukturierte Protokolldaten nativ ohne zusätzlichen Aufwand für die JSON-Codierung.
-
Bessere Kontrolle — Ihre Anwendung kann ihre eigene Pufferungs- und Fehlerbehandlungslogik implementieren.
Die folgenden Fluent-Logger-Bibliotheken unterstützen das Fluent Forward-Protokoll und können verwendet werden, um Protokolle direkt an zu senden: Fluent Bit
-
Go – fluent-logger-golang
-
Python – fluent-logger-python
-
Java – fluent-logger-java
-
Node.js – fluent-logger-node
-
Ruby – fluent-logger-ruby
Konfigurieren Sie das Docker-Pufferlimit
Wenn Sie eine Aufgabendefinition erstellen, können Sie die Anzahl der Protokollzeilen angeben, die im Speicher gepuffert werden, indem Sie den Wert in angeben. log-driver-buffer-limit Dies steuert den Puffer zwischen Docker und. Fluent Bit Weitere Informationen finden Sie unter Fluentd-Protokollierungstreiber
Verwenden Sie diese Option bei hohem Durchsatz, da Docker möglicherweise der Pufferspeicher ausgeht und Puffermeldungen verworfen werden, damit neue Nachrichten hinzugefügt werden können.
Beachten Sie bei der Verwendung dieser Option Folgendes:
-
Diese Option wird in EC2 und Fargate mit Plattformversion
1.4.0oder höher unterstützt. -
Die Option ist nur gültig, wenn
logDriveraufawsfirelensgesetzt ist. -
Das Standard-Pufferlimit ist
1048576Protokollzeilen. -
Das Pufferlimit muss größer oder gleich
0und kleiner als536870912-Protokollzeilen sein. -
Die maximale Menge an Arbeitsspeicher, die für diesen Puffer verwendet wird, ist die Summe der Größe jeder Protokollzeile und der Größe des Puffers. Wenn die Protokollzeilen der Anwendung beispielsweise im Durchschnitt
2KiB betragen, würde ein Pufferlimit von 4096 höchstens8MiB verbrauchen. Die Gesamtmenge des auf Aufgabenebene zugewiesenen Arbeitsspeichers muss zusätzlich zum Arbeitsspeicher-Puffer des Protokolltreibers größer sein als die für alle Container zugewiesene Menge an Arbeitsspeicher.
Die folgende Aufgabendefinition zeigt, wie die Konfiguration erfolgt: log-driver-buffer-limit
{ "containerDefinitions": [ { "name": "my_service_log_router", "image": "public.ecr.aws/aws-observability/aws-for-fluent-bit:3", "cpu": 0, "memoryReservation": 51, "essential": true, "firelensConfiguration": { "type": "fluentbit" } }, { "essential": true, "image": "public.ecr.aws/docker/library/httpd:latest", "name": "app", "logConfiguration": { "logDriver": "awsfirelens", "options": { "Name": "firehose", "region": "us-west-2", "delivery_stream": "my-stream", "log-driver-buffer-limit": "52428800" } }, "dependsOn": [ { "containerName": "my_service_log_router", "condition": "START" } ], "memoryReservation": 100 } ] }