最近发生了网络故障,导致一系列其他严重问题,因此我一直在深入研究我们的 rsyslog.conf,尝试寻找更稳定部署的机会。
我们所有的应用服务器都运行 rsyslog,通过 tcp 转发到几个聚合服务器。昨天,当其中一个服务器由于数据包丢失率高而几乎无法访问时,其余环境都陷入停顿。我想我发现了几个不合理的配置。
这是我们的客户端配置:
# modules
$ModLoad imuxsock # provides support for local system logging
$ModLoad imklog # provides kernel logging support (previously done by rklogd)
$KLogPath /proc/kmsg
# global app configs
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0644
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog
$PreserveFQDN on
# queue configs
$MainMsgQueueType LinkedList
$MainMsgQueueSize 50000
$ActionQueueType Direct
$MainMsgQueueDiscardMark 300000
$MainMsgQueueDiscardSeverity 4
$MainMsgQueueFileName mainmsgqueue
$MainMsgQueueMaxFileSize 200m
$MainMsgQueueLowWaterMark 10000
$MainMsgQueueHighWaterMark 40000
$MainMsgQueueTimeoutEnqueue 1
$ActionQueueTimeoutEnqueue 1
# Log locally.
authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
# Send all components to remote log servers
*.* @@<server 1 IP>
& @@<server 2 IP>
我的问题是:
A) 在客户端服务器上,如果“直接”队列中的消息通过 TCP 发送到几乎(但不是完全)无法访问的服务器,会发生什么情况?如果操作队列无法发送日志,MainMsg 队列是否会立即开始备份?
B) 对于“QueueSize”为 50000 且未设置“QueueMaxDiskSpace”的“磁盘辅助”队列,其最大总队列大小(内存和磁盘)是多少?它是无限制的吗,也就是说,“QueueSize”指令仅适用于内存部分?
C)“QueueDiscardMark”指令是否适用于所有排队消息(内存和磁盘)还是仅适用于内存部分?
答案1
在 rsyslog 论坛上获得了更多帮助,并在这里交叉发布,以便将来帮助任何人。
Rsyslog 论坛主题:[http://kb.monitorware.com/post24885.html#p24885]
答案:1.) rsyslog 目标是按顺序处理的,因此如果“服务器 A”出现数据包丢失,则会减慢向其余目标的传输速度。在当前版本的 rsyslog 中,可以通过设置额外的“操作队列”来缓解此问题,从而并行化输出。
2.) 磁盘辅助队列的“QueueSize”仅适用于内存部分。除非您指定“QueueMaxDiskSpace”,否则磁盘队列将不受限制
3.) 我没有得到确切的答案,即丢弃消息标记是否会应用于磁盘辅助队列的内存和磁盘部分。逻辑上认为它适用于所有新传入的消息,无论它们存储在哪里,但这只是猜测。