Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Configuration des journaux Amazon ECS pour un débit élevé
Pour les scénarios à haut débit de log, nous recommandons d'utiliser le pilote de awsfirelens log avec FireLens etFluent Bit. Fluent Bitest un processeur de journaux léger qui utilise efficacement les ressources et peut gérer des millions d'enregistrements de journaux. Cependant, pour obtenir des performances optimales à grande échelle, il faut ajuster sa configuration.
Cette section décrit les techniques Fluent Bit d'optimisation avancées permettant de gérer un débit de log élevé tout en préservant la stabilité du système et en évitant toute perte de données.
Pour plus d'informations sur l'utilisation de fichiers de configuration personnalisés avec FireLens, consultezUtilisation d’un fichier de configuration. Pour des exemples supplémentaires, consultez les FireLens exemples d'Amazon ECS
Note
Certaines options de configuration de cette section, telles que workers etthreaded, nécessitent AWS la Fluent Bit version 3 ou ultérieure. Pour plus d'informations sur les versions disponibles, voir AWS les versions de Fluent Bit
Utiliser la mise en mémoire tampon du système de fichiers
Par défaut, toutes Fluent Bit les données en mémoire tampon sont mises en mémoire tampon. Lorsque les données sont ingérées plus rapidement qu'elles ne peuvent être transférées vers les sorties, la mémoire tampon se remplit. Une fois plein, le plugin d'entrée s'arrête jusqu'à ce que de l'espace tampon soit disponible, ce qui peut provoquer une contre-pression et ralentir votre application.
Pour les scénarios à haut débit, nous recommandons d'utiliser la mise en mémoire tampon du système de fichiers. Pour plus d'informations sur la Fluent Bit gestion de la mise en mémoire tampon et du stockage, consultez la section Mise en mémoire tampon et stockage
La mise en mémoire tampon du système de fichiers présente les avantages suivants :
-
Capacité de mémoire tampon plus importante : l'espace disque est généralement plus abondant que la mémoire.
-
Persistance : les données mises en mémoire tampon survivent Fluent Bit aux redémarrages.
-
Dégradation progressive : lors de défaillances de sortie, les données s'accumulent sur le disque au lieu d'épuiser la mémoire.
Pour activer la mise en mémoire tampon du système de fichiers, fournissez un fichier de Fluent Bit configuration personnalisé. L'exemple suivant montre la configuration recommandée :
[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
Principaux paramètres de configuration :
storage.path-
Le répertoire dans lequel sont Fluent Bit stockés les fragments mis en mémoire tampon sur le disque.
storage.backlog.flush_on_shutdown-
Lorsque cette option est activée, Fluent Bit tente de vider tous les fragments du système de fichiers en attente vers leur destination lors de l'arrêt. Cela permet de garantir la livraison des données avant les Fluent Bit arrêts, mais peut augmenter le temps d'arrêt.
storage.max_chunks_up-
Le nombre de segments qui restent en mémoire. La valeur par défaut est de 128 blocs, qui peuvent consommer plus de 500 Mo de mémoire, car chaque bloc peut utiliser jusqu'à 4 à 5 Mo. Dans les environnements où la mémoire est limitée, réduisez cette valeur. Par exemple, si vous disposez de 50 Mo pour la mise en mémoire tampon, définissez ce paramètre sur 8 à 10 segments.
storage.type filesystem-
Active le stockage du système de fichiers pour le plugin d'entrée. Malgré son nom, il permet Fluent Bit de
mmapmapper des fragments à la fois à la mémoire et au disque, garantissant ainsi la persistance sans sacrifier les performances. threaded true-
Exécute l'entrée dans son propre thread, séparé Fluent Bit de la boucle d'événements principale. Cela empêche les entrées lentes de bloquer l'ensemble du pipeline.
Optimisation de la configuration de sortie
Les problèmes de réseau, les interruptions de service et la limitation des destinations peuvent empêcher la livraison des journaux. Une configuration de sortie appropriée garantit la résilience sans perte de données.
En cas d'échec d'un vidage de sortie, Fluent Bit vous pouvez réessayer l'opération. Les paramètres suivants contrôlent le comportement des nouvelles tentatives :
retry_limit-
Nombre maximal de tentatives avant de supprimer des enregistrements. La valeur par défaut est 1. Pour les environnements de production, nous recommandons une durée de 15 minutes ou plus, ce qui couvre plusieurs minutes d'interruption avec un ralentissement exponentiel.
scheduler.base-
Le nombre minimal de secondes entre les tentatives. Nous recommandons 10 secondes.
scheduler.cap-
Nombre maximal de secondes entre les tentatives en cas d'utilisation d'un recul exponentiel. Nous recommandons 60 secondes.
workers-
Le nombre de threads pour le traitement des sorties en parallèle. Plusieurs opérateurs autorisent des purges simultanées, ce qui améliore le débit lors du traitement de nombreux fragments.
Le Grace paramètre de la [SERVICE] section définit le temps d'Fluent Bitattente pendant l'arrêt pour vider les données mises en mémoire tampon. La Grace période doit être coordonnée avec celle du contenantstopTimeout. Assurez-vous que ce délai stopTimeout dépasse le Grace délai imparti pour Fluent Bit permettre le rinçage complet avant de le recevoir. SIGKILL Par exemple, si la valeur Grace est de 120 secondes, stopTimeout réglez-la sur 150 secondes.
L'exemple suivant montre une Fluent Bit configuration complète avec tous les paramètres recommandés pour les scénarios à haut débit :
[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
Utilisez la journalisation à destinations multiples pour plus de fiabilité
L'envoi de journaux vers plusieurs destinations élimine les points de défaillance uniques. Par exemple, en cas de panne de CloudWatch Logs, les journaux continuent d'atteindre Amazon S3.
La journalisation à destinations multiples offre les avantages suivants. Le plug-in de sortie Amazon S3 prend également en charge les options de compression telles que le format gzip et le format Parquet, qui peuvent réduire les coûts de stockage. Pour plus d'informations, consultez la section Compression S3
La journalisation à destinations multiples peut offrir les avantages suivants :
-
Redondance : si une destination échoue, les journaux continuent d'atteindre l'autre.
-
Rétablissement — Reconstituer les lacunes d'un système par rapport à l'autre.
-
Durabilité — Archivez les journaux dans Amazon S3 pour les conserver à long terme.
-
Optimisation des coûts : conservez les journaux récents dans un service de requête rapide tel que les CloudWatch journaux à durée de conservation plus courte, tout en archivant tous les journaux dans un espace de stockage Amazon S3 à moindre coût pour une conservation à long terme.
La Fluent Bit configuration suivante envoie des journaux à la fois à CloudWatch Logs et à 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
Les deux sorties utilisent le même Match * schéma, de sorte que tous les enregistrements sont envoyés aux deux destinations indépendamment. En cas de panne d'une destination, les journaux continuent de circuler vers l'autre tandis que les purges échouées s'accumulent dans la mémoire tampon du système de fichiers pour une nouvelle tentative ultérieure.
Utiliser la journalisation basée sur des fichiers avec le plugin d'entrée tail
Pour les scénarios à haut débit où la perte de journaux est un problème critique, vous pouvez utiliser une autre approche : demandez à votre application d'écrire des journaux dans des fichiers sur disque et de les configurer Fluent Bit pour les lire à l'aide du plug-in tail d'entrée. Cette approche contourne complètement la couche du pilote de journalisation Docker.
La journalisation basée sur des fichiers avec le plugin tail offre les avantages suivants :
-
Suivi des décalages — Le plugin tail peut stocker les décalages de fichiers dans un fichier de base de données (en utilisant l'
DBoption), garantissant ainsi une durabilité lors des Fluent Bit redémarrages. Cela permet d'éviter la perte de journal lors du redémarrage du conteneur. -
Mise en mémoire tampon au niveau de l'entrée : vous pouvez configurer les limites de mémoire tampon directement sur le plug-in d'entrée
Mem_Buf_Limit, ce qui permet de contrôler plus précisément l'utilisation de la mémoire. -
Évite la surcharge de Docker : les journaux passent directement du fichier au fichier Fluent Bit sans passer par les mémoires tampon de Docker.
Pour utiliser cette approche, votre application doit écrire des journaux dans des fichiers plutôt que dansstdout. Le conteneur d'applications et le Fluent
Bit conteneur montent tous deux un volume partagé dans lequel les fichiers journaux sont stockés.
L'exemple suivant montre une configuration d'entrée secondaire conforme aux meilleures pratiques :
[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
Lorsque vous utilisez le plugin d'entrée tail, tenez compte des points suivants :
-
Implémentez la rotation des journaux de vos applications afin d'éviter l'épuisement du disque. Surveillez les indicateurs de volume sous-jacents pour évaluer les performances.
-
Tenez compte de paramètres tels que
Ignore_OlderRead_from_Head, et des analyseurs multilignes basés sur le format de votre journal.
Pour plus d'informations, consultez Tail
Connectez-vous directement à FireLens
Lorsque le pilote de journal awsfirelens est spécifié dans une définition de tâche, l'agent de conteneur Amazon ECS injecte les variables d'environnement suivantes dans le conteneur :
FLUENT_HOST-
Adresse IP attribuée au FireLens conteneur.
Note
Si vous utilisez EC2 en mode
bridgeréseau, la variable d'FLUENT_HOSTenvironnement de votre conteneur d'applications peut devenir inexacte après le redémarrage du conteneur FireLens log router (le conteneur contenant l'firelensConfigurationobjet dans sa définition de conteneur). Cela est dû au fait queFLUENT_HOSTest une adresse IP dynamique qui peut changer après un redémarrage. La journalisation directe depuis le conteneur de l’application vers l’adresse IPFLUENT_HOSTpeut commencer à échouer après le changement d’adresse. Pour obtenir plus d’informations sur le redémarrage de conteneurs individuels, consultez la section Redémarrage de conteneurs individuels dans les tâches Amazon ECS à l’aide de politiques de redémarrage de conteneurs. FLUENT_PORT-
Port sur lequel le protocole Fluent Forward écoute.
Vous pouvez utiliser ces variables d'environnement pour vous connecter directement au routeur de Fluent
Bit journaux à partir du code de votre application à l'aide du protocole Fluent Forward, au lieu d'écrire surstdout. Cette approche contourne la couche de pilote de journalisation Docker, ce qui offre les avantages suivants :
-
Latence réduite : les journaux sont directement accessibles Fluent Bit sans passer par l'infrastructure de journalisation de Docker.
-
Journalisation structurée : envoyez des données de journal structurées de manière native sans surcharge de codage JSON.
-
Meilleur contrôle : votre application peut implémenter sa propre logique de mise en mémoire tampon et de gestion des erreurs.
Les bibliothèques d'enregistreurs Fluent suivantes prennent en charge le protocole Fluent Forward et peuvent être utilisées pour envoyer des journaux directement à Fluent Bit :
-
Go – fluent-logger-golang
-
Python : fluent-logger-python
-
Java : fluent-logger-java
-
Node.js : fluent-logger-node
-
Ruby – fluent-logger-ruby
Configurer la limite de mémoire tampon Docker
Lorsque vous créez une définition de tâche, vous pouvez spécifier le nombre de lignes de journal mises en mémoire tampon en spécifiant la valeur danslog-driver-buffer-limit. Cela contrôle la mémoire tampon entre Docker et. Fluent Bit Pour plus d’informations, consultez la section Pilote de journalisation
Utilisez cette option lorsque le débit est élevé, car Docker risque de manquer de mémoire tampon et de rejeter les messages tampons afin d'en ajouter de nouveaux.
Tenez compte des points suivants lorsque vous utilisez cette option :
-
Cette option est prise en charge sur le type de lancement Amazon EC2 et le type de lancement Fargate avec la version de plateforme
1.4.0ou une version ultérieure. -
L'option n'est valide que lorsque
logDriverest défini surawsfirelens. -
La limite par défaut du tampon est de
1048576lignes de journal. -
La limite de mémoire tampon doit être supérieure ou égale à
0et inférieure à536870912lignes de journal. -
La quantité maximale de mémoire utilisée pour cette mémoire tampon est le produit de la taille de chaque ligne de journal par la taille de la mémoire tampon. Par exemple, si les lignes de journal de l'application sont en moyenne en
2KiB, une limite de mémoire tampon de 4 096 utiliserait au maximum 18MiB. La quantité totale de mémoire allouée au niveau de la tâche doit être supérieure à la quantité de mémoire allouée à tous les conteneurs, en plus du tampon mémoire du pilote de journalisation.
La définition de tâche suivante indique comment configurer 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 } ] }