参考答案
Q:ElasticSearch 分片如何影响索引性能?
我们要对 ElasticSearch 的单节点集群进行一些基准测试。
现在的情况是:
没有资源问题,资源是免费的(CPU和内存),更多的分片将至少在单个节点中降低索引性能(延迟和吞吐量)
这是一些数字:
- 使用1个分片进行索引,每分钟索引+ 6K文档
- 索引5个分片,每分钟索引+ 3K文档
- 索引20个分片,每分钟索引+ 1K文档
使用批量 API 的结果相同。
我想知道,这是什么关系,为什么会这样呢?
只是为了位于同一页面上。
数据按索引组织,每个索引由分片组成,并分布在多个节点上。
如果需要为新文档建立索引,则将生成新的ID,并根据该ID计算目标分片。
之后,将写操作委派给该节点,该节点保存计算出的目标分片。这样,就可以将文档很好地分布在所有分片上。
现在,通过id查找文档非常容易,因为包含所需文档的分片可以仅基于id进行计算,不需要搜索所有碎片。
顺便说一句,这就是为什么以后不能更改分片数量的原因,更改的分片编号,将导致整个分片上的文档分布不同。
为了清楚起见,每个分片都是一个单独的Lucene索引,由位于磁盘上的段文件组成,编写时,将创建新的段。如果将达到特定数量的段文件,则将合并这些段。
因此,仅引入更多的分片而不将它们分配给其他节点,只会为单个节点引入更高的 I/O 和内存消耗。搜索时,将针对每个分片执行查询。之后,所有分片的结果需要合并为一个结果-更多分片,更多的 cpu 工作要做…
ElasticSearch 分片如何影响索引性能?
对于写重索引情况,只有一个节点,索引和分片的最佳数量为 1 。
但是,对于搜索情况(不按ID进行访问),每个节点的最佳分片数是可用的CPU数。
这样,就可以在多个线程中进行搜索,从而获得更好的搜索性能。
分片的好处是什么呢?
- 可用性:通过将分片复制到其他节点,即使不再能够访问某些节点,我们仍然可以使用。
- 性能:将主分片分发到不同的节点,也将分配工作负载。
因此,如果方案写的很繁琐,就要让每个索引的分片数量保持较低。如果需要更好的搜索性能,就要增加分片的数量;如果需要可靠性,请考虑节点/副本的数量。
以上,是 Elasticsearch 搜索面试题【ElasticSearch 分片如何影响索引性能?】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—