Elasticsearch 索引策略创建最佳 practice/performance

Elasticsearch index policy creation best practice/performance

我正在设计一个基于ElasticSearch的搜索系统,看了很多之后我看到一些系统比如日志使用多个索引的策略来保存相同的内容,类似于mylogs-12-02-2020并且正在创建每天创建一个索引,然后进行搜索,他们在所有符合 mylogs- * pattern 的索引中执行搜索,每个索引都有其主分片和副本。 我的问题是关于搜索的性能,如果使用 n 个分片查看 500 万个文档的索引或查找 100,000 个文档的 50 个索引,性能会更好。有没有人有任何可遵循的最佳实践经验?

我假设我的系统每天大约增长 200,000 个文档。

最好的做法是什么,在多个索引中分开或在不同节点中使用具有多个主分片的单个索引(以便它们在搜索/索引时不会竞争相同的资源)?

mylogs-* elastic 上进行搜索时,它是否与索引平行并在其分片的每个索引内?

默认情况下,Elasticsearch 索引有 5 个主分片,每个分片有 1 个副本。但问题是默认配置并不适合所有用例。

分片大小对于搜索查询非常重要。如果分配给索引的分片太多,Lucene 段就会很小,从而导致开销增加。当同时进行多个查询时,许多小分片也会降低查询吞吐量。另一方面,太大的分片会导致搜索性能下降和故障恢复时间变长。因此,Elasticsearch建议一个分片的大小应该在20到40GB左右。

请记住,分片本身充当独立的搜索引擎,而不是索引。索引是一种数据组织机制,允许用户以某种方式对数据进行分区。就这些!

更多详情read this article

@Umar 给出的 Elasticsearch 默认配置是旧的,从 7.0 ES 最新主要版本开始,主分片减少到 1,您可以在 ES official breaking changes announcement 中查看.

没有人可以设计出完美的 ES 索引,具有最佳的分片和副本数,并且需要在此期间不断进行微调。影响设计考虑的一些因素。

  1. 读取或写入繁重的系统。

  2. 基于时间的索引(如您的日志搜索),通常搜索发生在较新的日志或电子商务产品目录或网站搜索中,您不能将索引划分为基于时间的数据。

  3. ES 集群(多租户 vs 专用于单一索引)。

以上只是一些示例,我可以给出数百个其他因素,您可以在设计 ES 索引配置时考虑这些因素。 但我们的想法是首先从更关键的参数开始(比如更改主分片需要重新索引),同时考虑近期的增长并稍后根据当前系统性能进行微调。

我强烈建议您通过 my detailed blog 详细回答您的问题(在具有更多文档的索引中搜索比在具有更少文档的更多 indices/shards 中搜索)世界案例研究。

上面的博客还解释了 ES 将长期默认主分片从 5 个更改为 1 个的决定。

回答您的以下问题:

问题:在 mylogs-* elastic 上进行搜索时,它是否平行于索引并在其分片的每个索引中?

回答:是的,ES 具有分布式架构,并且由于 ES 索引由成熟的搜索引擎 Lucene 分片构成,如果需要,每个 ES 查询将由多个线程并行执行要命中多个分片(无论是相同索引还是多个索引),给定线程是空闲的,否则一旦线程完成,它将被用于查询另一个分片。这就是为什么 ES 比其他分布式系统快得多的原因。