我正在设计一个基于ElasticSearch的搜索系统,在阅读了很多之后,我看到一些系统,如日志,使用多个索引的策略来保存相同的内容,类似于mylogs-12-02-2020
,并且每天都在创建一个索引,然后为了搜索,他们在所有符合mylogs- * pattern
的索引中执行搜索,每个索引都有自己的主碎片和副本。我的问题是关于搜索的性能,如果搜索500万个文档的索引,使用n个碎片,或者搜索100000个文档的50个索引,性能会更高。有人有最佳实践经验吗?
我假设我的系统每天将有大约200000个文档的增长。
在多个索引中分离,或者在不同节点中有一个带有多个主碎片的索引(这样它们在搜索/索引时就不会争夺相同的资源(,最佳做法是什么?
在mylogs-* elastic
上进行搜索时,它是否与索引平行并位于其碎片中的每个索引内?
@Umar给出的Elasticsearch默认配置是旧的,从7.0 ES最新的主要版本开始,主碎片减少到1,您可以在ES官方的突破性更改公告中查看这一点。
没有人能够设计出具有最佳碎片和副本数量的完美ES索引,并且需要在一段时间内不断进行微调。影响设计考虑的一些因素。
-
读取或写入重型系统。
-
基于时间的索引(如日志搜索(,通常在最近的日志或电子商务产品目录或网站搜索中进行搜索,无法将索引划分为基于时间的数据。
-
ES集群(多租户与专用于单个索引(。
以上只是几个样本,我可以给出100个其他因素,您可以在设计ES索引配置时考虑这些因素但我们的想法是先从更关键的参数开始(比如更改主碎片需要重新索引(,并考虑近期的增长,稍后根据当前系统性能进行微调
我强烈建议你浏览我的详细博客,该博客将通过真实世界的案例研究详细回答你的问题(在一个索引中搜索更多文档,而不是在更多索引/碎片中搜索更少文档(。
上面的博客还解释了ES将长期默认的主碎片从5更改为1的决定。
回答以下问题:
问题:在mylogs-* elastic
上进行搜索时,它是否与索引平行并位于其碎片中的每个索引内?
答:是的,ES具有分布式体系结构,由于ES索引是由Lucene shard组成的,Lucene shard是一个成熟的搜索引擎,如果需要访问多个碎片(无论是同一索引还是多个索引(,每个ES查询都会由多个线程并行执行,给定线程是空闲的,否则一旦一个线程完成,它就会被用来查询另一个碎片。这就是为什么ES和其他分布式系统一样更快的原因。
默认情况下,Elasticsearch索引有5个主碎片和1个副本。但问题是,默认配置并不适合每个用例。
碎片大小对于搜索查询非常关键。如果分配给索引的碎片太多,Lucene段就会很小,这会增加开销。当同时进行多个查询时,大量的小碎片也会降低查询吞吐量。另一方面,过大的碎片会降低搜索性能,并延长故障恢复时间。因此,Elasticsearch建议一个碎片的大小应该在20到40GB左右
请记住,碎片本身就是一个独立的搜索引擎,而不是索引。索引是一种数据组织机制,允许用户以某种方式对数据进行分区。仅此而已!
有关更多详细信息,请阅读本文。