[解決済み] MongoDBのマルチテナントデータベースへの推奨されるアプローチとは?
質問
MongoDB を使ってマルチテナントのアプリを作ろうと思っています。テナントの数についてはまだ推測していませんが、数千にスケールできるようにしたいと思っています。
私は3つの戦略を考えることができます。
- すべてのテナントを同じコレクションに入れ、セキュリティのためにテナント固有のフィールドを使用する。
- 1つの共有DBで、テナントごとに1つのコレクション
- 1テナントにつき1データベース
私の頭の中の声は、オプション 2 にすることを勧めています。
どなたか、感想や含意を聞かせてください。
どのように解決するのですか?
私は同じ問題を解決するために、また、変種を検討しています。 私は SaaS マルチテナント アプリケーションを作成する長年の経験を持っているので、リレーショナル データベースの以前の経験に基づいて、2 番目のオプションを選択するつもりでした。
調査中に、mongodb サポート サイトでこの記事を見つけました (現在は削除されているので、ずっと前に追加されました)。 https://web.archive.org/web/20140812091703/http://support.mongohq.com/use-cases/multi-tenant.html
彼らは、私が理解するように、特にmongodbに特化したものではない、どんなコストで第2オプションを避けるために述べました。私の印象では、これはデータベース設計の仕様のために、私が研究したほとんどのNoSQLデータベース(CoachDB、Cassandra、CouchBase Serverなど)に適用されます。
コレクション (またはバケット、あるいは異なるDBでどのように呼ぶか) は、RDBMSのセキュリティ スキーマと同じものではありませんが、ドキュメントのコンテナとして動作し、優れたテナント分離を適用するには役に立ちません。私は、コレクションに基づくセキュリティ制限を適用できる NoSQL データベースを見つけることができませんでした。
もちろん、mongodbのロールベースのセキュリティを使って、データベースやサーバーレベルでアクセスを制限することは可能です。( http://docs.mongodb.org/manual/core/authorization/ )
1.の場合、1.をお勧めします。
- このシナリオの複雑さに対処するための十分な時間とリソースがある。 設計、実装、およびテストの複雑さに対処するための十分な時間とリソースがある。
- テナントごとにデータベースの構造や機能に大きな違いがない場合。 テナントによってデータベースの構造や機能に大きな違いがない場合。
- アプリケーションの設計により、テナントが実行時に最小限のカスタマイズしか行えない場合。 実行時にカスタマイズすることができます。
- スペースを最適化し、ハードウェアリソースの使用を最小限に抑えたい場合。 リソースの使用を最小限に抑えたい場合。
- 数千のテナントがいる場合。
- 高速かつ低コストでスケールアウトしたい場合。
- テナントごとにデータをバックアップしない場合 (テナントごとに個別のバックアップを維持する)。 バックアップを行う)。このシナリオでも可能ですが しかし、その労力は膨大なものになるでしょう。
私なら、もしもの時はバリエーション3にします。
- 小規模なテナントリスト(数百人)を持つことになる。
- ビジネスの仕様上、テナントごとにデータベース構造の大きな違いをサポートできる必要がある(例:サードパーティシステムとの統合、データのインポート/エクスポート)。
- アプリケーションの設計では、顧客(テナント)がアプリケーションのランタイムに大きな変更を加えることができます(モジュールの追加、フィールドのカスタマイズなど)。
- 新しいハードウェアノードで迅速にスケールアウトするのに十分なリソースがある場合。
- テナントごとにデータのバージョン/バックアップを保持することが必要な場合。また、リストアも簡単でしょう。
- 法的/規制上の制約により、異なるテナントを異なるデータベース (データセンターも) に保持することを余儀なくされている場合。
- ロールなど、mongodb のすぐに使えるセキュリティ機能を完全に利用したい場合。
- テナント間のサイズの問題で大きな違いがある(多くの小さなテナントと少数の非常に大きなテナントがある)。
アプリケーションの詳細を投稿していただければ、より詳細なアドバイスを差し上げることができるかもしれません。
関連
-
[解決済み】MongoDBシェルですべてのコレクションを一覧表示するには?
-
[解決済み] MongoDB Compass フィルタ (クエリ)
-
[解決済み] Mongodbでキーに基づいた重複を削除する方法は?
-
[解決済み] 配列フィールドが空でない MongoDB レコードを検索する
-
問題が発生しました -----mongodb-------Uncaught TypeError: 未定義のプロパティ 'value' を読み取れませんでした。
-
[解決済み] SocketException: アドレスはすでに使用中です MONGODB
-
[解決済み] コマンドラインからMongoDBデータベースを削除する方法を教えてください。
-
[解決済み】MongoDB: 1つのフィールドですべてのドキュメントを更新する
-
[解決済み】ドキュメントの配列内のオブジェクトを更新する方法(入れ子更新)について)
-
[解決済み] テーブル構造を共有するマルチテナントデータベースを作成するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】SocketException: アドレスはすでに使用中です。
-
[解決済み] MongoDBでフィールドが存在することを確認する
-
[解決済み] mongodb count フィールド/キーごとの明確な値の数
-
[解決済み] HomebrewでMongoDBをインストールする
-
[解決済み] 同じデータベース内でコレクションをコピーする最も速い方法は何ですか?
-
[解決済み] MongoDBと同等ではない
-
[解決済み】MongoDBのシェルで20以上のアイテム(ドキュメント)をプリントアウトする方法は?
-
[解決済み】MongoDBをWindowsサービスとして実行するにはどうすればいいですか?
-
[解決済み】MongoDB コレクションの変更をリッスンする方法は?
-
[解決済み] MongoDB集計フレームワーク match OR