我正在 ElasticSearch 的单节点集群上做一些基准测试。
我面临的情况是更多的分片会减少 索引性能 - 至少在单个节点中 - (延迟和吞吐量)
这些是我的一些数字:
- 使用 1 个分片建立索引,每分钟索引 +6K 文档
- 使用 5 个分片建立索引,每分钟索引 +3K 文档
- 索引 20 个分片,每分钟索引 +1K 文档
我使用批量 API 得到了相同的结果。所以我想知道这之间有什么关系,为什么会这样?
注意:我没有资源问题!资源免费(CPU & 内存)
最佳答案
只是为了让您在同一页面上:
您的数据按索引组织,每个索引由分片组成并分布在多个节点上。如果需要对新文档进行索引,则会生成新的 id,并根据此 id 计算目标分片。之后,写入被委托(delegate)给持有计算出的目标分片的节点。这会将您的文档很好地分布在您的所有分片中。
现在通过 id 查找文档很容易,因为包含所需文档的分片可以仅根据 id 进行计算。无需搜索所有分片。顺便说一句,这就是您之后无法更改分片数量的原因。更改的分片编号将导致您的分片中的文档分布不同。
现在,澄清一下,每个分片都是一个单独的 lucene 索引,由磁盘上的段文件组成。写入时,将创建新的段。如果将达到特定数量的段文件,则将合并这些段。 因此,仅仅引入更多分片而不将它们分发到其他节点只会为您的单个节点引入更高的 I/O 和内存消耗。 搜索时,查询将针对每个分片执行。之后所有分片的结果需要合并为一个结果——更多的分片,更多的 CPU 工作要做...
回到您的问题:
对于您编写大量索引的情况,只有一个节点,索引和分片的最佳数量是 1!
但对于搜索情况(不是通过 id 访问),每个节点的最佳分片数量是可用的 CPU 数量。这样,可以在多线程中进行搜索,从而获得更好的搜索性能。更正:搜索和索引是多线程的,单个分片可以充分利用一个节点的所有CPU核心。
但是分片有什么好处呢?
可用性:通过将分片复制到其他节点,如果您的某些节点无法再访问,您仍然可以提供服务!
性能:将主分片分布到不同的节点,也会分散工作负载。
因此,如果您的场景写入量很大,请将每个索引的分片数量保持在较低水平。如果您需要更好的搜索性能,请增加分片数量,但请记住“物理”。如果您需要可靠性,请考虑节点/副本的数量。
进一步阅读:
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
关于ElasticSearch - 分片如何影响索引性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53214628/