【问题标题】:elasticsearch: how to free store size after deleting documentselasticsearch:删除文档后如何释放存储大小
【发布时间】:2022-01-25 04:35:55
【问题描述】:

在我的弹性搜索服务器上: 文件总数:300万,总大小:3.6G 然后,我删除了大约 280 万份文档: 文件总数:约13万,总大小:3.6G

我已经删除了文档,我应该如何释放文档的大小?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    删除文档只会将它们标记为已删除,因此它们不会被搜索。要回收磁盘空间,您必须优化索引:

    curl -XPOST 'http://localhost:9200/_optimize?only_expunge_deletes=true'
    

    文档:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-optimize.html

    文档已移至: https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-forcemerge.html

    更新

    从 Elasticsearch 2.1.x 开始,optimize is deprecated in favor of forcemerge。 API 是 the same,只有端点发生了变化。

    curl -XPOST 'http://localhost:9200/_forcemerge?only_expunge_deletes=true'
    

    【讨论】:

    • 克努特的回答是正确的。这里有一篇文章更详细地说明了为什么会这样:found.no/foundation/elasticsearch-from-the-bottom-up
    • 你们俩都很有帮助。非常感谢!
    • 我同意,这是一个很好的答案,但是您需要多少空间才能删除已删除的文件?我正在运行上述命令,目前(仍在运行)索引增加了 10 Gig。
    • 索引被分成几个段。优化将合并这些段,同时在过程中删除已删除的文档。索引数据在合并期间被复制,这就是增加的来源。在最坏的情况下合并需要 2 倍于当前索引大小的合并过程,而且如此大的合并很可能需要几个小时。
    【解决方案2】:

    在当前的elasticsearch版本(7.5)中,

    1. 优化所有索引:

      POST /_forcemerge?only_expunge_deletes=true

    2. 优化单个索引

      POST /twitter/_forcemerge?only_expunge_deletes=true,其中 twitter 是索引

    3. 优化多个指标

      POST /twitter,facebook/_forcemerge?only_expunge_deletes=true ,其中 twitter 和 facebook 是索引

    参考:https://www.elastic.co/guide/en/elasticsearch/reference/7.5/indices-forcemerge.html#indices-forcemerge

    【讨论】:

      【解决方案3】:

      knutwalker 的回答是正确的。但是,如果您使用 AWS ElasticSearch 并想释放存储空间,这将不太奏效。

      在 AWS 上,必须在 URL 中指定要合并的索引。它可以包含通配符,这在索引轮换中很常见。

      curl -XPOST 'https://something.es.amazonaws.com/index-*/_forcemerge?only_expunge_deletes=true'
      

      AWS 发布 a list of ElasticSearch API differences

      【讨论】:

        【解决方案4】:

        我只想指出,Force Merge API 的 7.15 文档包含此警告:

        仅在完成写入索引后才应针对索引调用强制合并。强制合并可能会导致生成非常大 (>5GB) 的段,如果您继续写入此类一个索引,那么自动合并策略将永远不会考虑这些段以进行未来的合并,直到它们主要由已删除的文档组成。这可能会导致非常大的段保留在索引中,从而导致磁盘使用量增加和搜索性能变差。

        所以你应该在开始之前关闭对索引的写入。

        【讨论】:

          【解决方案5】:

          将 indexname 替换为您的。它会立即释放空间

          curl -XPOST 'http://localhost:9200/indexname/_forcemerge' -d 
          '{"only_expunge_deletes": false, "max_num_segments": 1 }'
          
          

          【讨论】:

          • 如果您对答案投了反对票,请始终添加评论为什么解决方案是错误的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多