我目前正在使用 JournalD + JournalBeat + Logstash 作为日志堆栈,但我想切换到使用 JournalD + FluentD。
我尝试使用https://github.com/fluent-plugin-systemd/fluent-plugin-systemd作为 FluentD 的输入,但它导致每秒约 1000 条日志行的低吞吐量,我需要至少支持 2000 条。
所以现在我正在尝试使用 JournalD + FluentBit + FluentD,在 FluentBit + FluentD 之间使用转发协议。使用此堆栈,我能够达到每秒 5000 条日志行的吞吐量,但会导致行乱序。实际上,乱序似乎是成块的。
这是我的 FluentBit 配置:
[SERVICE]
# Flush
# =====
# Set an interval of seconds before to flush records to a destination
Flush 5
Daemon Off
HTTP_Server On
HTTP_Listen 0.0.0.0
HTTP_Port 2020
[INPUT]
Name systemd
Tag host.*
Systemd_Filter _SYSTEMD_UNIT=docker.service
Read_From_Tail true
Path /var/log/journal
[OUTPUT]
Name forward
Require_ack_response true
Match *
Host 127.0.0.1
Port 24224
这是我的 FluentD 配置:
<source>
@type forward
@id input_forward
tag docker.systemd
</source>
<match docker.systemd>
@type copy
<store>
@type file
@id out_file_docker
path /file-logs/${$.CONTAINER_TAG}/%Y/%m/%d/${$.PRIORITY}
append true
<format>
@type single_value
message_key MESSAGE
</format>
<buffer $.CONTAINER_TAG,$.PRIORITY,time>
@type file
path /var/log/fluentd/file-buffers/
timekey 1d
flush_mode interval
flush_interval 10s
flush_at_shutdown true
</buffer>
</store>
<store>
@type prometheus
<metric>
name fluentd_output_status_num_records_total
type counter
desc The total number of outgoing
</metric>
</store>
</match>
额外细节:
- 我在 4gb 和 4096 CPU 共享的 docker 容器中运行 FluentD 和 FluentBit
- 两种服务的 CPU 使用率测量值均低于 20%
我尝试过的其他事情:
- 在 FluentBit 中设置
Mem_Buf_Limit
为 2MB 可修复无序,但吞吐量仅为每秒 350 行。如果我使用更大的缓冲区日志行再次出现故障。 - 将 FluentBit 输出设置为文件会按顺序生成日志行,但我无法在不同文件中分发日志。
- 在 FluentBit 中使用更大的
Flush
间隔会导致更大的块乱序 flush_thread_count
在 FluentD 中尝试过,没有任何影响
我应该尝试的任何其他设置/协议的任何想法?还有其他方法可以集成 Journal 和 FluentD 吗?
- - - 编辑 - -
使用 DEBUG 查看 FluentBit 日志,我看到:
[2020/01/14 17:00:30] [trace] [upstream] destroy connection #52 to 127.0.0.1:24224
[2020/01/14 17:00:30] [trace] [upstream] destroy connection #100 to 127.0.0.1:24224
所以看起来正向输出正在使用多个线程。这是预期的吗?