ElasticSearch-分片如何影响索引性能?

时间:2018-11-08 19:13:01

标签: elasticsearch

我正在对ElasticSearch的单节点集群进行一些基准测试。

我面对这样的情况,更多的碎片将减少 索引性能-至少在单个节点中-(时延和吞吐量)

这些是我的一些号码:

  • 以1个分片索引,它每分钟索引+ 6K文档
  • 具有5个分片的索引,它每分钟索引+ 3K文档
  • 具有20个分片的索引,它每分钟索引+ 1K文档

使用批量API的结果相同。所以我想知道这是什么关系,为什么会这样?

注意:我没有资源问题!资源是免费的(CPU和内存)

2 个答案:

答案 0 :(得分:6)

只需让您进入同一页面:

您的数据按索引组织,每个索引由分片组成,并分布在多个节点上。如果需要为新文档建立索引,则将生成新的ID,并根据该ID计算目标分片。之后,将写操作委派给该节点,该节点保存了计算出的目标分片。这样可以将文档很好地分布在所有分片上。

通过id查找文档现在很容易,因为包含所需文档的分片可以仅基于id进行计算。无需搜索所有分片。顺便说一句,这就是为什么您以后不能更改分片数量的原因。更改的分片编号将导致不同的分片文档分布。

现在,为了清楚起见,每个分片都是一个单独的Lucene索引,由位于磁盘上的段文件组成。编写时,将创建新的段。如果将达到特定数量的段文件,则将合并这些段。 因此,仅引入更多的分片而不将其分配给其他节点,只会为单个节点引入更高的I / O和内存消耗。 搜索时,将对每个分片执行查询。之后,所有分片的结果都需要合并为一个结果-更多分片,需要执行更多的cpu工作...

回到您的问题:

对于只有一个节点的写重索引情况,索引和分片的最佳数量是1! 但是对于搜索情况(不按ID进行访问),每个节点的最佳分片数是可用的CPU数。这样,可以在多个线程中进行搜索,从而提高搜索性能。

但是分片有什么好处?

  1. 可用性:通过将分片复制到其他节点,即使不再能够访问某些节点,您仍然可以使用!

  2. 性能:将主分片分配到不同的节点,也将分配工作量。

因此,如果您的方案写得很重,请使每个索引的分片数量保持低水平。如果需要更好的搜索性能,请增加分片的数量,但要牢记“物理”。如果需要可靠性,请考虑节​​点/副本的数量。

更多读数:

https://www.elastic.co/guide/en/elasticsearch/reference/current/_basic_concepts.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-search-speed.html

https://www.elastic.co/de/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster

https://thoughts.t37.net/designing-the-perfect-elasticsearch-cluster-the-almost-definitive-guide-e614eabc1a87

答案 1 :(得分:0)

<块引用>

我遇到过分片越多会减少索引的情况 性能 - 至少在单个节点中 - (在延迟和 吞吐量)

供参考:Elasticsearch 是一个分布式数据库。数据存储在一个“索引”中,索引被拆分为“分片”。每个“分片”都分配在一个节点上(如果可能,可以使用不同的节点)。

拥有更多分片可以使用更多机器。这就是“分布式数据库”中“分布式”的实际工作方式。 Elasticsearch 会在后台自动分配和移动分片,以平衡所有机器的磁盘使用情况。

  • 使用 1 个分片,数据被拆分到一个节点,这为您提供了每秒 N 次读取和 M 次写入的基线。

  • 使用 3 个分片,数据被拆分到三个节点上,这为您提供了 3 倍的吞吐量

当然这假设有 3 台机器可用。如果只有一台机器,那么机器会以任何一种方式进行所有处理,并且有更多的分片没有任何影响。

分片有一些开销,必须分发查询并合并返回结果,因此分片数量翻倍并不会完全使性能翻倍(预计为 +90%)。

您的集群只有一台机器。增加分片数量会降低性能,因为它只会增加开销。

附言分片默认有一个副本,如果主节点消失(机器故障),副本将接管,这就是弹性的工作原理。一个有 5 个分片和 5 个副本的索引可以充分利用 10 个节点。这意味着使用许多节点只需要很少的分片。

P.P.S 根据我的经验,shard=5 的配置是最大的。除非使用大型集群(10 多台机器)或 TB 级索引,否则您不应设置更多。