ELK与RabbitMQ进行大量消息传递/文档处理?

我一直在看ELK堆栈或RabbitMQ来取代一个自制的系统,摄取大量的文件(每小时200-300万),然后根据名称和内容将它们发送到各个位置,在本地存储一个副本。 (基本上,ELK)

不过,我在所需的复杂性和硬件足迹方面还有一点偏差。

RabbitMQ和ELK栈在这种任务上有什么优势? 在我看来,ELK可能是过分的,但我对RabbitMQ并不熟悉。

我的math说这是每秒83K事件。 好多啊。

我不太清楚为什么要分开RMQ和ELK,因为RMQ可以是ELK的一个组件。 事实上,我所知道的非常大型的部署肯定使用像Rabbit这样的AQMP解决scheme,或者像Kafka这样的解决scheme来提供事件生成和parsing层之间的缓冲区,以及提供多个消费者。

可以处理事件stream的一般高规模pipe道就像你正在考虑的那样:

LogstashArchitectureLarge  - 分布式

  1. 托运人将日志发送到中央队列。 发货可以是FileBeat,Logstash本身,或者其他的东西。
  2. 队列系统,不pipe它是什么。 可能是Redis,RabbitMQ,Kafka或其他。
  3. parsing层。 一组Logstash节点,将事件从队列中拉出,按摩它们,并将它们运送到下一个阶段。
    • 这横向扩展。 只要你的队列系统能跟上,你可以在这里继续添加parsing器。 在我们的系统中,根据我们的过滤规则,我们可以每个核心执行2K个事件/秒。 你的将是不同的。
    • 如果您在队列中利用频道,则甚至可以拥有多个parsing层,具体取决于您的工作负载分离情况。
    • 这个组是高CPU。 它的内存有多高取决于你的filter最终是多么的粗糙。
  4. 存储层。 在经典ELK中,这是ElasticSearch。 它不一定是,但是。
    • 一个小时处理300M事件的ElasticSearch集群将会很大。 没有绕过那个。 有多大取决于你想保存数据的时间。
    • 这听起来像你的消费者正在期待文件。 这也可以做到。 所以发送处理过的事件(只是JSON)到另一个排队系统供其他系统使用。

这种架构的优势在于,您不会将过滤逻辑放在正在进行生产工作的资源上。 它还将ElasticSearch的接收问题减less到大部分来自Logstashparsing层的批量请求,而不是来自生产资源的较小的接收批次。

这也在您的日志归档(ElasticSearch)和您的生产资源之间提供了一些安全分离。 如果其中一个人在他们身上得到一个邪恶的人,拥有队列缓冲区意味着他们不能直接擦除ElasticSearch的存在。 当你在公司里有一个安全组织时,这个问题就很重要,而在每小时300M的事件中,你可能已经足够大了。


针对兔子系统的要点更多的是缺less的function。 兔子是一个排队系统,本身并不提供任何方式来转换数据(ELK中的L)或存储它(ELK中的E和K)。 无法显示其存储内容的日志归档系统不是一个好的日志归档系统。

与@ sysadmin1138一起去大部分,但我想警告你比较两个不同的东西。 ELK是三个独立的应用程序的实现,提供了一个日志聚合解决scheme(F / OSS竞争对手Splunk),其中RabbitMQ是一个消息队列。

这听起来像你有一个非常具体的应用程序工作stream程,而你所做的任何事情都将需要重大的工程。 你也许可以弯曲ELK来满足你的需求,但正如sysadmin1138所说,任何有这个工作负载的系统都需要适当的扩展来满足容量和HA要求。

ELK和RabbitMQ的规模非常好,但需要一些专业知识才能有效pipe理。 这样说的话,如果你没有使用和pipe理任何规模的ELK集群(比如说至less有 5个ES节点),你可能希望避免使用ELK作为一个非法的黑客行为系统。

根据进入的消息types以及结果的处理位置,对于我来说,听起来像是使用MQ群集以及将作业closures并对其执行操作的应用程序池。 但在这一点上,您正在谈论一个重要的项目,可能需要软件架构师和操作系统架构师的参与,熟悉您的业务需求和工作stream程。 (即比ServerFault问题更复杂)。