2013-02-06 4 views
6

スケーリング/フェイルオーバーの場合mongodbは、プライマリサーバと1つ以上のセカンダリサーバがある場合は「レプリカセット」を使用します。プライマリは書き込みに使用されます。セカンダリは読み込みに使用されます。これは、SQLプログラミングで使用されるかなり多くのマスタースレーブパターンです。 プライマリがダウンすると、セカンダリのクラスタ内のセカンダリが代わりになります。 したがって、水平方向のスケーリングとフェイルオーバーの問題が解決されます。しかし、これはシャーディングを可能にする解決策ではないようです。真のシャードはデータ全体の一部しか保持していないので、レプリカセット内のセカンダリが断片化している場合、要求を処理するために必要なすべてのデータを持っていない場合、どのようにプライマリとして修飾できますか?MongoDBはシャーディングとレプリケーションの両方をどのように同時に行いますか?

シャードのそれぞれに対してレプリカセットを設定する必要はありませんか?

これは明らかに初心者の質問なので、視覚的に、またはこれがどのように行われているかを示すリンクが役立ちます。

+0

シャードには、送られたリクエストを満たすのに必要なデータがありますが、シャードごとのレプリカを持つことができます。ここにはクッキングブックのチュートリアルがあります:http://cookbook.mongodb.org/operations/convert-replica- set-to-replicated-shard-cluster/ – Sammaye

答えて

3

あなたの仮定は正しい、各シャードには別々のレプリカセットが含まれています。書き込み要求が入ると、MongoSはシャードキーに基づいて適切なシャードを見つけ、そのシャードに含まれるレプリカセットのプライマリにデータを書き込みます。この結果、書込みスケーリングが行われます。(適切に選択された)シャードキーは、すべてのシャードに書込みを配布する必要があります。

+0

ありがとう!それは反対の方法で行うことができますか?レプリカセットクラスタ内の各サーバーはシャードされています。詳細な説明:レプリカセットがあるとします。私たちは、より多くの読み込みを処理できるようになりました。フェールオーバーを取得しました。今私たちの問題は、各サーバー(サーバーと呼ばれる)のデータのサイズがかなり大きくなっていることです。そこで、各サーバー上のデータを破棄します。あなたが説明したことの反対ではありませんか?それとも、実装の観点からは、すべて同じ「もの」ですか? –

+0

@alexsundukovskiyあなたは何を意味するのかはっきりしていませんが、レプリカセット自体を破ることはできません – Sammaye

+0

@alexsundukovskiy SHARD_KEYには{A、B、C、D}の値があり、シャードは2つあるとしましょう。各シャードには3台のマシンで構成されるレプリカセットがあります。理論的には、ドキュメントはSHARD_KEYに一様に分散する必要があります。SHARD_KEY = A、SHARD_KEY = Bなどで到着するドキュメントの数は等しくなければなりません。この幸せな状況がしばらく続くとしましょう。次に、2つのうちの1つが起き始める:(続き) –

0

通常、個々のシャードを別々のレプリカセットにマップします。 MongoDBシャーディングの概要については、http://docs.mongodb.org/manual/core/sharded-clusters/を参照してください。

+0

ありがとうございました。言い換えれば、レプリカセット内の各ノードを断片化することができますか?それをやって何が間違っていなければ? –

+0

私はあなたの質問を理解しているか分からない。データベース内のコレクションを破棄し、シャーディングはレプリカセットの上で実行されます。 MongoDBにはノードをシャーディングするという概念はありません。確かにすべてのデータベースのすべてのコレクションを破棄することができますが、それはおそらく作業負荷に応じて過剰です。 – epc

+0

レプリカセットがあるとします。私たちは、より多くの読み込みを処理できるようになりました。フェールオーバーを取得しました。今私たちの問題は、各サーバー(ノードと呼ばれる)のデータのサイズがかなり大きくなっていることです。そこで、各サーバー上のデータを破棄します。あなたが説明したことの反対ではありませんか?それとも、実装の観点からは、すべて同じ「もの」ですか? –

1

シャードは、プライマリセカンダリ(レプリカセット)の合計です。したがって、各シャードにはレプリカセットが必要です。

データ全体の一部はプライマリに保持され、セカンダリと共有されて一貫性を維持します。プライマリが消えた場合、セカンダリは新しいプライマリになるように選択され、直前のサーブを開始する前のセカンダリと同じデータを持ちます。これは、断片化されたデータがまだ存在し、失われていないことを意味します。

+1

シャードは、シャードされたコレクションのデータの範囲です。シャードなしでレプリカが存在し、シャドウがレプリカなしで存在する可能性があります。 – Sammaye

+0

@Sammayeシャード環境内でレプリカセットが単独で存在する方法を理解できません。 (シャードされていない環境では、シャードである必要はありませんか?)「シャード」と言うとき、レプリカセットがより大きなデータ範囲の一部であるという意味ではありませんか?レプリカセットなしで存在できるシャードについては同意します。しかし、それは彼が通過したケースではなかったので、レプリカを含む彼のシナリオに対する答えを調整しました。単一のユニットではありません。 –

+0

シャードの定義は必ずしも複製された環境内にあるとは限らず、シャードの「定義」がレプリカに存在するように思えました。私はあなたが "プライマリとセカンダリの合計"によって何を意味しているのかまだ分かりません。なぜなら、プライマリ(シャード)には重複したデータがないからです。セカンダリはプライマリのレプリカ、シャード、まあまあですが、複製に依存しています – Sammaye