ElasticSearchのシャードとは

断片化の概念

断片化の重要性

ES内のすべてのデータは、クラスター内の各ノードのシャードにバランスよく保存さます。これは、ESのパフォーマンス、セキュリティ、および安定性に影響を与えるため、理解する必要があります。

シャーディングが必要な理由

インデックスには、単一ノードのハードウェア制限を超える大量のデータを格納できます(たとえば、コンピューターのDディスクがいっぱいの場合、サーバーをEディスクに解凍し、クラスター化して、インデックスライブラリを共有し、均等に共有します。大丈夫です。)たとえば、10億のドキュメントを含むインデックスが1 TBのディスク領域を占有し、そのような大きなディスク領域を持つノードはありません。または、単一のノードが検索要求を処理し、応答が遅すぎます。この問題を解決するために、Elasticsearchは、インデックスをシャードと呼ばれる複数の部分に分割する機能を提供します。インデックスを作成するときに、必要なシャードの数を指定できます。各シャード自体も完全に機能する独立した「インデックス」であり、この「インデックス」はクラスター内の任意のノードに配置できます。断片化は、主に2つの理由で重要です。1)コンテンツ容量を水平方向に分割/拡張できます。2)シャード(場合によっては複数のノード)で分散操作と並列操作を実行して、パフォーマンス/スループットを向上させることができます。
シャードがどのように配布され、そのドキュメントが検索リクエストに集約されるかについては、Elasticsearchによって完全に管理されます。Elasticsearchはユーザーとして透過的です。

シャードには、レプリカシャードと呼ばれるレプリカもあります

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

シャーディングとは何ですか?

簡単に言えば、これはES内のすべてのデータのファイルブロックであり、データの最小単位ブロックでもあります。ESクラスター全体のコアは、すべてのシャードの配布、インデックス作成、ロード、およびルーティングの驚異的な速度を実現することです。 。

実際のシナリオ:

IndexAに2つのシャードがあると仮定して、10個のデータ(10個のドキュメント)をIndexAに挿入すると、これらの10個のデータは可能な限り均等に5個に分割され、最初のシャードに格納され、残りの5個は別のシャードに保存されます。

テーブルのパーティション分割の概念は、リレーショナルデータベースに精通している場合は、主流のリレーショナルデータベースの概念と似ています。

シャーディング設定

IndexNameインデックスを作成する場合、マッピングでフラグメンテーション(curl)を次のように設定できます。

PUT indexName
{
    
    
    "settings": {
    
    
        "number_of_shards": 5
    }
}

インデックスが確立された後は、シャードの数を変更できないことに注意してください

シャードの数(データノードの計算)

破片の数はできるだけ多いですか、それともできるだけ少ないですか?インデックス全体のデータ量に基づいて判断します。

実際のシナリオ:
IndexAのすべてのデータファイルのサイズが300Gの場合、ソリューションをカスタマイズするにはどうすればよいですか?(Headプラグインから表示できます)

推奨事項:(参照のみ)
1。各シャードデータファイルは30GB未満です
。2。各インデックスの各シャードはノードに対応します。3 。ノード
の数はシャードの数以上です。

推奨事項によると、少なくとも10個のシャードが必要です。
結果:10ノード(ノード)を構築し、マッピングはシャードの数を10に指定します。これは、ノードごとに1つのシャードを満たし、各シャードのデータ帯域は約30Gです。
SN(シャードの数)= IS(インデックスサイズ)/ 30
NN(ノードの数)= SN(シャードの数)+ MNN(マスターノードの数(データなし))+ NNN(ロードノードの数)

シャードクエリ

esを指定して特定のフラグメントをクエリし、esスピードクエリをさらに実現できます。

  1. シャード間で
    ランダム化シャードをランダムに選択してデータクエリします。これはesのデフォルトの方法です。

  2. _local
    は、ローカルノードのシャードのクエリデータに優先順位を付けてから、他のノードのシャードにクエリを実行します。ローカルノードにはIOの問題はありませんが、負荷が不均一になる可能性があります。データ量が完了しました。

  3. _primaryは
    、コピーはなくプライマリシャードでのみクエリされます。通常、データは完全です。

  4. _primary_firstは
    、プライマリシャードで最初にチェックさます。プライマリシャードがダウンしている場合は、レプリカに移動してチェックします。通常、データは完全です。

  5. _only_nodeは
    、指定されたIDを持つノードのシャードでのみ照会され、データが不完全である可能性があります。

  6. _prefer_nodeは
    最初に指定されたノードで照会され、一般データが完成します。

  7. _shardsは
    指定されたシャードクエリされ、データが不完全である可能性があります。

  8. _only_nodes
    は、クエリする複数のノードを指定するようにカスタマイズできます。esはこのメソッドを提供していません。ソース・コードを変更する必要があります。

    /** 
         * 指定分片 查询 
         */  
        @Test  
        public void testPreference()  
        {
    
      
            SearchResponse searchResponse = transportClient.prepareSearch(index)  
                    .setTypes("add")  
                    //.setPreference("_local")  
                    //.setPreference("_primary")  
                    //.setPreference("_primary_first")  
                    //.setPreference("_only_node:ZYYWXGZCSkSL7QD0bDVxYA")  
                    //.setPreference("_prefer_node:ZYYWXGZCSkSL7QD0bDVxYA")  
                    .setPreference("_shards:0,1,2")  
                    .setQuery(QueryBuilders.matchAllQuery()).setExplain(true).get();  

            SearchHits hits = searchResponse.getHits();  
            System.out.println(hits.getTotalHits());  
            SearchHit[] hits2 = hits.getHits();  
            for(SearchHit h : hits2)  
            {
    
      
                System.out.println(h.getSourceAsString());  
            }  
        }  

シャードとレプリカのメカニズムのコーミング

インデックスに複数のシャードが含まれている

インデックスには3Tのデータが含まれ、各サーバーは1Tのデータを伝送します。このとき、インデックスを作成するときに、プライマリシャードを3に設定し、各サーバーにプライマリシャードを設定し、各サーバーに偶数を設定します。 1Tのデータの負荷。
これがインデックスシャーディングの基本原理です。

各シャードは最小の作業単位であり、データの一部を伝達します

ElasticSearchの最下層は、Luceneに基づいて開発されています。実際、最下層の各シャードはLuceneインスタンスであり、各シャードには、インデックスを作成してリクエストを処理する完全な機能があります。

ノードを追加または削除すると、シャードはノード間の負荷分散を自動的に行います

合計7つのシャードを持つ6台のマシンがあり、2つのシャードを持つ1つのマシンがあると言っているようなものです。このとき、ElasticSearchクラスターにマシンを追加すると、2つのシャードを持つマシンが自動的にシャードを生成します。 。新しく追加したマシンに割り当てます。

プライマリシャード和レプリカシャード

各ドキュメントは、プライマリシャードとそれに対応するレプリカシャードにのみ存在する必要があります。ドキュメントは、複数のプライマリシャードに存在することはできません。

レプリカシャードはプライマリシャードのコピーであり、フォールトトレランスを担当し、読み取り要求の負荷を負担します

プライマリシャードがダウンした場合でも、対応するレプリカシャードのデータは引き続き存在し、読み取り要求も外部で処理されます。

プライマリシャードのデフォルト数は5で、レプリカのデフォルト数は1です。

デフォルトでは、10個のシャード、5個のプライマリシャード、および5個のレプリカシャードがあります。

プライマリシャードの数はインデックスの作成時に固定され、レプリカシャードの数はいつでも変更できます。

プライマリシャードのデフォルト数は5、レプリカシャードのデフォルト数は1です。プライマリシャードを3に設定し、レプリカシャードを1に設定すると、デフォルトは3つのプライマリシャードと3つのレプリカシャードになります。

レプリカシャードを2に設定すると、各プライマリシャードには2つのレプリカシャードがあり、結果として3つのプライマリシャードと6つのレプリカシャードになります。

プライマリシャードは、それ自体のレプリカシャードと同じノードに配置することはできません

そうしないと、ノードがダウンし、プライマリシャードとレプリカが失われるため、フォールトトレランスは提供されませんが
他のプライマリシャードのレプリカシャードと同じノードに配置できます。つまり、プライマリシャード1とレプリカシャード2はプライマリシャード1とレプリカシャード2を同じサーバーに配置できます。レプリカシャード1をサーバーに配置することはできません。プライマリシャード1とレプリカシャード1を
同じマシンに配置すると、ダウンタイムが発生した場合に、プライマリシャード1とレプリカ
シャード1はすべて失われるため、ElasticSearchは、プライマリシャードをそれ自体のレプリカシャードと同じノードに配置することを公式に許可していません。

シングルノード環境でインデックスを作成するのはどのように見えますか?

シングルノード環境で、3つのプライマリシャードと3つのレプリカシャードでインデックスを作成します。この時点で、クラスタステータスは黄色です。この時点で、3つのプライマリシャードのみが1つのノードにのみ割り当てられ、他の3つのレプリカが割り当てられます。シャードを割り当てることはできません。
クラスターは正常に機能しますが、ノードがダウンすると、すべてのデータが失われ、クラスターは使用できなくなり、要求を受け入れることができなくなります。

PUT /test_index
{
    
    
   "settings" : {
    
    
      "number_of_shards" : 3,
      "number_of_replicas" : 1
   }
}

2ノードノードの環境でレプリカシャードはどのように分散されますか

マシンの場合、このマシンには3つのプライマリシャードと3つのレプリカシャードがあります。この時点で、クラスターステータスは黄色です。
新しいマシンが追加されると、ElasticSearchは自動的に3つのレプリカシャードを追加します。新しいマシンに割り当てます。プライマリシャードのデータが対応するレプリカシャードにコピーされます。
プライマリシャードと対応するレプリカシャードのデータはまったく同じになります。

このとき、クライアントが読み取り要求を送信すると、primaryshard1に移動するか、primaryshard1に対応するreplicashard1に移動して処理することができます。

参照照合

https://blog.csdn.net/qq_38486203/article/details/80077844

HuperuschinensisのElasticsearchトップマスターシリーズコース

おすすめ

転載: blog.csdn.net/qq_41489540/article/details/113816617