Amazon Elasticsearch Service クラスターで削除されたドキュメントのメトリックが非常に高いのはなぜですか?

最終更新日: 2020 年 7 月 14 日

Amazon Elasticsearch Service (Amazon ES) クラスターでドキュメントを削除しましたが、ディスク容量が解放されません。ディスク空き容量を増やすにはどうすればよいですか?

簡単な説明

Amazon ES では、DeletedDocuments メトリクスは、削除対象としてマークされたドキュメントの数を示すカウンターです。メトリクスは、削除リクエストが処理され、インデックスセグメントが Elasticsearch クラスター内でマージされた後の増加を示します。

ルーチンクリーンアップ中、Amazon ES は自動的に強制マージ操作を実行します。強制マージ中、既存のセグメントは新しいセグメントにマージされ、新しいリクエストによって書き込まれます。強制マージによって削除されたドキュメントは消去されませんが、アクションは Elasticsearch クラスター内のインデックスセグメントの数を減らすことでディスク使用容量を節約します。

Elasticsearch クラスターのディスク容量を解放しつつ、インデックスメタデータを維持するには、次のアプローチを検討してください。

ディスク容量を直ちに解放するには、個々のドキュメントを削除する代わりにインデックスを削除することもできます。インデックスを削除しても、削除マーカーは作成されません。そのため、ディスク容量は直ちに解放されます。

解決方法

削除されたドキュメントの数を確認する

Elasticsearch クラスターで削除されたドキュメントの数を確認するには、クラスター統計 API を実行します。クラスター統計 API 呼び出しから取得した値は、Elasticsearch クラスターの DeletedDocuments メトリクスに表示されます。

出力は、Elasticsearch クラスターに存在するすべてのインデックスについて、削除されたドキュメントの合計を返します。この数は、レスポンス出力の「docs.deleted」フィールドを使用して確認できます。

たとえば、クラスターに 3 つのインデックス (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 indices API を使用します。新しいドキュメントが Elasticsearch クラスターの既存のドキュメントと同じサイズであることを確認します。同じドキュメントサイズを使用すると、削除されたドキュメントが余計なディスク容量を占有しないようにできます。代わりに、Amazon ES はバックグラウンドでディスク容量を解放し、セグメントをマージして、削除されたドキュメントを自動的に消去します。

削除されたドキュメントを消去する

手動でディスク容量を解放するには、only_expunge_deletes パラメータを「true」に設定して force merge API を実行します。

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

強制マージを実行すると、古いセグメントは新しいセグメントにマージされ、Amazon ES は削除されたドキュメントを自動的に消去します。その結果、強制マージによってディスク使用容量が減少します。新しいセグメントが作成されると、古いセグメントが削除されます。詳細については、Elasticsearch ウェブサイトの Lucene's handling of deleted documents を参照してください。

Elasticsearch クラスター内のドキュメント数を減らす

Elasticsearch クラスター内のドキュメントの数を減らすには (書き込みオペレーションを無効にせずに)、単独で強制マージを使用します。ただし、以下の点に注意してください。

  • 十分な空きストレージ容量がある場合にのみ、Elasticsearch クラスターで強制マージを実行します。アクションは、リソースを大量に使用するオペレーションです。
  • 強制マージオペレーションは、I/O 集約型のプロセスをトリガーし、マージが完了するまでクラスターへのすべての新しいリクエストをブロックします。
  • 強制マージ操作は、インデックスに追加データが書き込まれていない場合にのみ、読み取り専用インデックスに対して呼び出す必要があります。読み取り/書き込みインデックスに対して強制マージが呼び出された場合、アクションによって非常に大きなセグメントが生成される場合があります (セグメントあたり 5 GB 超)。その後、自動マージポリシーでは、セグメントの大部分が削除されたドキュメントで構成されるまで、これらのセグメントは将来のマージの対象にはなりません。その結果、ディスク使用量が増加し、検索パフォーマンスが低下します。

また、delete by query API または delete API を使用して、Elasticsearch クラスター内のドキュメントを手動で削除することもできます。

ディスク容量を直ちに解放する

直ちにディスク容量を解放するには、delete index API を使用します。これにより、既存のインデックスが削除され、ディスク容量が解放されます。

注意: 使用されていない古いインデックスを削除することをお勧めします。アクティブなインデックスを削除する場合は、インデックスの自動作成をブロックしてください。詳細については、Elasticsearch ウェブサイトの Create indices automatically を参照してください。