web-dev-qa-db-ja.com

Elasticsearchのシャードとレプリカ

Elasticsearchでシャードとレプリカが何であるかを理解しようとしていますが、理解することができません。 Elasticsearchをダウンロードしてスクリプトを実行すると、私が知っていることから、単一ノードでクラスターを開始しました。このノード(私のPC)には5つのシャード(?)といくつかのレプリカ(?)があります。

それらは何ですか、インデックスの重複が5つありますか?もしそうなら、なぜですか?説明が必要な場合があります。

255
LuckyLuke

あなたが得た答えと返事はあなたを助けていないようであるので、私は実際の例を使って説明しようとします。

Elasticsearchをダウンロードして起動すると、elasticsearchノードを作成します。このノードは、既存のクラスターが利用可能であれば参加を試みるか、新しいクラスターを作成します。起動したばかりの単一のノードで独自の新しいクラスターを作成したとします。データがないため、インデックスを作成する必要があります。

インデックスを作成するとき(最初のドキュメントのインデックス作成時にもインデックスが自動的に作成されます)、それが構成されるシャードの数を定義できます。数値を指定しない場合、デフォルトのシャード数が5つのプライマリーになります。どういう意味ですか?

つまり、elasticsearchはデータを含む5つのプライマリシャードを作成します。

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

ドキュメントのインデックスを作成するたびに、elasticsearchはそのプライマリシャードがそのドキュメントを保持することになっており、そこでインデックスを作成します。プライマリシャードはデータのコピーではなく、データです!複数のシャードがあると、単一のマシンで並列処理を利用するのに役立ちますが、全体のポイントは、同じクラスターで別のelasticsearchインスタンスを起動すると、シャードがクラスター全体に均等に分散されることです。

ノード1は、たとえば3つのシャードのみを保持します。

 ____    ____    ____ 
| 1  |  | 2  |  | 3  |
|____|  |____|  |____|

残りの2つのシャードは新しく開始されたノードに移動されたため:

 ____    ____
| 4  |  | 5  |
|____|  |____|

なぜこれが起こるのですか? elasticsearchは分散検索エンジンであり、このように複数のノード/マシンを使用して大量のデータを管理できるためです。

すべてのelasticsearchインデックスは、データが保存される場所であるため、少なくとも1つのプライマリシャードで構成されます。ただし、すべてのシャードにはコストがかかります。したがって、単一のノードがあり、予測可能な成長がない場合は、単一のプライマリシャードだけを使用してください。

別のタイプのシャードはレプリカです。デフォルトは1です。つまり、すべてのプライマリシャードが、同じデータを含む別のシャードにコピーされます。レプリカは、検索パフォーマンスの向上とフェールオーバーに使用されます。レプリカシャードは、関連するプライマリと同じノードに割り当てられることはありません(元のデータと同じディスクにバックアップを置くようなものです)。

例に戻ると、1つのレプリカでは、各ノードにインデックス全体があります。3つのレプリカシャードが最初のノードに割り当てられ、2番目のノードのプライマリとまったく同じデータが含まれるためです。

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4R |  | 5R |
|____|  |____|  |____|  |____|  |____|

2番目のノードにも同じです。最初のノードのプライマリシャードのコピーが含まれます。

 ____    ____    ____    ____    ____
| 1R |  | 2R |  | 3R |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

このような設定では、ノードがダウンしても、インデックス全体が残っています。次のように、レプリカの断片は自動的にプライマリになり、ノードの障害にもかかわらずクラスターは適切に動作します。

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

"number_of_replicas":1があるため、レプリカはプライマリと同じノードに割り当てられることはないため、これ以上割り当てることはできません。そのため、5つの未割り当てシャード、レプリカ、およびクラスターステータスがYELLOWではなくGREENになります。データの損失はありませんが、一部のシャードを割り当てることができないため、より良い可能性があります。

残ったノードがバックアップされるとすぐに、再びノードがクラスターに参加し、レプリカが再び割り当てられます。 2番目のノード上の既存のシャードはロードできますが、ノードがダウンしている間に書き込み操作が行われる可能性が高いため、他のシャードと同期する必要があります。この操作の最後に、クラスターのステータスはGREENになります。

これがあなたのために物事を明確にすることを願っています。

818
javanna

あなたが本当に黄色いのが嫌いなら。レプリカの数をゼロに設定できます。

curl -XPUT 'localhost:9200/_settings' -d '
{
    "index" : {
        "number_of_replicas" : 0
    }
}
'

ローカル開発ボックスでのみこれを行う必要があることに注意してください。

19
jyu

インデックスは、分散とスケーリングのためにシャードに分割されます。

レプリカはシャードのコピーであり、ノードが失われた場合に信頼性を提供します。レプリカ数== 1の場合、緑色の状態にするには、クラスターにシャードのメインコピーと複製コピーが必要であるため、この数に混乱が生じることがよくあります。

レプリカを作成するには、クラスターに少なくとも2つのノードが必要です。

ここで定義を理解しやすいかもしれません: http://www.elasticsearch.org/guide/reference/glossary/

よろしく、ポール

18
ppearcy

インデックスは、分散とスケーリングのためにシャードに分割されます。

レプリカはシャードのコピーです。

ノードは、クラスターに属するエラスティック検索の実行中のインスタンスです。

クラスターは、同じクラスター名を共有する1つ以上のノードで構成されます。各クラスターには、クラスターによって自動的に選択され、現在のマスターノードに障害が発生した場合に交換できる単一のマスターノードがあります。

4
Pruthvi Kumar

シャード:

  1. 分散検索サーバーであるElasticSearchは、Shardという概念を使用して、インデックスドキュメントをすべてのノードに分散します。
  2. indexは、single nodeのハードウェア制限を超える可能性のある大量のデータを潜在的に格納できます。
  3. たとえば、1TBのディスク領域を占有する10億のドキュメントの単一のインデックスは、単一ノードのディスクに収まらないか、単一ノードのみからの検索要求を処理するには遅すぎる可能性があります。
  4. この問題を解決するために、Elasticsearchには、インデックスをshardsと呼ばれる複数の部分に分割する機能があります。
  5. インデックスを作成するとき、必要なshardsの数を簡単に定義できます。
  6. Documentsshardsに保存され、シャードはnodesclusterに割り当てられます
  7. clusterが増減すると、Elasticsearchは、nodesの間でシャードを自動的に移行し、clusterのバランスを維持します。
  8. シャードはprimary shardまたはreplica shardのいずれかです。
  9. インデックス内の各ドキュメントはsingle primary shardに属しているため、プライマリシャードの数によって、インデックスが保持できるデータの最大量が決まります
  10. replica shardは、プライマリシャードの単なるコピーです。

レプリカ:

  1. Replica shardprimary Shardのコピーであり、ハードウェア障害の場合のデータ損失を防ぎます。
  2. Elasticsearchを使用すると、インデックスのシャードの1つ以上のコピーをレプリカシャード、またはreplicasと呼ぶことができます。
  3. indexは、ゼロ(レプリカがないことを意味する)以上の回数複製することもできます。
  4. number of shardsとレプリカは、インデックスの作成時にインデックスごとに定義できます。
  5. インデックスが作成された後、レプリカの数はいつでも動的に変更できますが、cannot change the number of shardsは事後です。
  6. デフォルトでは、Elasticsearchの各インデックスには5つのプライマリシャードと1 replicaが割り当てられます。つまり、クラスターに少なくとも2つのノードがある場合、インデックスには5つのプライマリシャードと5つのレプリカシャード(1つの完全なレプリカ)があり、合計10インデックスごとのシャード。
3
Vino

ElasticSearchでは、最上位でドキュメントをインデックスにインデックス付けします。各インデックスには、データを内部的に分散する多数のシャードがあり、シャードの内部には、データのコアストレージであるLuceneセグメントが存在します。したがって、インデックスに5つのシャードがある場合、データはシャードに分散されており、シャードに同じデータが存在しないことを意味します。

ESのコアを説明するビデオに注意してください https://www.youtube.com/watch?v=PpX7J-G2PEo

複数のインデックスまたは複数のシャードに関する記事 弾性検索、複数のインデックス対1つのインデックス、異なるデータセットのタイプ?

1

答えではなく、ElasticSearchの コアコンセプト の別のリファレンスであり、@ javannaの答えに対する賛辞としてかなり明確だと思います。

破片

インデックスは、単一ノードのハードウェア制限を超える可能性がある大量のデータを格納する可能性があります。たとえば、1TBのディスク領域を占有する10億のドキュメントの単一のインデックスは、単一ノードのディスクに収まらないか、単一ノードのみからの検索要求を処理するには遅すぎる可能性があります。

この問題を解決するために、Elasticsearchには、インデックスをシャードと呼ばれる複数の部分に分割する機能があります。インデックスを作成するときに、必要なシャードの数を簡単に定義できます。各シャードはそれ自体が完全に機能する独立した「インデックス」であり、クラスター内の任意のノードでホストできます。

シャーディングは、主に次の2つの理由で重要です。

  • これにより、コンテンツのボリュームを水平に分割/スケーリングできます。
  • シャード(潜在的に複数のノード)全体に操作を分散および並列化できるため、パフォーマンス/スループットが向上します

レプリカ

いつでも障害が予想されるネットワーク/クラウド環境では、何らかの理由でシャード/ノードが何らかの理由でオフラインになったり消えたりする場合に備えて、フェールオーバーメカニズムを使用することをお勧めします。このため、Elasticsearchでは、インデックスのシャードの1つ以上のコピーを、レプリカシャードまたは略してレプリカと呼ばれるものに作成できます。

レプリケーションは、主に次の2つの理由で重要です。

  • シャード/ノードに障害が発生した場合に高可用性を提供します。このため、レプリカシャードは、コピー元の/プライマリシャードとして同じノードに決して割り当てられないことに注意することが重要です。
  • 検索はすべてのレプリカで並行して実行できるため、検索をスケールアウトすることができますボリューム/スループット。
0
Hearen

Elasticsearch は非常にスケーラブルであり、すべてのクレジットはその分散アーキテクチャに委ねられています。シャーディングにより可能になりました。ここで、さらに先に進む前に、単純で非常に一般的なユースケースを考えてみましょう。大量のドキュメントを含むインデックスがあり、簡単にするために、そのインデックスのサイズが1 TB(つまり、各ドキュメントのサイズの合計)であると仮定します。そのインデックスでは1 TBです)。また、データを保存するためにそれぞれ512 GBのスペースを使用できる2つのノードがあると仮定します。明らかなように、使用可能な2つのノードのいずれにもインデックス全体を格納することはできないため、これらのノード間でインデックスを分散する必要があります。

インデックスのサイズが単一ノードのハードウェア制限を超えるこのような場合、 Sharding が助けになります。シャーディングは、インデックスを小さなピースに分割することでこの問題を解決し、これらのピースはシャードと呼ばれます。

0
Ayush Jain

これについては、実際のWordシナリオを使用して説明します。あなたがeコマースウェブサイトを運営していると想像してください。あなたがより人気になると、より多くの売り手と製品があなたのウェブサイトに追加されます。インデックスを作成する必要がある製品の数が増えており、1つのノードの1つのハードディスクに収まらないほど大きいことがわかります。たとえハードディスクに収まっているとしても、1台のマシンですべてのドキュメントを線形検索するのは非常に遅いです。 1つのノード上の1つのインデックスは、elasticsearchが機能する分散クラスター構成を利用しません。

したがって、elasticsearchは、インデックス内のドキュメントをクラスター内の複数のノードに分割します。ドキュメントのすべての分割は、シャードと呼ばれます。文書の断片を運ぶ各ノードには、文書のサブセットのみが含まれます。 100個の製品と5個のシャードがあるとします。各シャードには20個の製品があります。このデータのシャーディングは、elasticsearchで低遅延検索を可能にするものです。検索は複数のノードで並行して行われます。結果は集計されて返されます。ただし、シャードはフォールトトレランスを提供しません。つまり、シャードを含むノードが停止している場合、クラスターの状態は黄色になります。一部のデータは利用できません。

フォールトトレランスを向上させるには、レプリカが必要です。デフォルトでは、エラスティック検索は各シャードのレプリカを1つ作成します。これらのレプリカは、プライマリシャードが存在しない他のノードで常に作成されます。したがって、システムのフォールトトレランスを実現するには、クラスター内のノードの数を増やす必要があります。また、インデックスのシャードの数にも依存します。レプリカとシャードに基づいて必要なノードの数を計算する一般的な公式は、「ノードの数=シャードの数*(レプリカの数+ 1)」です。標準的な方法は、フォールトトレランスのために少なくとも1つのレプリカを持つことです。

シャードの数の設定は静的な操作です。つまり、インデックスを作成するときに指定する必要があります。それ以降の変更には、データの完全な再インデックス付けが必要であり、時間がかかります。ただし、レプリカの数の設定は動的な操作であり、インデックスの作成後もいつでも実行できます。

以下のコマンドを使用して、インデックスのシャードとレプリカの数を設定できます。

curl -XPUT 'localhost:9200/sampleindex?pretty' -H 'Content-Type: application/json' -d ' { "settings":{ "number_of_shards":2, "number_of_replicas":1 } } '