Elasticsearchのシャードとレプリカ


303

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

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



しかし、まだ問題は未解決のままです。
LuckyLuke 2013年

あなたが得た答えと上記のリンクされた答えは物事を明確にするべきだと思いました。では、何がはっきりしていないのですか?
javanna

シャードとレプリカを理解していません。1つのノードにシャードとレプリカが多数ある理由がわかりません。
LuckyLuke 2013年

1
データを分散できるように、すべてのインデックスをシャードに分割できます。シャードはインデックスのアトミック部分であり、ノードを追加すると、クラスター全体に分散できます。
javanna

回答:


966

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

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

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

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

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

ドキュメントをインデックスに登録するたびに、elasticsearchはそのドキュメントを保持することになっているプラ​​イマリシャードを決定し、そこにインデックスを作成します。プライマリー断片はデータのコピーではなく、データです!複数のシャードがあると、1台のマシンで並列処理を利用するのに役立ちますが、全体の要点は、同じクラスターで別のelasticsearchインスタンスを開始すると、シャードがクラスター全体に均等に分散されることです。

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

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

残りの2つのシャードは新しく開始されたノードに移動されているので、

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

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

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

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

この例に戻ると、レプリカが1つあるため、2つのレプリカシャードが最初のノードに割り当てられ、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ます。

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


57
素晴らしい説明、まとめてくれてありがとう!:)
LuckyLuke 2013年

6
これが、シャード/レプリカの概念を最もよく説明しています。どうもありがとう:)
フランク・フェルスター

1
@javanna素晴らしい説明です。マルチクラスタとその仕組みについて少しお話しいただけますか。
ラフィアン、2013

3
ダウンしたノードが再びアップしたときに何が起こるかをさらに説明することを提案できますか?
c0dem4gnetic 2013年

1
教えますか?あなたが完全にすべきCos。あなたはロックします。しかし、@ Animesh Pandeyが尋ねたように、2つのレプリカ、または3つのノードを持つ1つのレプリカで何が起こるかを知りたいと思っています。
霜降りのすばらしい2015

24

インデックスをシャードに分割して分散し、スケーリングします。

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

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

ここで定義を理解する方が簡単かもしれません:http : //www.elasticsearch.org/guide/reference/glossary/

よろしく、ポール


これは、すべてのドキュメントが言うことです-インデックスは断片に分割されますが、インデックスには実際には何が含まれていますか?
Alex Pryiomka

@AlexPryiomkaは、インデックスにデータが含まれている
のGaurav

つまり、基本的にはカフカの世界でのパーティションレプリケーションと同じですか。
ビアトリス

19

あなたが本当にそれを黄色にしたくない場合。レプリカの数をゼロに設定できます。

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

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


10

シャード:

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

レプリカ:

  1. Replica shardのコピーでありprimary 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シャードになります。インデックス。

6

インデックスをシャードに分割して分散し、スケーリングします。

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

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

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


私には3つのAWS ec2インスタンスがあり、それぞれにelasticsearchがインストールされています。ここに3つのノードがあることを意味しますか?これらすべてのノードに同じcluster.name: testプロパティセットがある場合、test3つのノードを持つクラスター名になりますか?
TheCoder

5

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

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

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

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

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

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

3

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

破片

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

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

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

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

レプリカ

いつでも障害が発生する可能性があるネットワーク/クラウド環境では、何らかの理由でシャード/ノードが何らかの理由でオフラインになったり消えたりした場合に備えて、フェイルオーバーメカニズムを使用することは非常に有用であり、強く推奨されます。この目的のために、Elasticsearchでは、インデックスのシャードの1つ以上のコピーを、レプリカシャード(略してレプリカ)と呼ばれるものに作成できます。

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

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

1

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

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

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


1

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

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


0

簡単に言うと、これshardは、ディスク上の別のフォルダに格納されているインデックスの一部にすぎません。

Elasticsearchシャード

このスクリーンショットは、Elasticsearchディレクトリ全体を示しています。

ご覧のように、すべてのデータはdataディレクトリに入ります。

インデックスC-mAfLltQzuas72iMiIXNwを調べると、5つのシャード(フォルダー0から4)があることがわかります。

一方、JH_A8PgCRj-GK0GeQ0limwインデックスには1つのシャード(0フォルダー)しかありません。

Elasticsearchシャード

pri破片の合計数を表示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.