优化 Elasticsearch 索引

Posted

技术标签:

【中文标题】优化 Elasticsearch 索引【英文标题】:Optimize Elasticsearch index 【发布时间】:2016-03-17 08:57:59 【问题描述】:

由于磁盘空间不足和我的一个索引中有大量已删除文档,我需要执行优化命令(ElasticSearch 1.7)

目前,该索引具有以下统计信息:

分片:15 * 1 |文档:23,165,760 |大小:1.25TB

在优化完成之前,优化 API 会阻止任何索引/查询操作吗? 优化 API 会影响对其他索引的操作吗? 是否有可能知道大概需要多长时间?

对不起我的英语不好:)

如果您需要任何进一步的统计数据,请告诉我

【问题讨论】:

【参考方案1】:

在优化完成之前,优化 API 会阻止任何索引/查询操作吗?

不,它可以并行运行,但索引过程会影响优化。创建了新的细分市场,这些细分市场也需要优化......

优化 API 会影响对其他索引的操作吗?

不是直接,而是通过使用额外的 CPU、内存和磁盘间接地。

是否有可能知道大概需要多长时间?

不 :-),也许只能通过预先测试并推断出文档/片段的数量。

请注意,优化将需要额外的磁盘空间。如果优化到非常少的段数,则优化过程很可能最终会尝试优化一组非常大的段,这意味着它将需要额外的 (largeSegment1_size + largeSegment2_size + ....) 磁盘空间。只有当结果合并段完成时,旧段才会被删除。

另外,请查看only_expunge_deletes 选项以获取替代方案。

另一个建议是在集群负载较少时执行优化。正如我提到的,优化需要额外的 CPU、内存和磁盘空间资源。

【讨论】:

谢谢 Andrei :) 最终是否有可能阻止优化过程?也许停止索引。如果优化结束,是否有任何标志可以让我理解? 我认为不可能停止优化。您可以使用 GET /_nodes/stats/thread_pool 检查是否有活动优化并查找 optimize 部分。 看来优化已经结束了。没有释放磁盘空间。我刚刚用 kopf 插件调用了优化命令。我想没有设置任何 expunge deletes 参数。我是否必须发送命令:POST /my_index/_optimize?only_expunge_deletes=true 我认为优化 API 会释放磁盘空间,即使没有该参数 您确定在该索引中已将文档标记为已删除吗? 使用 only_expunge_deletes 参数一切正常! :) 现在我有更多可用磁盘空间 优化仍在处理中。现在,从优化统计中,我看到队列是 75,完成了 29。线程只有 1。是否可以设置更多的优化线程以更快的方式结束它?

以上是关于优化 Elasticsearch 索引的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch的基本原理与用法

优化 Elasticsearch 索引

Elasticsearch学习4-数据修改

ElasticSearch中文索引优化问题

Elasticsearch笔记九之优化

亿级规模的Elasticsearch优化实战