上次更新时间:2021 年 5 月 4 日
我已删除 Amazon Elasticsearch Service (Amazon ES) 集群中的文档,但未看到任何磁盘空间被回收。我如何释放更多磁盘空间?
简短描述在 Amazon ES 中,DeletedDocuments 指标是一个计数器,它显示标记为删除的文档数量。在处理删除请求并在 Elasticsearch 集群中合并索引分段之后,DeletedDocuments 指标将显示数量增加。
Amazon ES 使用合并策略设置自动运行合并 API 操作。在合并过程中,较小的分段将合并为较大的分段以保证索引大小。此外还会删除标记为删除的文档,以释放额外的磁盘空间。
要立即回收磁盘空间,您可以删除索引,而不是删除各个文档。您也可以使用强制合并 API 和 only_expunge_deletes 参数来清除索引中已删除的文档。
要在回收 Elasticsearch 集群中的磁盘空间时维护索引元数据,请考虑以下方法:
检查已删除文档的数量。 确认您的文档大小。 清除已删除的文档。 为您的 Amazon ES 域增加存储空间。 解决方法 检查已删除文档的数量要检查 Elasticsearch 集群中已删除文档的数量,请运行集群统计 API。从集群统计 API 调用获得的值将显示在 Elasticsearch 集群的 DeletedDocuments 指标中。
输出将返回 Elasticsearch 集群中所有索引的已删除文档的总和。可以使用响应输出中的“docs.deleted”字段检查此计数。
例如,如果集群具有三个索引(index1、index2 和 index3),则可以运行索引统计 API 调用:
GET index1/_stats
…
"docs" : {
"count" : 100,
"deleted" : 1
}
…
GET index2/_stats
…
"docs" : {
"count" : 100,
"deleted" : 5
}
…
GET index3/_stats
…
"docs" : {
"count" : 100,
"deleted" : 8
}
…
然后,集群统计 API 调用会为 Elasticsearch 集群中的所有索引添加“docs.deleted”字段:
…
"docs" : {
"count" : 1227677521,
"deleted" : 14
}
…
如果删除 index2,则集群统计 API 调用将仅计算 index1 和 index3 的值:
GET _cluster/stats
…
"docs" : {
"count" : 1227677521,
"deleted" : 9
}
现在,将合并这些分段,并删除 index2 的索引元数据。因此,
DeletedDocuments 指标值将降至 9。
确认您的文档大小
要检查文档大小和索引计数,请使用 cat 索引 API。确保新文档的大小与 Elasticsearch 集群中现有文档的大小相同。使用相同的文档大小可确保已删除的文档不会占用额外的磁盘空间。
清除已删除的文档要手动回收磁盘空间,请运行强制合并 API 并将 only_expunge_deletes 参数设置为“true”:
POST /<index-name>/_forcemerge?only_expunge_deletes=true
执行强制合并时,旧分段将合并到新分段中,并且 Amazon ES 会自动清除任何已删除的文档。结果,强制合并将减少使用的磁盘空间量。创建新分段后,旧分段将被移除。
减少 Elasticsearch 集群中的文档数量要手动回收磁盘空间,请运行强制合并 API 并将 only_expunge_deletes 参数设置为“true”。例如:
POST /<index-name>/_forcemerge?only_expunge_deletes=true
注意:此语法仅会清除包含已删除文档的分段。
运行强制合并时,磁盘空间的使用量通常会减少。创建新分段后,旧分段将被移除,新分段将不再包含已删除的文档。有关已删除文档的更多信息,请参阅 Elasticsearch 网站上的 Lucene's handling of deleted documents。
但是,在执行 强制合并 操作时,请注意以下几点:
仅当有足够的可用存储空间时,才对 Elasticsearch 集群执行强制合并。此操作属于资源密集型操作。 强制合并操作将触发一个 I/O 密集型进程,并阻止对集群的所有新请求,直到合并完成。 仅当没有其他数据写入索引时,才对只读索引调用强制合并操作。如果针对读/写索引调用强制合并,则该操作会导致生成非常大的分段(每个分段大于 5GB)。发生这种情况时,自动合并策略不会考虑在未来合并这些非常大的分段,除非这些分段主要由已删除的文档组成。因此,磁盘使用量会增加,并且搜索性能会下降。您还可以使用按查询删除 API 或删除 API 来手动删除 Elasticsearch 集群中的任何文档。
立即回收磁盘空间要立即回收磁盘空间,请使用删除索引 API。删除索引不会创建任何删除标记。相反,删除索引 API 会清除索引元数据,并立即回收磁盘空间。回收的磁盘空间将反映在 DeletedDocuments 指标中。
注意:建议删除未使用的旧索引。如果删除活动索引,请确保阻止自动创建索引。有关更多信息,请参阅 Elasticsearch 网站上的自动创建索引。