Fluentd向AWS Kinesis Firehose发送数据时偶发丢失该如何排查解决?
Fluentd 投递 AWS Kinesis Firehose 少量日志丢失解决方案
问题根因排查方向
- 排查服务日志报错:你当前配置的全局日志级别为info,kinesis_firehose 插件的限流、权限、参数错误都会输出到日志中,常见报错包括Firehose流超限触发的
ProvisionedThroughputExceededException、单条日志超过1MiB的大小限制、实例角色临时凭证拉取失败。 - 校验单条日志规格:AWS Kinesis Firehose 单条记录最大支持1MiB,若存在超过该大小的日志,会被服务端直接拒绝,且不会触发整个chunk的重试,极易被忽略。
- 检查pos_file写入逻辑:你配置的pos_file压缩间隔为72h,若Fluentd进程异常退出,未同步到pos_file的偏移量会导致部分日志漏读,最终表现为数据丢失。
配置优化方案
你可以直接替换原有配置,以下是优化后的完整配置:
<system> log_level info </system> <source> @type tail path "/var/log/app/tracy.log*" pos_file "/var/tmp/tracy.log.pos" pos_file_compaction_interval 72h @log_level "error" tag "tracylog" <parse> @type "json" time_key False </parse> </source> <source> @type monitor_agent bind 127.0.0.1 port 24220 </source> <match tracylog> @type "kinesis_firehose" region "${awsRegion}" delivery_stream_name "${delivery_stream_name}" # 新增重试配置,覆盖默认重试逻辑 retries 15 retry_max_interval 60s retry_all_errors true <instance_profile_credentials> </instance_profile_credentials> <buffer> # 替换内存buffer为文件buffer,进程重启不丢缓冲数据 @type file path /var/tmp/fluentd/firehose_buffer flush_interval 30s flush_thread_count 4 chunk_limit_size 1m # buffer满时阻塞输入,不丢弃数据 overflow_action block </buffer> # 新增死信队列,多次重试失败的日志写入本地,后续可手动重传 <secondary> @type file path /var/log/fluentd/firehose_failed_records <buffer> flush_interval 60s </buffer> </secondary> </match>
核心优化点说明
- 内存buffer改为文件持久化buffer:原配置默认使用内存buffer,Fluentd进程异常退出时,缓冲区内所有未投递的日志会直接丢失,改为文件buffer后数据会落盘持久化,进程重启后会自动重试投递。
- 全异常重试配置:开启
retry_all_errors后所有投递异常都会触发重试,适配限流、网络波动等偶发故障场景,大幅降低偶发丢数据的概率。 - 死信队列兜底:多次重试仍投递失败的日志会写入本地指定路径,不会直接丢弃,后续可根据本地日志排查失败原因并重传。
- buffer满时阻塞输入:避免流量突增时buffer溢出直接丢弃数据,配合下游Firehose的流规格扩容适配峰值流量。
内容的提问来源于stack exchange,提问作者Dhirendra Rawal
相关产品推荐
相关产品推荐

