1. ホーム
  2. elasticsearch

[解決済み] Elasticsearchのシャードとレプリカ

2022-03-24 18:51:30

質問

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

インデックスが5つ重複しているのでしょうか?もしそうなら、なぜですか?私はいくつかの説明が必要です。

解決方法は?

回答や返信が役に立たなかったようなので、実例を挙げて説明します。

elasticsearchをダウンロードして起動すると、elasticsearchノードが作成され、既存のクラスタがあればそこに参加するか、新しいクラスタを作成しようとします。例えば、先ほど起動したノード1つで独自の新しいクラスタを作成したとします。データがないため、インデックスを作成する必要があります。

インデックスを作成する際(最初のドキュメントのインデックスを作成する際にも、インデックスは自動的に作成されます)、いくつのシャードで構成されるかを定義することができます。数を指定しない場合は、デフォルトのシャード数になります。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で、すべてのプライマリシャードが、同じデータを含む別のシャードにコピーされることを意味します。レプリカは、検索性能の向上とフェイルオーバーのために使用されます。レプリカシャードは、関連するプライマリがあるのと同じノードに割り当てられることはありません(バックアップを元のデータと同じディスクに置くようなものです)。

最初のノードに2つのレプリカシャードが割り当てられ、2番目のノードにあるプライマリシャードとまったく同じデータを含むことになるからです。

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

2番目のノードも同様で、1番目のノードにあるプライマリシャードのコピーが格納されます。

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

このように設定すれば、ノードが停止しても、インデックス全体を保持することができます。レプリカシャードは自動的にプライマリとなり、以下のようにノードが故障してもクラスターは正常に動作します。

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

を持っているので "number_of_replicas":1 というのも、レプリカはプライマリと同じノードに割り当てられることがないため、これ以上割り当てられないからです。そのため、未割り当てのシャードが5つ、レプリカが1つ、そしてクラスタのステータスが YELLOW ではなく GREEN . データの損失はありませんが、一部のシャードが割り当てられないので、もっと良い方法かもしれません。

離脱していたノードのバックアップが取れ次第、再びクラスタに参加し、レプリカの割り当てが再開されます。2番目のノードにある既存のシャードはロードできますが、ノードの停止中に書き込み操作が行われた可能性が高いため、他のシャードとの同期が必要です。この操作の終了後、クラスタのステータスは次のようになります。 GREEN .

これで、物事が明確になるといいですね。