web-dev-qa-db-ja.com

複数のMongoDBデータベース(クライアントごとに1つ)とシャーディング-互換性はありますか?

現在、1つのレプリカセットで、クライアントごとに1つのMongoDBデータベースを使用しています。セキュリティ上の理由から、クライアントごとに1つのデータベースを保持します。

各クライアントには同じ15のコレクションがあり、顧客ベースを拡大しているので、これを顧客のグループで異なるマシンにスケールする必要があります。

私はシャーディングに関するMongoDBのドキュメントを読んでいますが、アプローチはコレクションとシャードキーによるものであるため、多くのデータベースがある場合の状況を心配しています。

複数のデータベースを持つシャーディングを使用することは可能ですか?そしてそれが可能であれば、どのようなアプローチが良いでしょうか?

2
clopez

はい、互換性があります。複数のシャードがある場合、異なるデータベースがバランスの取れた方法で異なるシャードに自動的に割り当てられます。

シャーディングシステムは、シャードキーを使用してシャード間で大規模なコレクションを分散しますが、異なるシャード間で個別のデータベースも分散します。 shardsのドキュメント で説明します:

分割クラスター内の各データベースには、そのデータベースの分割されていないすべてのコレクションを保持するプライマリー断片があります。各データベースには独自のプライマリシャードがあります。プライマリー断片は、レプリカセットのプライマリーとは関係ありません。
mongosは、新しいデータベースを作成するときに、データ量が最も少ないクラスター内のシャードを選択してプライマリシャードを選択します。

これを使用して、次のように各クライアントのデータベースを異なるシャードに割り当てることができます。

  1. 複数のシャードを設定します(おそらく今のところ3)
  2. 新しいクライアントに新しいデータベースを追加すると、mongosはデータが最も少ないシャードにデータベースを割り当てます
  3. これには、使用可能なシャード間でデータベースを「バランス調整」する効果があります

このアプローチに関するいくつかの警告:

  1. 最初に新しいシャードを追加するとき、mongosはデータベースを自動的にしないで、あるシャードから別のシャードにデータベースを移動してシステムのバランスを取ります。それを行う必要がある場合は、意図的に movePrimaryコマンド を使用して行う必要があります。
  2. データベースが大きくなると、データベースを1つのシャードから別のシャードに移動して、十分なスペースを確保する必要があります。繰り返しますが、movePrimaryコマンドを使用して自分でこれを行う必要があります
  3. データベースの1つのコレクションが1つのシャードに対して大きすぎる場合は、そのコレクションのシャーディングを手動で有効にする必要があります。その後、mongosは自動的にチャンクを異なるシャードに割り当てます。
2
Vince Bowdren