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

最終更新日: 2020 年 3 月 10 日

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

簡単な説明

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

ベストプラクティスとしては、他の考えられる原因のトラブルシューティングを試みる前に、シャード数とシャード割り当てを確認します。

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

解決方法

シャード数が多すぎてノードが足りない

Amazon ES によってシャードが移行されるのは、スナップショットの復元、ドメイン設定の変更、レプリケーションレベルの変更、ノードの障害、ノードの起動のときです。シャード数が不均等の場合 (使用可能なノードに対して)、クラスターに他の問題が発生する可能性があります。シャード数を均等に分散するのに十分なノードがない場合は、シャードは「未割り当て」状態のままになります。これにより、移行速度が遅くなるか、クラスターが「処理中」状態でスタックする場合があります。

解決方法の 1 つとして、クラスター内のシャード数を減らすという方法があります。適切なシャード数の指定の詳細については、シャード数の選択を参照してください。

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

$ 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.    設定更新を再実行します。設定変更の詳細は、設定変更についてを参照してください。