我有一个从SQL数据库到Elasticsearch的管道,如下所示:
实际上,这条管道的吞吐量非常低。我知道这是由于聚合步骤(执行一些相对繁重的处理),我想使用多个线程/进程来提高性能(允许我使用多个核心)。
但是,logstash-filter-aggregate插件不支持多个过滤器工作程序 - 可能是因为它无法保证应该组合成一个聚合事件的事件将由同一个工作程序处理。
我目前的解决方案是运行几个logstash实例,其中每个实例从SQL数据库中选择group_id的某个子集。但是,这有很多开销。有没有更好的方法可以将多个核心用于logstash-filter-aggregate?
答案 0 :(得分:1)
你在那里有点洞。 Aggregate
是需要序列化事件流的过滤器之一,因为它将需要的状态视为一个或多个事件。每当您需要序列化时,您的吞吐量将仅限于单个核心,以确保过滤器工作人员能够看到所需的所有事件。与数据库一样,解决此问题的方法是对数据集进行分片。您已经发现的。
实际上,分片是解决此问题的最佳单阶段logstash解决方案。
如果你想去那里,有一个多阶段的解决方案。那是建立第二个管道。它会像这样工作:
elasticsearch
。elasticsearch
输入来查询看起来像是非聚合事件的事件。或者,您可以使用非logstash方法在ElasticSearch中执行聚合。