elasticsearch Amazon Elasticsearch-并发批量请求,elasticsearch,bulkinsert,elasticsearch,Bulkinsert" /> elasticsearch Amazon Elasticsearch-并发批量请求,elasticsearch,bulkinsert,elasticsearch,Bulkinsert" />

elasticsearch Amazon Elasticsearch-并发批量请求

elasticsearch Amazon Elasticsearch-并发批量请求,elasticsearch,bulkinsert,elasticsearch,Bulkinsert,当我通过一个批量请求向ElasticSearch添加200个文档时,速度非常快 但是我想知道是否有机会通过并发执行来加快进程:20个并发执行,每个执行10个文档 我知道这样做效率不高,但可能有机会通过并发执行来加快进程?没有直接的答案,因为这取决于很多因素。超过最佳批量请求大小时,性能不再提高,甚至可能下降。然而,最佳大小不是一个固定的数字 这完全取决于您的硬件、文档大小和复杂性以及索引和搜索负载 尝试以不断增大的大小批量索引典型文档。当性能开始下降时,批大小太大 由于您是以200个批次进行的,

当我通过一个批量请求向ElasticSearch添加200个文档时,速度非常快

但是我想知道是否有机会通过并发执行来加快进程:20个并发执行,每个执行10个文档


我知道这样做效率不高,但可能有机会通过并发执行来加快进程?

没有直接的答案,因为这取决于很多因素。超过最佳批量请求大小时,性能不再提高,甚至可能下降。然而,最佳大小不是一个固定的数字

这完全取决于您的硬件、文档大小和复杂性以及索引和搜索负载

尝试以不断增大的大小批量索引典型文档。当性能开始下降时,批大小太大


由于您是以200个批次进行的,所以很有可能这是索引的最佳方式。但这同样取决于上面提到的因素。

对于批量文档插入,较低的并发性更可取。某些并发在某些情况下是有帮助的-这取决于™ 我会参与进来的,但这不是一场重大的或自动的胜利

在Elasticsearch的写入性能方面,有很多地方可以调整。一个非常快的胜利,您应该检查:您是否使用HTTP保持活动连接?这将节省设置每个连接的大量TCP和TLS开销。只是这一更改可以大大提高性能,还可以为索引管道揭示一些有意义的体系结构注意事项

所以,看看这是怎么回事。从那里,我们应该走到底,一路向上

磁盘上的索引是Lucene。Lucene是一个分段索引。索引部分是您首先使用Elasticsearch的一个核心原因:可以在O(logn)时间内搜索已排序术语的词典。这是超快速和可扩展的。段部分是因为插入索引的速度不是特别快——根据您的实现,维护排序需要O(logn)或O(logn)

所以Lucene的诀窍是缓冲这些更新并附加一个新段;本质上是一组小型索引。搜索一些相对较少的段仍然比每次更新都要花时间维护一个排序索引快得多。随着时间的推移,Lucene负责合并这些段,使其保持在合理的大小范围内,并在过程中删除已删除和覆盖的文档

在Elasticsearch中,每个碎片都是一个独特的Lucene索引。如果您有一个带有单个分片的索引,那么拥有多个并发批量更新流的好处很小。在应用程序端,并发可能有一些好处,这取决于索引管道收集和组装每批文档所需的时间。但在Elasticsearch方面,所有这些都只是一组缓冲区被写入一个又一个数据段

切分让这更有趣一点

Elasticsearch的优势之一是能够将索引的数据划分到多个碎片上。这有助于提高可用性,并帮助工作负载扩展到单个服务器的资源之外

唉,要说并发性应该与索引中的主碎片数量相等或成比例,还不是那么简单。虽然,作为一个粗略的启发,这并不可怕

您可以看到,在内部,处理请求的第一个Elasticsearch节点将把批量请求转换为一系列单独的文档更新操作。每个文档更新都会发送到承载此文档所属的碎片的相应节点。批量操作收集响应,以便它可以在响应中将批量操作的摘要发送给客户端

因此,此时,根据文档碎片路由,在处理传入批量请求的过程中,某些碎片可能比其他碎片更繁忙。这可能有关系吗?我的直觉告诉我不是真的。这是可能的,但这是不寻常的

在我见过的大多数测试和分析中,以及在我使用Lucene十多年的经验中,索引的缓慢部分是将文档的值转换为反向索引格式。解析文本,将其分析为术语,等等,可能非常复杂且成本高昂。只要批量请求具有足够的文档,并且这些文档在碎片之间分布得足够好,那么并发性就没有在碎片和段级别上使工作饱和那么有意义

在调优批量请求时,我的建议如下

  • 使用HTTP保持活动状态。这不是可选的。(您正在使用TLS,对吗?)
  • 选择一个批量大小,其中每个请求占用的时间适中。大约1秒,可能不超过10秒
  • 如果您有足够的想象力,可以测量每个批量请求所花费的时间,并动态地增长和收缩批处理
持久队列解锁了许多功能。如果您能够获取和组装文档并将它们插入(比如)卡夫卡,那么该过程可以并行运行,以使数据库饱和,并并行化任何非规范化或文档准备。然后,一个不同的进程从队列中抽出并向服务器发送请求,通过一些轻微的协调,您可以在不同的阶段测试和调优不同的并发性。当队列有助于将集群暂时置于只读模式时,您还可以暂停各种迁移和维护任务的更新

我在整个回答中都避免了复制,因为我建议调整复制的原因只有一个。也就是说,当您批量创建一个不服务于任何生产流量的索引时。在这种情况下,它可以