LogStash什么时候会超过队列容量并丢弃消息?

时间:2014-08-22 08:42:25

标签: redis message-queue logstash

我正在使用LogStash从我的服务中收集日志。数据量太大(20GB /天),我担心有些数据会在高峰期丢弃。

所以我在这里问question并决定在ELB和LogStash之间添加一个Redis作为缓冲区,以防止数据丢失。

但是,我对 LogStash何时超出队列容量并丢弃消息感到好奇?

因为我做了一些实验,结果表明LogStash可以完全处理所有数据而不会有任何损失,例如本地文件 - > LogStash - >本地文件,netcat - > LogStash - >本地文件。

当LogStash最终丢弃邮件时,有人能给我一个可靠的例子吗?所以我可以更好地了解为什么我们需要一个缓冲区。

2 个答案:

答案 0 :(得分:1)

据我所知,Logstash队列非常小。请参阅here

Logstash sets each queue size to 20. This means only 20 events can be pending into the next phase.
This helps reduce any data loss and in general avoids logstash trying to act as a data storage   
system. These internal queues are not for storing messages long-term.

正如您所说,您的每日日志大小为20GB。这是相当大的数额。因此,建议在logstash之前安装redis。安装redis的另一个好处是当你的logstash进程出现错误并关闭时,redis可以为你缓冲日志,否则你的所有日志都会丢失。

答案 1 :(得分:0)

最大队列大小是可配置的,队列可以存储在磁盘或内存中。 (由于容量很大,强烈建议使用内存)。

当队列已满时,logstash 将停止读取日志消息并丢弃传入的日志。

对于日志文件,logstash会在tiit跟不上时停止进一步读取,稍后再继续读取。它跟踪活动日志文件和上次读取位置。文件基本上就像一个巨大的缓冲区,真的不太可能丢失数据(除非文件被删除)。

对于 TCP/UDP 输入,如果队列已满,消息可能会丢失。

对于其他输入/输出,您必须检查文档,是否支持背压,是否可以在网络连接丢失的情况下重放错过的消息。

一般来说,每天 20 GB 是相当低的(即使在 2014 年最初发布时也是如此),我们谈论的是每秒 1000 条消息。 logstash真的不需要前面的redis。

对于非常大的部署(每天多 TB),在链中的某个地方遇到 kafka 来缓冲消息是很常见的。在这个阶段,通常有许多客户端具有不同类型的消息,流经各种协议。