Performance 使用Elasticsearch作为时间窗口存储的性能问题
我们几乎将弹性搜索用作缓存,存储在时间窗口中找到的文档。我们不断地插入大量不同大小的文档,然后使用文本查询和日期过滤器在ES中搜索,这样当前线程就不会得到它已经看到的文档。大概是这样的: “((word1和Word2)或(word3和word4))和插入数据>1389000” 我们使用TTL功能在弹性搜索中维护数据30分钟。今天,我们至少有3台机器,每分钟为每台机器插入批量请求的新文档,并使用类似上面的查询进行搜索 我们在索引和检索这些文档时遇到了很多麻烦,ES索引和返回的文档吞吐量不高。我们甚至不能每秒索引200个文档 我们认为问题在于同时进行查询、插入和TTL删除。我们不需要将旧数据保持在弹性中,我们只需要在给定时间内用弹性索引的文档的一个小时间窗口。 我们应该做些什么来提高我们的绩效 提前谢谢 机器类型:Performance 使用Elasticsearch作为时间窗口存储的性能问题,performance,indexing,elasticsearch,Performance,Indexing,elasticsearch,我们几乎将弹性搜索用作缓存,存储在时间窗口中找到的文档。我们不断地插入大量不同大小的文档,然后使用文本查询和日期过滤器在ES中搜索,这样当前线程就不会得到它已经看到的文档。大概是这样的: “((word1和Word2)或(word3和word4))和插入数据>1389000” 我们使用TTL功能在弹性搜索中维护数据30分钟。今天,我们至少有3台机器,每分钟为每台机器插入批量请求的新文档,并使用类似上面的查询进行搜索 我们在索引和检索这些文档时遇到了很多麻烦,ES索引和返回的文档吞吐量不高。我们甚
- AmazonEC2介质实例(3.7GB内存)
- 用于构建索引的代码如下所示:
- 我们的elasticsearch.json配置文件:
- 我们现在不使用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将是最大的赢家,另外还有你的索引