2

MongoDbにシャーディングを実装したいので、いくつかの提案が必要です。

洞察

  1. マシンに関するさまざまな情報を収集し、それらを独自のコレクションに書き込むcronジョブがたくさんあります。
  2. コレクションは動的に作成されます。
  3. 各コレクションには数百万のデータがあります。
  4. 各コレクションのStructure1は、Name、Category、Subcategory、NodeId、Process-Start-Time、Process-End-Time、Valueです。
  5. 各コレクションのStructure2は、Name、Category、Subcategory、Subtype、Date、Valueです。
  6. 各コレクションのStructure3は、Name、Category、Subcategory、NodeId、Process-Start-Time、Process-End-Time、Value、Flag1、Flag2、Flag3です。

調査の結果、シャーディングを使用し、複数のサーバーで役立つようにすることがわかりました。これにより、次の2つのことが保証されます。

  1. スペースが足りなくなる心配はありません。
  2. サーバー間でバランスの取れたパフォーマンス

質問1: 私の問題は、データを分割するための正しいシャードキーを見つけることです。デフォルトのObjectId以外のunique-keyがコレクションに表示されません。さらに読んだ後、複合キーを使用できることがわかりました。値がObjectIdのように見えるキーとして、複合キーまたはカスタムObjectIdを使用することは理にかなっていますか。_。これは、クエリの結果を返し、チャンクを移動するパフォーマンスに関して非常に重要です。

質問2: コレクションが大きいため、コレクションを動的に作成するときに、Mongoコンソールで毎回シャードを設定するのが難しくなります。シャードデータベース用にコレクションが作成されるたびに、そのコレクションのシャードキーを定義するように、mongoで自動化する方法はありますか?

質問3: シャードキーをクエリ式に渡す必要が本当にありますか?クエリ式でObjectIdを使用したことはないと思います。データが従来のDBのように構造化されていないため、一意のIDを使用できるとは思えません。はいの場合、次のようなクエリにどのように役立ちますか。

例:

{カテゴリ: "エネルギー"、サブカテゴリ: "ワット"、プロセス開始時間:{$ gte:132234234}}

ステップインしてこの問題の修正を手伝ってくれてありがとう。

4

1 に答える 1

3

これを行う最も簡単な方法は、データベースをシャーディングすることですが、コレクションはシャーディングしないままにしておきます。利点:

  • コレクションはシャード全体に分散されます(ただし、各コレクションは1つのシャードにのみ存在します)。編集:私はこれについて間違っていました、これはまだ実装されていません。追跡するには、関連するJiraチケットを参照してください。今のところ、タグを使用してコレクションを配布できますが、自動的には配布できません。
  • 新しいコレクションごとにshardCollectionを呼び出す必要はありません

欠点は、コレクションのすべてのトラフィックがそのシャードに送られることです。これは、実行しようとしていることには実用的でない可能性があります。

あなたの質問に関する限り:

質問1:シャードキーは一意である必要はありません。あなたは一般的に何を求めていますか?{category:1}またはのようなものを使用した方がよい場合があります{category:1,subcategory:1}

質問2:それを自動的に行う組み込みの方法はありません。その動作を実現する最良の方法は、おそらくcronジョブを設定することです。

質問3:いいえ。シャードキーを含むクエリは特定のシャードに送信でき、シャードキーのないクエリはすべてのシャードに送信する必要があります。http://www.mongodb.org/display/DOCS/Sharding+Introduction#ShardingIntroduction-を参照してください。 OperationTypes

于 2012-04-26T14:31:30.007 に答える