2012-07-20 13 views

答えて

59

  • replicationは、データの追加コピーを作成し、別のノードへの自動フェイルオーバーを可能にします。潜在的に最新のものではないデータを読み取ることができれば、複製は水平方向のスケーリングに役立ちます。

  • shardingはキーシャードを使用して複数のサーバー間でデータを分割することにより、書き込みデータの水平スケーリングが可能になります。 choose a good shard keyにとって重要です。例えば、シャードキーの選択肢が乏しいと、単一のシャード上にのみ書き込まれるデータの「ホットスポット」につながる可能性があります。 MongoDBのが今の破片の間でデータや要求を分散管理する必要があるため

シャード環境がmore complexityを追加し - 追加設定し、ルーティングプロセスは、これらの側面を管理するために追加されます。

レプリケーションとシャーディングは、通常、それぞれのシャードがレプリカセットでサポートされているsharded clusterを作成するために組み合わされます。

ビューのクライアントアプリケーションの観点から、あなたはまた、特に、複製/シャーディング相互作用に関連して、いくつかのコントロールを持っている:

+2

"mongodbでは、各シャードはレプリカセットです" - これは真実ではありません。個々のサーバーをシャードとして追加することができます。 –

+2

@SergioTulentsev:ありがとうございました。理想的にはあなたのシャード*はレプリカセットにする必要がありますので、いくつかの冗長性/フェールオーバーがあります。同様に、レプリカセット*は複数のサーバで実行する必要があります(ただし、技術的には、そうする必要はありません)。 – Stennie

+1

"builds on replication"句を削除することをお勧めします。それは上に構築されません。 2つのものは完全に直交しています。 :) –

20

レプリケーションは主に従来のマスター/スレーブ設定であり、データはバックアップメンバーに同期され、プライマリが失敗した場合はそのうちの1つが代わりに使用されます。それは合理的に簡単なツールです。これは主に冗長性を目的としていますが、レプリカセットメンバーを追加して読み取りを拡張できます。これは少し複雑ですが、一部のアプリではうまく機能します。

シャーディングは、通常、複製の上に座っています。 MongoDBの "Shards"はレプリカセットであり、その前に "ルータ"と呼ばれるものがあります。あなたのアプリケーションはルータに接続し、クエリを発行し、どのレプリカセット(シャード)に物事を転送するかを決定します。これは対処すべきルータと設定サーバを持っているので(これは、どのデータがどこに格納されているかを追跡するため)、単一の複製セットよりもはるかに複雑です。

モンゴを水平方向に拡大したい場合は、シャードします。 10genは、ルータ/設定サーバーの設定自動シャーディングを呼び出すのが好きです。あなたがアプリケーションにどのDBに書き込むかを決定させるシャトーのもっとゲットーな形をすることも可能です。 MongoDBのスケーリングの文脈において

+12

は「より多くのゲットーフォーム」というフレーズを愛し、それを放送する必要があることを知っているように、それはマルチアップデート確認する必要があります – scarpacci

4

をあなたが考えているときはいつでもシャーディングやレプリケーションについては、ライター/更新操作のコンテキストで考える必要があります。書き込みをスケールする必要がない場合、レプリケーションはかなり簡単ですが、あなたにとっては良い選択です。

一方、ほとんどの場合更新/書き込みを実行すると、ある時点でライトボトルネックが発生します。書き込み要求が来たら、Mongoは他の書き込み要求をブロックする。これらの書き込み要求ブロックは、最初の要求が行われるまで実行されます。この書き込みを拡大して並列化したい場合は、シャーディングを実装する必要があります。

14

あなたのハードディスクには素晴らしい音楽コレクションがあり、リリース年に基づいて論理的に異なるフォルダに音楽を保存するとします。 ドライブに障害が発生すると、コレクションが失われることが懸念されます。 新しいディスクを取得し、同じフォルダ構造を維持しながらコレクション全体をコピーすることがあります。

シャーディングは>>他のドライブにあなたのコレクションを同期>>

レプリケーション異なるフォルダに音楽ファイルを維持

+0

非常によく説明されています。 – mhndev

+0

Stackoverflowはこのようなスタイルでより多くの回答を必要とします。 – dgg32

12

シャーディング

シャーディングは、複数のサーバ間で大規模なコレクションを分割する技術です。私たちは、シャードすると、複数のサーバーを展開します(mongod)。そして、正面にはルータであるmongosがあります。アプリケーションはこのルータと通信します。次に、このルータはさまざまなサーバ(mongod)と通信します。アプリケーションとmongosは通常、同じサーバー上に同じ場所に配置されます。同じマシン上で複数のmongosサービスを実行させることができます。また、各サーバー上に複数のmongodレプリカセットと呼ばれる)のセットを1つずつmongodの代わりに保持することをお勧めします。レプリカセットは、いくつかの異なるインスタンス間でデータを同期させておくため、一方がダウンするとデータが失われないようにします。論理的には、各レプリカセットはシャードと見なすことができます。アプリケーションに透過的です。MongoDBがシャードに選択する方法は、シャードキーを選択しています。

MongoDB sharding

student収集のために、我々はシャードキーとしてstdt_idを持っているか、それが複合キー可能性があり、想定します。サーバはmongosで、これは範囲ベースのシステムです。したがって、私たちがシャードキーとして送信するstdt_idに基づいて、それは右のmongodインスタンスにリクエストを送信します。

開発者として本当に知っておく必要はありますか?

  • insertそれはマルチpartedのシャードキーだ場合、我々はシャードキーはコレクション自体
  • であるかを理解するためにきた
  • キー全体シャードを含まなければならないので、シャードキーを含める必要がありますupdateremovefindの場合 - mongosにシャードキーが指定されていない場合 - コレクションをカバーするすべての異なるシャードにリクエストをブロードキャストする必要があります。 updateため
  • - 私たちは全体のシャードキーを指定しない場合、我々はそれが
関連する問題