Amazon VPC内部简单可靠的集中式日志logging

我需要为Amazon VPC中的一组服务器(10-20)设置集中式日志logging。 日志logging应该不会丢失任何日志消息,以防单个服务器脱机,或者整个可用区域脱机。 它也应该容忍丢包和其他正常的networking条件,而不会丢失或复制消息。 它应该至less在两个不同的EBS卷的两个可用区中存储消息,但是S3也是一个好的地方。 它也应该是实时的,以便消息在几秒内到达两个不同的可用区域。 我还需要同步不通过syslog生成的日志文件,所以只有syslog的集中式日志logging解决scheme不能满足所有的需求,尽pipe我猜这个限制可以解决。

我已经审查了几个解决scheme,我将在这里列出它们:

stream向S3 :我可以设置两个日志服务器作为Flume主机,它们可以在本地或在S3存储日志消息,并且使用Flume将所有服务器configuration为使用端到端可靠性选项将所有消息发送到两个服务器。 这样,单个服务器的丢失不应该导致丢失的消息,并且所有消息将实时到达两个可用区域。 但是,需要有一些方法来join两个服务器的日志,并将所有传递给这两个服务器的消息进行重复数据删除。 这可以通过在发送端添加一个唯一的ID来完成,然后在日志文件上写一些手动重复数据删除。 我还没有find一个简单的解决scheme的重复问题。

Logstash到Logstash到ElasticSearch :我可以在服务器上安装Logstash,并通过AMQP将它们传递到中央服务器,并打开耐久性选项。 然而,为了这个工作,我需要使用一些具有集群能力的AMQP实现,或者像在Flume的情况下那样分发。 AMQP似乎是几个实现的又一个移动部分,并没有真正的指导什么是最好的这种设置。 而且我并不完全相信,我可以从logstash到elasticsearch获得实际的端到端持久性,假设两者之间的服务器崩溃。 扇出解决scheme再次运行重复数据删除问题。 似乎处理所有情况的最佳解决scheme是甲壳虫,它似乎通过一个Redis商店提供高可用性和重复数据删除。 但是,我还没有看到有关如何使用Logstash进行设置的指导,而Redis又是一个不应该非常困难的事情。

Logstash到ElasticSearch :我可以在所有的服务器上运行Logstash,在服务器本身拥有所有的过滤和处理规则,并且直接将它们logging到ElasticSearch服务器。 我认为这应该带给我可靠的日志logging,我可以使用ElasticSearch集群function透明地共享数据库。 但是,我不确定如果安装程序实际上在Logstash重新启动和间歇性networking问题中仍然存在,而没有在故障转移情况下或类似情况下复制消息。 但是这个方法听起来很有希望。

rsync :我可以rsync所有相关的日志文件到两个不同的服务器。 这里的可靠性方面应该是完美的,因为文件在完成同步之后应该与源文件相同。 但是,每秒做一次rsync并不会让人感觉好玩。 另外,我需要日志在被发送之后无法被打扰,所以rsyncs需要处于append-only模式。 除非我小心,否则日志旋转会让事情变得糟糕。

rsyslog与RELP :我可以设置rsyslog通过RELP发送消息到两个远程主机,并有一个本地队列来存储消息。 再次出现重复数据删除问题,RELP本身也可能会复制一些消息。 但是,这只能处理通过sysloglogin的东西。

这些解决scheme似乎都不是非常好,而且还有很多未知的知识,所以我在这里向那些build立集中的可靠日志logging的人们寻求更多的信息,以获得实现这个目标的最佳工具。

我是LogZilla的创始人,我们即将发布我们软件的Amazon EC2云解决scheme。 我很乐意有机会讨论您的目标和为您提供解决scheme的可能性。 如果您有兴趣,请随时与我联系。

虽然我确定你可以使用rsyslog,但我们使用的是syslog-ng和tcp(你也可以使用tlsencryption和基于磁盘的缓冲来保证消息的传递)。

我们的testing盒每秒发送高达3000个事件,而不会丢失任何信息 – 所有这一切都在Amazon EC2微型盒子上(请注意,由于存储需要,这种方式在生产中不起作用,但这是对我们所做工作的certificate完成)。

对于高可用性,使用两个目标日志服务器然后试图对它们进行重复数据删除会比较容易 – 然后,只需在两台服务器之间使用心跳,如果主服务器脱机,则会失败备用服务器。 如果你愿意的话,你仍然可以进行重复数据删除,但是前者往往要简单得多,而且工作得很好。

同步非系统日志文件是一个简单的问题,通过perlparsing它们,并通过使用Log :: Syslog :: Fast在系统日志中发送它们 – 有一个包含在我们软件的contrib目录中的例子(如果你想要复制)。 您也可以将它们复制到LogZilla服务器,并直接将它们传送到我们的预处理器中。