elasticsearch,Performance,Indexing,elasticsearch" /> elasticsearch,Performance,Indexing,elasticsearch" />

Performance 使用Elasticsearch作为时间窗口存储的性能问题

Performance 使用Elasticsearch作为时间窗口存储的性能问题,performance,indexing,elasticsearch,Performance,Indexing,elasticsearch,我们几乎将弹性搜索用作缓存,存储在时间窗口中找到的文档。我们不断地插入大量不同大小的文档,然后使用文本查询和日期过滤器在ES中搜索,这样当前线程就不会得到它已经看到的文档。大概是这样的: “((word1和Word2)或(word3和word4))和插入数据>1389000” 我们使用TTL功能在弹性搜索中维护数据30分钟。今天,我们至少有3台机器,每分钟为每台机器插入批量请求的新文档,并使用类似上面的查询进行搜索 我们在索引和检索这些文档时遇到了很多麻烦,ES索引和返回的文档吞吐量不高。我们甚

我们几乎将弹性搜索用作缓存,存储在时间窗口中找到的文档。我们不断地插入大量不同大小的文档,然后使用文本查询和日期过滤器在ES中搜索,这样当前线程就不会得到它已经看到的文档。大概是这样的:

“((word1和Word2)或(word3和word4))和插入数据>1389000”

我们使用TTL功能在弹性搜索中维护数据30分钟。今天,我们至少有3台机器,每分钟为每台机器插入批量请求的新文档,并使用类似上面的查询进行搜索

我们在索引和检索这些文档时遇到了很多麻烦,ES索引和返回的文档吞吐量不高。我们甚至不能每秒索引200个文档

我们认为问题在于同时进行查询、插入和TTL删除。我们不需要将旧数据保持在弹性中,我们只需要在给定时间内用弹性索引的文档的一个小时间窗口。 我们应该做些什么来提高我们的绩效

提前谢谢

机器类型:

  • AmazonEC2介质实例(3.7GB内存)
其他信息:

  • 用于构建索引的代码如下所示:

  • 我们的elasticsearch.json配置文件:

编辑

很抱歉耽搁了很久才给你们一些反馈。我们公司的事情有点忙乱,我选择等待更平静的时间来更详细地说明我们是如何解决问题的。我们仍然需要做一些基准来衡量实际的改进,但关键是我们解决了这个问题:)

首先,我认为索引性能问题是由外部的使用错误造成的。正如我之前所说,我们使用Elasticsearch作为一种缓存,在30分钟的时间窗口内查找文档。我们在elasticsearch中查找内容与某个查询匹配、插入日期在某个范围内的文档。然后,Elastic将返回完整的文档json(除了索引内容之外,还有大量数据)。我们的配置错误地对文档json字段进行了弹性索引(除了content和insertDate字段之外),我们认为这是索引性能问题的主要原因

然而,正如这里的答案所示,我们也做了一些修改,我们认为这些修改也提高了性能:

  • 我们现在不使用TTL特性,而是在一个通用别名下使用两个“滚动索引”。当索引变旧时,我们创建一个新索引,为其分配别名,然后删除旧索引

  • 我们的应用程序每秒执行大量查询。我们认为这会严重影响弹性,并降低索引性能(因为我们只使用一个节点进行弹性搜索)。我们为节点使用了10个分片,这使得我们激发的每个查询都转换为10个查询,每个分片对应一个查询。由于我们可以随时丢弃弹性节点中的数据(因此,对碎片数量的更改对我们来说不是问题),因此我们只是将碎片数量更改为1,从而大大减少了弹性节点中的查询数量

  • 我们的索引中有9个映射,每个查询将被激发到一个特定的映射。在这9个映射中,大约90%的插入文档转到了其中两个映射。我们为每个映射创建了一个单独的滚动索引,并将其他7个映射保留在同一个索引中

  • 这不是真正的修改,但我们从Sematext安装了SPM(可伸缩性能监控),这使我们能够密切监控弹性搜索并了解重要指标,例如触发的查询数->Sematext.com/SPM/index.html


我们的使用数量相对较少。我们每秒收到大约100个文档,这些文档必须进行索引,峰值为400个文档/秒。至于搜索,我们每分钟大约有1500次搜索(在更改碎片数量之前为15000次)。在这些修改之前,我们遇到了这些性能问题,但现在不是了。

我会启动一个额外的ES实例,让它与当前节点形成一个集群。然后我将在两台机器之间分配工作,一台用于索引,另一台用于查询。看看结果如何。您可能需要针对特定的使用模式进行更多的扩展。

TTL到基于时间序列的索引

<>你应该考虑使用基于时间序列的索引而不是TTL特性。考虑到您只关心最近30分钟的文档窗口,请使用基于日期/时间的命名约定为每30分钟创建一个新索引:即docs-20130912000、docs-201309120030、docs-201309120100、docs-201309120130等(请注意命名约定中的30分钟增量)

使用Elasticsearch的索引别名功能(),您可以将
文档
别名为最近创建的索引,以便在批量索引时,始终使用别名
文档
,但它们将被写入
文档-201309120130

在查询时,您将在datetime字段上进行筛选,以确保只返回最近30分钟的文档,并且您需要查询最近创建的两个索引,以确保获得完整的30分钟文档-您可以在此处创建另一个别名以指向这两个索引,或者直接查询两个索引名

有了这个模型,您就不会有TTL使用的开销,您可以从过去一个多小时内删除旧的、未使用的索引

还有其他方法可以提高批量索引和查询速度,但我认为删除TTL将是最大的赢家,另外还有你的索引