我们设置了一个 Logstash 服务器(1.4.2,使用嵌入式 Elasticsearch),用于从多个其他客户端(通过 TCP 和它们的rsyslogd
实例)接收日志。现在反复发生的一个问题是,不再收到来自主机的逐条消息,但是却看不到任何错误消息。
基本上看起来 Logstash 主机无法处理大量传入消息,并且连接处于一种奇怪的状态;我在客户端实例上做了lsof
/并且还在客户端和服务器上捕获了一些流量,并且似乎客户端仍然打开着连接:strace
rsyslogd
rsyslogd 30088 syslog 1u IPv4 14878202 0t0 TCP 10.129.X.X:47492->10.129.X.X:5544 (ESTABLISHED)
,由于服务器(端口5544
)发送 TCP 零窗口消息,该连接基本上已断开,正如Wireshark 告诉我,基本上是 Logstash 没有跟上(主机上的 CPU 使用率并不总是最大,而是在所有四个核心上定期保持在 75% 左右)。
我的问题是:在这种情况下,是否有标志/设置/...可以让rsyslogd
守护进程退出/重新连接,或者如果 Logstash 无法跟上,它可以正确关闭连接?(这是一个已知问题吗?因为我找不到任何相关链接。)
编辑:与此同时,我们已将输入插件改为,这与手动解析相结合tcp
,似乎可以更好地处理负载。不过,我仍然想了解原始问题。syslog
grok
答案1
这些是您正在寻找的参数:
Action.ResumeInterval="30"
Action.ResumeRetryCount="-1"
这里你可以找到所有可用的参数
这是通用 rs 的示例:
ruleset(name="myruleset_name"){
action(
type="omfwd"
Target="destination_fqdn_ip"
Port="destination_port"
Protocol="tcp"
Action.ResumeInterval="30"
Action.ResumeRetryCount="-1"
)
stop
}
请注意,问题实际上取决于 dst:logstash 服务器无法应对传入负载(rsyslog 输出),因此您应该仔细查看 dst 服务器。反复出现的 TCP 零窗口是一个巨大的问题,因为它可能导致数据丢失(缓冲区开销)、数据高峰和低谷、数据不实时等。
希望有所帮助。