我正在通过他们的快速入门教程学习 Apache Kafka:http://kafka.apache.org/documentation.html#quickstart .到目前为止,我已经完成了如下设置。生产者 Node ,其中 Web 服务器在端口 8888 上运行。另一个 Node 上的 Kafka 服务器(代理)、消费者和 Zookeeper 实例。我已经用 3 个分区测试了启用默认控制台/文件的生产者和消费者。设置是完美的,我能够看到我按照它们创建的顺序发送的消息(在每个分区中)。
现在,我想将从 Web 服务器生成的日志发送到 Kafka Broker。这些消息稍后将由消费者处理。目前我正在使用 syslog-ng 将服务器日志捕获到文本文件中。关于如何实现生产者使用kafka进行日志聚合,我想出了3个粗略的想法
生产者实现
第一类:
监听 syslog-ng 的 tcp 端口。获取每条消息并发送到kafka服务器。这里我们有两个中间进程:Producer 和 syslog-ng
第二种: 使用 syslog-ng 作为生产者。应该找到一种方法将消息发送到 Kafka 服务器而不是写入文件。 syslog-ng,生产者是中间进程。
第三种:将网络服务器本身配置为生产者。
我的想法对吗?在最后一种情况下,我们没有任何中间过程。但我怀疑它的实现会影响服务器性能。任何人都可以让我知道使用 Apache Kafka 的最佳方法(如果以上 3 个都不好)并指导我完成服务器的适当配置吗?..
P.S.: 我正在为我的网络服务器使用 node.js
谢谢,
萨拉斯
最佳答案
由于您指定希望将生成的日志发送到 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 的执行以确保消息不会丢失(并提供恢复选项以离线发送失败的消息)。但是,这种方法的好处是工具之间没有依赖性。
希望对你有帮助
艾兰
关于node.js - 使用 Apache Kafka 进行日志聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18844386/