139

現在、当社のソフトウェアは MySQL で実行されています。すべてのテナントのデータは同じスキーマに格納されます。Ruby on Rails を使用しているため、どのデータがどのテナントに属しているかを簡単に判断できます。ただし、データが危険にさらされることを恐れる企業も当然あるため、他のソリューションを検討しています。

これまでのところ、次の 3 つのオプションを見てきました。

  • マルチデータベース (各テナントが独自のものを取得 - 顧客ごとに 1 つのサーバーとほぼ同じ)
  • マルチスキーマ (MySQL では使用できません。各テナントは共有データベースで独自のスキーマを取得します)
  • 共有スキーマ (現在のアプローチで、各列に識別レコードを追加する可能性があります)

Multi-Schema が私のお気に入りです (コストを考慮すると)。ただし、新しいアカウントを作成して移行を行うのは、すべてのスキーマを繰り返し処理し、それらのテーブル/列/定義を変更する必要があるため、非常に面倒なようです。

Q:マルチスキーマは、テナントごとにわずかに異なるテーブルを持つように設計されているようです。これは望ましくありません。テーブル構造がすべてのテナント間で共有される、マルチスキーマ マルチテナント ソリューションを使用できる RDBMS はありますか?

PS マルチとは、超マルチ (10.000 以上のテナント) のようなものを意味します。

4

4 に答える 4

107

ただし、データが危険にさらされることを恐れる企業も当然あるため、他のソリューションを検討しています。

これは残念なことです。物理的な分離だけで十分なセキュリティを提供できるという誤解に顧客が悩まされることがあるからです。

Multi-Tenant Data Architectureというタイトルの興味深い MSDN 記事があり、確認することをお勧めします。これは、著者が共有アプローチに対する誤解に対処した方法です。

よくある誤解は、適切なレベルのセキュリティを提供できるのは物理的な分離だけだというものです。実際、共有アプローチを使用して保存されたデータも強力なデータ安全性を提供できますが、より洗練された設計パターンを使用する必要があります。

技術的およびビジネス上の考慮事項については、この記事では、特定のアプローチが別のアプローチよりも適切な場合について簡単に分析しています。

サービスを提供すると予想されるテナントの数、性質、およびニーズはすべて、さまざまな方法でデータ アーキテクチャの決定に影響します。以下の質問の中には、より孤立したアプローチにバイアスをかけるものもあれば、より共有されたアプローチにバイアスをかけるものもあります。

  • ターゲットとする見込みテナントは何人ですか?権限を持って将来の使用を見積もるにはほど遠いかもしれませんが、桁違いに考えてみてください。何百ものテナント用のアプリケーションを構築していますか? 数千?何万もの?もっと?テナント ベースが大きくなると予想されるほど、より共有されたアプローチを検討する可能性が高くなります。

  • 平均的なテナントのデータが占めると予想されるストレージ容量はどれくらいですか? 一部またはすべてのテナントが非常に大量のデータを格納することが予想される場合は、個別のデータベース アプローチがおそらく最適です。(実際、データ ストレージの要件により、いずれにせよ分離データベース モデルを採用する必要がある場合があります。その場合、後で分離データベース アプローチに移行するよりも、最初からそのようにアプリケーションを設計する方がはるかに簡単です。)

  • 平均的なテナントがサポートすると予想される同時エンド ユーザー数は? 数値が大きいほど、エンド ユーザーの要件を満たすために、より分離されたアプローチが適切になります。

  • テナントごとのバックアップや復元機能など、テナントごとの付加価値サービスを提供する予定はありますか? このようなサービスは、より分離されたアプローチによって提供しやすくなります。


更新:予想されるテナント数についてさらに更新します。

予想されるテナント数 (10k) では、すべてではないにしても、ほとんどのシナリオでマルチデータベース アプローチを除外する必要があります。10,000 のデータベース インスタンスを維持し、毎日何百もの新しいインスタンスを作成しなければならないという考えを気に入るとは思いません。

このパラメーターだけを見ると、共有データベース、単一スキーマのアプローチが最も適しているように見えます。テナントごとに約 50Mb を格納するだけで、テナントごとのアドオンがないという事実は、このアプローチをより適切なものにします。

上記の MSDN の記事では、共有データベース アプローチのセキュリティに関する考慮事項に対処する 3 つのセキュリティ パターンについて言及しています。

アプリケーションのデータ安全対策に自信がある場合は、強力なデータ安全保証を提供するサービス レベル アグリーメントをクライアントに提供できます。SLA では、保証とは別に、データが危険にさらされないようにするために講じる対策についても説明できます。

更新 2:どうやら Microsoft の担当者が移動したか、このテーマに関する新しい記事を作成したようです。元のリンクはなくなり、これが新しいリンクです:マルチテナント SaaS データベースのテナンシー パターン(Shai Kerer に敬意を表します)

于 2010-02-06T12:13:05.560 に答える
23

私の経験では (SQL Server ではありますが)、各クライアントが独自のデータベースを持つマルチデータベースが最適です。したがって、mySQL や Ruby On Rails の経験はありませんが、私の意見が何らかの価値をもたらすことを願っています。

理由は次のとおりです。

  1. データ セキュリティ/災害復旧。各企業のデータは他の企業とは完全に別々に保存されるため、データが危険にさらされるリスクが軽減されます (コードのバグを導入した場合、他のクライアントのデータを誤って見てはならないことを意味する場合などを考えてください)。特定のデータベースが破損するなどです。クライアントにとってのセキュリティ上の利点はさらに大きくなります (ボーナスの副作用が追加されます!)。
  2. スケーラビリティ。基本的に、スケーラビリティを高めるためにデータを分割します。たとえば、データベースを異なるディスクに配置したり、複数のデータベース サーバーをオンラインにしたり、データベースを移動して負荷を分散したりできます。
  3. 性能調整。1 つの非常に大きなクライアントと 1 つの非常に小さなクライアントがあるとします。使用パターン、データ量などは大きく異なります。必要に応じて、クライアントごとに簡単に調整/最適化できます。

これが役立つ情報を提供してくれることを願っています!他にも理由はありますが、頭が真っ白になりました。それが戻ってきたら、私は更新します:)

編集:
この回答を投稿して以来、10,000 以上のテナントについて話していることが明らかになりました。私の経験は何百もの大規模なデータベースにあります.10,000の個別のデータベースがあなたのシナリオでは管理しにくいとは思わないので、あなたのシナリオではマルチDBアプローチを支持していません. 特に、各テナントのデータ ボリュームが小さいことは明らかです。

とにかく、同様のボートに乗っている他の人に何らかの用途があるかもしれないので、私の答えをここに置いておきます(テナントが少ない)

于 2010-02-06T12:38:30.953 に答える
23

以下は、マルチテナンシーの実装方法に関する Salesforce.com のホワイト ペーパーへのリンクです。

http://www.developerforce.com/media/ForcedotcomBookLibrary/Force.com_Multitenancy_WP_101508.pdf

500 個の文字列列 (Value0、Value1、... Value500) を持つ 1 つの巨大なテーブルがあります。日付と数値は、データベース レベルでネイティブ型に変換できる形式の文字列として格納されます。テナントごとに一意のデータ モデルの形状を定義するメタ データ テーブルがあります。インデックス作成、関係、一意の値などのための追加のテーブルがあります。

なぜ面倒なのですか?

各テナントは、データベース レベルで変更 (テーブルの変更など) を行うことなく、実行時に独自のデータ スキーマをカスタマイズできます。これは確かにこのようなことを行うには難しい方法ですが、非常に柔軟です。

于 2010-09-21T15:58:44.903 に答える
13

あなたが言及したように、テナントごとに1つのデータベースはオプションであり、それにはいくつかの大きなトレードオフがあります. テナント数が 1 桁または 10 代未満などの小規模ではうまく機能しますが、それを超えると管理が難しくなります。移行だけでなく、データベースの稼働を維持するだけでも。

スキーマごとのモデルは、それぞれに固有のスキーマに役立つだけではありませんが、すべてのテナントにわたって移行を実行することは難しくなり、何千ものスキーマで Postgres に問題が発生する可能性があります。

よりスケーラブルなアプローチは、テナントをランダムに分散させ、同じデータベースに格納しますが、異なる論理シャード (またはテーブル) に分散させることです。言語によっては、これに役立つライブラリが多数あります。Rails を使用している場合は、テナンシーを実行するためのライブラリがありacts_as_tenant、テナント クエリがそのデータのみをプルバックするようにするのに役立ちます。gem もありapartmentます。これはスキーマ モデルを使用していますが、すべてのスキーマにわたる移行に役立ちます。Django を使用している場合はいくつかありますが、より一般的なものの 1 つはスキーマ全体にあるようです。これらはすべて、アプリケーション レベルでさらに役立ちます。データベース レベルで直接何かを探している場合、Citusはこの種のシャーディングの作成に焦点を当てています。マルチテナンシーは、Postgres を使用するとすぐに使用できます。

于 2016-09-07T21:07:23.907 に答える