elasticsearch 为什么Elasticsearch中的段合并需要停止对索引的写入,elasticsearch,merge,segment,elasticsearch,Merge,Segment" /> elasticsearch 为什么Elasticsearch中的段合并需要停止对索引的写入,elasticsearch,merge,segment,elasticsearch,Merge,Segment" />

elasticsearch 为什么Elasticsearch中的段合并需要停止对索引的写入

elasticsearch 为什么Elasticsearch中的段合并需要停止对索引的写入,elasticsearch,merge,segment,elasticsearch,Merge,Segment,我希望在ES最新版本中运行优化(ES 1.X),它现在被称为forcemerge API。在读了一些像和的文章之后。似乎我们应该只在只读索引上运行它,引用官方ES文档: 应仅针对只读索引调用强制合并。跑步 对读写索引强制合并可能会导致非常大的段 待生产(每段大于5Gb) 但我不明白为什么 在运行forcemerge或Optimization API之前将索引置于只读模式的原因 正如上面的ES文档中所解释的,它可能会导致非常大的段,而这种情况不应该发生,因为我了解的是,新的更新首先写入内存中,在刷

我希望在ES最新版本中运行优化(ES 1.X),它现在被称为forcemerge API。在读了一些像和的文章之后。似乎我们应该只在只读索引上运行它,引用官方ES文档:

应仅针对只读索引调用强制合并。跑步 对读写索引强制合并可能会导致非常大的段 待生产(每段大于5Gb)

但我不明白为什么

  • 在运行forcemerge或Optimization API之前将索引置于只读模式的原因
  • 正如上面的ES文档中所解释的,它可能会导致非常大的段,而这种情况不应该发生,因为我了解的是,新的更新首先写入内存中,在刷新发生时写入到段中,那么为什么在forcemerge期间进行写入会产生非常大的段呢
  • 另外,如果我们不想将索引置于只读模式,并且仍然运行强制合并来删除,那么还有任何解决方法


    如果需要提供任何其他信息,请告诉我。

    forcemerge
    可以显著提高查询的性能,因为它允许您将现有数量的段合并为更小数量的段,这样在按顺序搜索段时查询效率更高。合并时,所有标记为删除的文档也会被清除

    作为Elasticsearch基于合并策略的内务管理的一部分,合并在后台定期自动进行

    棘手的是:合并策略只考虑最大为5GB的段。将forcemerge API与允许您指定结果段数量的参数一起使用,可能会导致结果段大于5GB,这意味着将来的合并请求将不再考虑这些段。只要您不删除或更新文档,这并没有错。但是,如果您继续删除或更新文档,Lucene会将现有段中文档的旧版本标记为已删除,并将文档的新版本写入新段。如果您删除的文档位于大于5GB的段中,则不会对其进行更多的整理,即标记为删除的文档将永远不会被清理

    通过在执行强制合并之前将索引设置为只读,可以确保不会出现包含大量遗留文档的巨大段,这些段会消耗内存和磁盘中的宝贵资源,并降低查询速度


    refresh
    做了一些不同的事情:在写入磁盘之前,首先在内存中处理要编制索引的文档是正确的。但允许您实际查找文档的数据结构(“段”)不会立即为每个文档创建段,因为这将非常低效。仅当内部缓冲区满时,或当发生
    刷新时,才会创建段。通过触发刷新,您可以立即查找文档。但段最初仍然只存在于内存中,同样,它将e在创建每个数据段后立即将其同步到磁盘的效率极低。内存中的数据段会定期同步到磁盘。即使在同步到磁盘之前拔掉插头,也不会丢失任何信息,因为Elasticsearch维护一个translog,允许Elasticsearch“重播”“所有尚未写入磁盘段的索引请求。

    感谢您的精彩解释,在多个博客中都找不到这条有价值的信息。很高兴听到我的回答很有用。我在其中添加了一条关于“刷新”的评论。您能详细说明一下您的意思吗?”“通过在执行强制合并之前将索引设置为只读,可以确保最终不会出现包含大量遗留文档的大型段”。我假设设置为只读等同于“不再写入索引”,因为我不明白索引是否为“只读”有何关系“除了确保它永远不会被写入之外。可能如果你在以后撤消readonly,你仍然会有同样的问题。@Dylon:我的回答应该更准确一些。这句话意味着只要索引设置为readonly,就不会发生“更新”和“删除”。“更新”与添加文档和删除文档是一样的)。一个“删除”操作只是将一个文档标记为已删除,所以它仍然存在。只有在后续的合并操作中,此“遗留”文档才会被物理擦除。如果您运气不好,并且您的段大于5 GB,则不会触及该段,并且您的“遗留”文档可能永远不会被删除。