Amazon Elasticsearch Service (Amazon ES) ドメインが「処理中」状態でスタックするのはなぜですか?

最終更新日: 2020 年 8 月 21 日

Amazon Elasticsearch Service (Amazon ES) ドメインの設定を変更しましたが、「処理中」状態でスタックしました。解決方法を教えてください。ドメインがスタックしているのはなぜですか? また、再びスタックしないようにするにはどうすればよいですか?

簡単な説明

Amazon ES ドメインが、いくつかの原因により「処理中」状態でスタックすることがあります。

  • クラスターノードの障害
  • ノードの不均等な分布
  • シャードの再割り当て (index.routing.allocation.require パラメータを使用)
  • CPU 使用率が高い
  • JVM メモリの負荷 (大量のクエリ負荷、ディスクの問題、ノードの障害による)
  • スタックしたスナップショット

Amazon ES ドメインで追加のトラブルシューティングを実行する前に、シャードとシャード割り当ての数を確認することをお勧めします。

シャードの再割り当てと要求されるパラメータの更新の詳細については、Elasticsearch ウェブサイトの Index-level shard allocation filtering を参照してください。

解決方法

ノードの不均等な分布

Amazon ES によってシャードが移行されるのは、スナップショットの復元、ドメイン設定の変更、レプリケーションレベルの変更、ノードの障害、ノードの起動のときです。ブルー/グリーンデプロイ中にクラスター上にあるシャードの数が多すぎると、シャードの移行プロセスが遅くなる可能性があります。また、CPU 使用率が高くなり、JVM メモリ負荷が高くなると、移行プロセスが遅くなり、クラスターが「処理中」状態でスタックする可能性があります。その結果、十分なノードが複数のシャードにわたって均等に分散されていない場合、シャードは「未割り当て」になります。ブルー/グリーンデプロイの詳細については、設定の変更を参照してください。

Elasticsearch クラスターが「処理中」の状態でスタックする場合は、クラスター内のシャードの数を減らすことを検討してください。適切なシャード数の指定の詳細については、シャード数の選択を参照してください。

シャードが移行中であるかどうかを確認するには、次のコマンド構文を入力します。

$ curl -XGET "ES_Endpoint/_cat/recovery?v&active_only"

注意: 数分待ってから、上記のコマンドを再度実行してください。出力に変更がある場合でも、シャードは引き続き移行されます。

次に、各データノードに割り当てられているシャード数と、使用中のディスク容量を確認します。

$ curl -XGET ES_Endpoint/_cat/allocation?v

注意: このコマンド構文により、クラスターノードがディスク使用率の高さ、または JVM メモリ負荷のどちらが原因で失敗したかも表示されます。

未割り当てのシャード

クラスター内のシャード数とインデックス数を確認するには、次の構文を使用します。

$ curl -XGET ES_Endpoint/_cat/indices
$ curl -XGET ES_Endpoint/_cat/shards

未割り当てのシャードを特定したら、ドメイン内の不要なシャードの数を最小限にします。シャード数計算の詳細については、Amazon Elasticsearch Service をはじめよう: シャード数の算出方法をご覧ください。

クラスター内のシャード数を減らす

クラスター内のシャード数を減らしてオーバーヘッドを削減するには、古いインデックスをすべて削除します。

$ curl -XDELETE ES_Endpoint/oldindex1,oldindex2

インデックスのローテーションが設定されている場合は、ローテーションごとに新しいシャードセットが作成されます。デフォルトでは、Amazon ES でインデックスごとに 5 つのプライマリシャードが作成され、すべてのプライマリシャードに 1 つのレプリカシャードが作成されます。このインデックスのローテーションにより、最終的にリーダーノードがオーバーロード状態になる可能性があります。オーバーロードを回避し、将来のシャードの増加を制御するには、インデックスのローテーション戦略を変更するか、インデックステンプレートを使用することを検討してください。

注意: シャード数は、インデックス作成時、またはデータのインデックスの再作成時にのみ指定できます。ドキュメントのインデックスを作成する前に、シャード数を選択します。

新しいインデックスでシャード数を指定するには、次のコマンドを実行します。

$ curl -XPUT ES_Endpoint/index-name -H 'Content-Type: application/ json' -d'
{
      "settings": {
            "index": {
                    "number_of_shards": 3,
                    "number_of_replicas": 1                   
       }        
}'

注意: Amazon ES では、既存のインデックスのプライマリシャード数は変更できません。Amazon ES でのデータのインデックス作成の詳細については、インデックス作成の概要を参照してください。

既存のインデックスを再構築するには、以下のタスクを実行します。

1.    新しいインデックステンプレートを作成して定義します。次の構文では、クラスターで作成される新しいシャードの数が指定されます。

$ curl -XPUT ES_Endpoint/_template/template_1 -H 'Content-Type: application/json' -d'
{
      "index_patterns": ["*"],
      "settings": {
            "number_of_shards": 3,
            "number_of_replicas": 1     
      }
}'

2.    _reindex API オペレーション (Amazon ES バージョン 5.1 以降) を呼び出して、再度インデックス作成します。次の構文では、インデックステンプレートの新しいシャード数が指定され、新しいインデックスにデータが移動されます。

$ curl -XPOST ES_Endpoint/_reindex -H 'Content-Type: application/json' -d '
{
      "source": {   
            "index": "old_index"
      },
      "dest": {
            "index": "new_index"
      }   
}'

重要: アクセスポリシーに AWS Identity and Access Management (IAM) のユーザーまたはロールが含まれている場合は、Amazon Elasticsearch Service API への HTTP リクエストに署名する必要があります。

3.    新しいインデックスと古いインデックスのドキュメント数が同じであることを確認します。

$ curl -XGET ES_Endpoint/_cat/indices/old_index,new_index?v

4.    新しいインデックスと古いインデックスのドキュメント数が同じであれば、古いインデックスは削除できます。

$ curl -XDELETE ES_Endpoint/old_index

5.    設定更新を再実行します。設定変更の詳細については、設定変更についてを参照してください。