為什麼 Amazon OpenSearch Service 叢集中的已刪除文件指標如此之高?

上次更新日期︰2021 年 9 月 30 日

我已經刪除了 Amazon OpenSearch Service (Amazon Elasticsearch Service 的繼任者) 叢集中的文件,但我沒有看到回收任何磁碟空間。如何釋放更多磁碟空間?

簡短描述

在 OpenSearch Service 中,DeletedDocuments 指標是一個計數器,會顯示標記為要刪除的文件數量。DeletedDocuments 指標會顯示在處理刪除請求且索引區段合併到叢集中之後的增加。

OpenSearch Service 會自動使用合併政策設定執行合併 API操作。在合併期間,較小型的區段會合併成較大型的區段,以維持索引大小。標示為要刪除的文件也會被清除,以釋放額外的磁碟空間。

若要立即回收磁碟空間,您可以刪除索引,而不是刪除個別文件。或者,您也可以使用強制合併 API 以及 only_expunge_deletes 參數來清除索引內刪除的文件。

若要在回收叢集中的磁碟空間時維護索引中繼資料,請考慮下列方法:

解決方案

檢查已刪除文件的數量

若要檢查 OpenSearch Service 叢集中已刪除文件的數量,請執行叢集統計資料 API。從叢集統計資料 API 呼叫取得的值會顯示在叢集的 DeletedDocuments 指標中。輸出會傳回所有存在於叢集中的索引已刪除文件的總和。這個計數可以使用回應輸出中的「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 呼叫接著會為您叢集中存在的所有索引新增「docs.deleted」欄位:

...
"docs" : {
      "count" : 1227677521,
      "deleted" : 14
    }
…

如果您刪除 index2,叢集統計資料 API 呼叫只會計算 index1 和 index3 的值:

GET _cluster/stats
...
"docs" : {
      "count" : 1227677521,
      "deleted" : 9
    }

區段現在已合併,並清除 index2 的索引中繼資料。因此,DeletedDocuments 指標值降低到 9。

確認文件大小

若要檢查文件大小和索引計數,請使用 cat 索引 API。請確定新文件與 OpenSearch Service 叢集中現有文件的大小相同。使用相同的文件大小可確保刪除的文件不會佔用額外的磁碟空間。

清除已刪除的文件

若要手動回收磁碟空間,請執行強制合併 API 以及設定為 “true” 的 only_expunge_deletes 參數:

POST /<index-name>/_forcemerge?only_expunge_deletes=true

注意:此操作只會清除包含標記為要刪除文件的區段。

因此,強制合併會減少所使用的磁碟空間量。建立新區段後,會移除舊區段,且新區段不再包含標記為要刪除的文件。如需更多關於已刪除文件的資訊,請參閱 Elasticsearch 網站上的 Lucene 處理刪除的文件

但是,在執行強制合併操作時,請注意下列事項:

  • 只有在有足夠的可用儲存空間時,才在叢集上執行強制合併。此動作是資源密集型操作。
  • 強制合併操作會觸發 I/O 密集型處理程序,並封鎖叢集的所有新請求,直到合併完成為止。
  • 僅當沒有其他資料寫入索引時,才會針對唯讀索引呼叫強制合併操作。如果對讀取/寫入索引呼叫強制合併,則該操作可能會導致產生非常大的區段 (每區段 >5 GB)。發生這種情況時,自動合併政策不會考慮這些非常大型的區段來進行未來合併,直到區段包含大部分已刪除的文件為止。因此,磁碟使用量會增加,且搜尋效能也會惡化。

您也可以使用依查詢 API 刪除刪除 API 手動刪除叢集中的任何文件。

立即回收磁碟空間

若要立即回收磁碟空間,請使用刪除索引 API。刪除索引不會建立任何刪除標記。反之,刪除索引 API 會清除索引中繼資料,並立即回收磁碟空間。回收的磁碟空間會反映在 DeletedDocuments 指標中。

注意:刪除未使用的舊索引是最佳實務。如果您刪除作用中索引,請務必封鎖自動建立索引。如需詳細資訊,請參閱 Elasticsearch 網站上的自動建立索引