使用 Apache Kafka 进行日志聚合

Posted

技术标签:

【中文标题】使用 Apache Kafka 进行日志聚合【英文标题】:Using Apache Kafka for log aggregation 【发布时间】:2013-09-17 08:00:31 【问题描述】:

我正在从他们的快速入门教程中学习 Apache Kafka:http://kafka.apache.org/documentation.html#quickstart。到目前为止,我已经完成了如下设置。一个生产者节点,其中一个 Web 服务器在端口 8888 上运行。另一个节点上的 Kafka 服务器(代理)、消费者和 Zookeeper 实例。我已经用 3 个分区测试了默认的控制台/文件启用的生产者和消费者。设置是完美的,我可以看到我按照他们创建的顺序发送的消息(在每个分区中)。

现在,我想将从 Web 服务器生成的日志发送到 Kafka Broker。这些消息将由消费者稍后处理。目前我正在使用 syslog-ng 将服务器日志捕获到文本文件中。关于如何实现生产者使用kafka进行日志聚合,我想出了3个粗略的想法

生产者实现第一类: 监听 syslog-ng 的 tcp 端口。获取每条消息并发送到 kafka 服务器。这里我们有两个中间进程:Producer 和 syslog-ng第二种: 使用 syslog-ng 作为 Producer。应该找到一种将消息发送到 Kafka 服务器而不是写入文件的方法。 syslog-ng,生产者是中间进程。 第三种:将网络服务器本身配置为生产者。

我的想法是否正确。在最后一种情况下,我们没有任何中间过程。但我怀疑它的实现会影响服务器性能。谁能告诉我使用 Apache Kafka 的最佳方法(如果上述 3 种不好)并指导我进行适当的服务器配置?..

P.S.:我使用 node.js 作为我的网络服务器

谢谢, 萨拉特

【问题讨论】:

【参考方案1】:

由于您指定希望将生成的日志发送到 kafka 代理,看起来执行一个进程来侦听和重新发送消息主要会产生另一个故障点,没有额外的价值(除非您需要特定的 syslog-ng能力)。

Syslog-ng 可以使用以下方式向外部应用程序发送消息: http://www.balabit.com/sites/default/files/documents/syslog-ng-ose-3.4-guides/en/syslog-ng-ose-v3.4-guide-admin/html/configuring-destinations-program.html。不知道有没有其他办法。

对于第三个选项,我不确定 kafka 是否可以轻松集成到 Node.js 中,因为它需要一个 c++ 生产者,而当我上次寻找时,我找不到。但是,一个简单的替代方法可能是让 kafka 读取服务器创建的日志文件并发送这些日志(使用 kafka 提供的控制台生产者)。这通常是一个好方法,因为它完全消除了 kafka 和 Web 服务器之间的依赖关系(嵌入生产者需要错误处理、配置等)。它需要使用 tail --follow 并且对我们非常有效。如果您希望获得更多详细信息,我也可以将它们包括在内。您仍然需要监督 kafka 执行以确保消息不会丢失(并提供恢复选项以离线发送失败的消息)。但是,这种方法的好处是工具之间没有依赖关系。

希望对你有帮助...

伊兰

【讨论】:

谢谢@erankl。并为非常延迟的反应道歉。实际上停止了这方面的工作,因为我还有其他工作。我决定使用第一个选项。原因是我可以从 syslog-ng 将所有消息发送到管道,生产者可以读取这些消息。生产者会将其发送到 Kafka 并最终由 Storm 处理以进行一些实际分析。 syslog-ng 也用于将它们保存到一个文件中,该文件将用于一些离线批处理。成功完成后会写博客.. 你好,萨拉特。你写过一篇关于你的设置的博客文章吗? 我们有类似的设置。取而代之的是syslog-ng,我们一直在跟踪error_log 文件并提供给生产者。但是随着error_log 文件的轮换,我们错过了一些日志。所以我想知道syslog-ng 的消耗有多可靠我们测试了流程并且没有错过日志。但在那种情况下,我们有太多间接stdout > tee >> error_log and logger 然后logger >> socket >> syslog-ng >> nc >> producer。所以想知道syslog-ng设置的可靠性

以上是关于使用 Apache Kafka 进行日志聚合的主要内容,如果未能解决你的问题,请参考以下文章

为什么会有Apache Kafka

kafka

Kafka单机部署

Kafka单机部署

使用 Apache Kafka 将数据从 MSSQL 同步到 Elasticsearch

Flume 实战,将多台机器日志直接收集到 Kafka