Alibaba Cloud Elasticsearch クラスターの負荷の不均衡は、いくつかの原因によって発生する可能性があります。これらの原因には、不適切なシャード設定、不均一なセグメントサイズ、ホットデータとコールドデータの分離不足、およびサービスロードバランサー(SLB)インスタンスまたはマルチゾーンアーキテクチャに使用される永続的な接続が含まれます。このトピックでは、Elasticsearch クラスターの負荷の不均衡の分析と解決策について説明します。
問題の説明
ディスク使用量はノード間で類似していますが、NodeCPUUtilization または NodeLoad_1m メトリックの値は、負荷の不均衡を示しています。
ディスク使用量はノード間で大きく異なり、NodeCPUUtilization または NodeLoad_1m メトリックの値は、負荷の不均衡を示しています。
原因
- 重要
ほとんどの場合、負荷の不均衡は不適切なシャード割り当てが原因です。最初にシャード割り当てを確認することをお勧めします。
セグメントサイズが不均一です。
ホットデータとコールドデータがノード上で分離されていません。
重要たとえば、クエリでルーティングパラメーターを指定したり、ホットデータをクエリしたりします。この場合、負荷の不均衡が発生します。
SLB インスタンスとマルチゾーンアーキテクチャに永続的な接続が使用されています。この場合、トラフィックがノードに不均一に分散される可能性があります。ただし、これはめったに発生しません。詳細については、マルチゾーンアーキテクチャをご参照ください。
他の理由で負荷の不均衡が発生した場合は、Alibaba Cloud のテクニカルサポートエンジニアに連絡して問題のトラブルシューティングを行ってください。
不適切なシャード割り当て
シナリオ
A 社は Alibaba Cloud Elasticsearch クラスターを購入しました。クラスターには 3 つの専用マスターノードと 9 つのデータノードが含まれています。各専用マスターノードは 16 個の vCPU と 32 GiB のメモリを提供します。各データノードは 32 個の vCPU と 64 GiB のメモリを提供します。主要なデータは test インデックスに格納されます。ピーク時(16:21~18:00)には、読み取りパフォーマンスは約 2,000 QPS、書き込みパフォーマンスは 1,000 QPS で、コールドデータとホットデータの両方がクエリされます。さらに、2 つのノードの CPU 使用率が 100% に達し、Elasticsearch サービスに影響を与えています。
分析
ネットワークと Elastic Compute Service(ECS)インスタンスを確認します。ECS インスタンスが正常な場合は、ネットワーク監視データを表示します。
ネットワーク監視データは、ネットワークリクエストの数とクエリ QPS がピーク時に増加することを示しています。さらに、関連ノードの CPU 使用率が大幅に増加します。上記の情報を基に、負荷の高いノードは主にクエリリクエストの処理に使用されていると結論付けることができます。
GET _cat/shards?v
コマンドを実行して、インデックスのシャードをクエリします。 // シャードの情報を取得するために使用しますコマンド出力は、シャードがノードに均等に割り当てられていないことを示しています。text インデックスのシャードは、主に負荷の高いノードに割り当てられています。さらに、ディスク使用量の監視データは、負荷の高いノードのディスク使用量が他のノードよりも大きいことを示しています。シャードの不均一な割り当てが不均一なストレージにつながると結論付けることができます。データをクエリまたは書き込む場合、ストレージ容量の大きいノードが主要なクエリおよび書き込みワークロードを処理します。
GET _cat/indices?v
コマンドを実行して、インデックスの情報をクエリします。 // インデックスの情報を取得するために使用しますコマンド出力は、インデックスに 5 つのプライマリシャードと各プライマリシャードに 1 つのレプリカシャードがあることを示しています。さらに、クラスター構成は、シャードが均等に割り当てられておらず、特定のドキュメントが削除されていることを示しています。Elasticsearch がデータを検索する場合、.del でマークされたドキュメントも検索およびフィルタリングします。これは追加のリソースを消費し、検索効率を大幅に低下させます。オフピーク時に force merge 操作を呼び出すことをお勧めします。
クラスターログと低速検索ログを表示します。
ログは、クエリがすべて通常の term クエリであり、クラスターログはエラーが発生していないことを示しています。したがって、Elasticsearch クラスターは、エラーや CPU リソースを消費するクエリステートメントに遭遇していません。
まとめ
上記の分析は、不均一な CPU 使用率の主な原因は不均一なシャード割り当てであることを示しています。インデックスのシャードを再割り当てする必要があります。プライマリシャードとレプリカシャードの合計数がクラスター内のデータノード数の倍数であることを確認してください。最適化後、CPU 使用率はノード間で大きく異なりません。次の図は CPU 使用率を示しています。
解決策
インデックスを作成する前に、シャードを適切に計画します。詳細については、シャード評価ガイドラインをご参照ください。
シャード評価ガイドライン
シャードの数と各シャードのサイズは、Elasticsearch クラスターの安定性とパフォーマンスを決定します。ビジネスシナリオを定義することが難しい場合に、多数のシャードがクラスターのパフォーマンスに影響を与えないように、Elasticsearch クラスターの各インデックスのシャードを適切に計画する必要があります。このセクションでは、次のガイドラインを提供します。
Elasticsearch V7.X より前のバージョンでは、1 つのインデックスにデフォルトで 5 つのプライマリシャードと各プライマリシャードに 1 つのレプリカシャードがあります。Elasticsearch V7.X 以降では、1 つのインデックスにデフォルトで 1 つのプライマリシャードと 1 つのレプリカシャードがあります。
低スペックのノードの場合、各シャードのサイズは 30 GB 以下です。高スペックのノードの場合、各シャードのサイズは 50 GB 以下です。
ログ分析シナリオまたは非常に大きなインデックスの場合、各シャードのサイズは 100 GB 以下です。
プライマリシャードとレプリカシャードの合計数は、データノードの数と同じか、その倍数です。
説明プライマリシャードを多く構成するほど、Elasticsearch クラスターで発生するパフォーマンスオーバーヘッドが増加します。
単一ノードのシャード数は、メモリサイズ×30に基づいて決定することをお勧めします。多数のシャードが計画されている場合、ファイルハンドルの枯渇が発生しやすく、クラスター障害につながる可能性があります。
ノードのインデックスには最大 5 つのプライマリシャードを構成することをお勧めします。
クラスターで自動インデックス作成機能を有効にしている場合は、シナリオベースの構成機能を使用してシャード構成を変更できます。シャードが均等に割り当てられていることを確認してください。詳細については、シナリオベースのテンプレートを使用してクラスターの構成を変更するをご参照ください。
不均一なセグメントサイズ
シナリオ
A 社の Elasticsearch クラスター内の 1 つのノードで、CPU 使用率が急激に増加しています。これはクエリのパフォーマンスに影響を与えます。クエリは主に test インデックスに対して実行されます。インデックスには 3 つのプライマリシャードと各プライマリシャードに 1 つのレプリカシャードがあります。シャードはノードに均等に割り当てられています。インデックスには、docs.deleted でマークされた多数のドキュメントが含まれています。さらに、ECS インスタンスが正常であることを確認しました。
分析
クエリ本文に
"profile": true
を追加します。 // クエリのパフォーマンス分析を有効にするために使用しますクエリ結果は、Elasticsearch が test インデックスのシャード 1 のクエリに他のシャードよりも長い時間がかかることを示しています。
preference
を _primary に設定し、"profile": true
をクエリ本文に追加したクエリリクエストを送信し、プライマリシャードのクエリに必要な時間を表示します。次に、preference
を _replica に設定し、"profile": true をクエリ本文に追加した別のクエリリクエストを送信し、レプリカシャードのクエリに必要な時間を表示します。 // 特定のシャードをクエリするために使用しますシャード 1(プライマリシャード)のクエリに必要な時間は、そのレプリカシャードのクエリに必要な時間よりも長くなります。これは、負荷の不均衡がシャード 1 によって引き起こされていることを示しています。
GET _cat/segments/index?v&h=shard,segment,size,size.momery,ip
コマンドとGET _cat/shards?v
コマンドを実行して、シャード 1 の情報をクエリします。 // セグメントとシャードの情報を取得するために使用しますコマンド出力は、シャード 1 に大きなセグメントが含まれており、シャード内のドキュメント数がそのレプリカシャードのドキュメント数よりも多いことを示しています。上記の情報を基に、負荷の不均衡はセグメントサイズの不均一が原因であると判断できます。
説明ドキュメント数の不一致は、さまざまな理由で発生する可能性があります。例:
プライマリシャードとレプリカシャード間のデータ同期に遅延が存在します。ドキュメントがプライマリシャードに継続的に書き込まれている場合、データの不整合が発生する可能性があります。ただし、ドキュメントの書き込みを停止すると、プライマリシャードとレプリカシャードの間でドキュメント数が同じになります。
データがプライマリシャードに書き込まれた後、システムはデータ書き込みリクエストをそのレプリカシャードに転送します。自動的に生成されたドキュメント ID を使用してプライマリシャードにドキュメントを書き込む場合、書き込み操作中にプライマリシャードで削除操作を実行することはできません。削除操作(たとえば、書き込んだばかりのドキュメントを削除するために Delete by Query リクエストを送信する)を実行すると、操作はレプリカシャードでも実行されます。次に、システムは書き込みリクエストをレプリカシャードに転送します。ドキュメント ID はシステムによって自動的に生成されるため、ドキュメントは検証なしでレプリカシャードに書き込まれます。その結果、レプリカシャードのドキュメント数がプライマリシャードのドキュメント数と異なります。さらに、プライマリシャードには
docs.deleted
でマークされた多数のドキュメントが含まれています。 // 削除されたドキュメントを示すために使用します
解決策
解決策 1:オフピーク時に、force merge 操作を呼び出して、小さなセグメントをマージし、docs.deleted でマークされたドキュメントを削除します。
解決策 2:プライマリシャードが存在するノードを再起動して、レプリカシャードをプライマリシャードに昇格させます。新しいプライマリシャードを使用して新しいレプリカシャードを生成します。これにより、新しいプライマリシャードとレプリカシャードのセグメントが同じになります。
次の図は、最適化後の負荷を示しています。
マルチゾーンアーキテクチャ
シナリオ
A 社は、ゾーン B とゾーン C の 2 つのゾーンにまたがって Elasticsearch クラスターをデプロイしています。クラスターがサービスを提供する場合、ゾーン C のノードの負荷はゾーン B のノードの負荷よりも高くなります。負荷の不均衡は、ハードウェアまたはデータの不均一な分散が原因ではないことを確認しました。
分析
過去 4 日間の 2 つのゾーンのノードの CPU 使用率を表示します。
監視データは、ノードの CPU 使用率が大幅に変化したことを示しています。
ノードへの TCP 接続を表示します。
監視データは、2 つのゾーンの TCP 接続数が大きく異なることを示しています。これは、負荷の不均衡がネットワーク接続が原因であることを示しています。
クライアント接続を確認します。
クライアントは永続的な接続を使用し、少数の新しい接続を確立します。このシナリオは、マルチゾーンネットワークの独立したスケジューリングのリスクがあります。ネットワークサービスは、接続数に基づいて独立してスケジュールされます。各スケジューリングユニットは、接続を作成するための最適なノードを選択します。独立したスケジューリングは、より高いパフォーマンスを提供します。ただし、新しい接続の数が少ない場合、複数のスケジューリングユニットが同じノードを選択して接続を確立する可能性があります。Elasticsearch クラスターのクライアントノードは、最初に同じゾーンにある別のノードにリクエストを転送します。これにより、ゾーン間の負荷の不均衡が発生します。
解決策
解決策 1:独立したクライアントノードを使用して複雑なトラフィックを転送します。この場合、クライアントノードの負荷が高くても、データノードは影響を受けません。これにより、負荷の不均衡のリスクが軽減されます。
解決策 2:クライアントに 2 つの独立したドメイン名を設定して、クライアントのトラフィックのバランスを確保します。この解決策では、高可用性を確保できません。Elasticsearch クラスターの構成をアップグレードする場合、ノードが SLB インスタンスから削除されないため、アクセス障害が発生する可能性があります。
次の図は、最適化後の負荷を示しています。