2

現在、MySQL が 100 以上のデータベースを実行しているシングルテナント データベース アーキテクチャがあります。Apartment gemを使用してサブドメインのデータベース接続を切り替えると、すべてがうまくいきます!

ただし、既存のクライアントのグループからすべてのデータにアクセスできる、いわゆる「傘」クライアントを作成する必要があります。私たちの単一テナント データベース アーキテクチャではこれがすぐに実現できるとは思えません (調べてみたところ、複数の MySQL データベースにクエリを実行するのは地獄のように思えました)。そのため、Postgres スキーマを使用したさまざまな実装を検討し始めています。

私はいくつかのアドバイスを探しています:

  • Postgres で複数のスキーマを照会し、結果を何らかの方法で照合することは可能ですか (Rails の実装を探しています)? 主キーの競合による問題を予測できますか?

  • アクセスする必要があるスキーマのグループ内のすべてのデータを何らかの形で表す/複製する新しいスキーマを作成する方がよいでしょうか? リアルタイムである必要があります。

  • もしそうなら、MySQL を使用した現在の複数の DB セットアップで同様のことを達成できますか? (痛みを最小限にするため)

MySQL でマルチテナンシーを実現するためにデータベース フィールドを使用することには慎重です。データ セキュリティ/プライバシーはこの製品にとって非常に重要であり、開発者のエラーが発生する可能性が非常に高いからです。

4

4 に答える 4

2

Railsアプリケーションでマルチテナンシーを始めようとしたとき、多くの例を見つけましたが、完全に快適に感じられるものを見つけることもできませんでした。しかし、私は最終的に私が満足している解決策を見つけました。

「スコープ付きマルチテナンシー」レールキャストから始めました

http://railscasts.com/episodes/388-multitenancy-with-scopes

次に、このガイドを使用して、デバイスのサブドメインでマルチテナンシーを機能させる方法を検討しました。

https://github.com/plataformatec/devise/wiki/How-To:--Isolate-users-to-log-into-a-single-subdomain

しかし、私はそれを額面どおりに受け取っていませんでした。私は、deviseがそのようにどのように機能するかを本当に理解するために飛び込みました.

すべての準備が整うと、マルチテナント gem の準備が整いました。

https://github.com/wireframe/multitenant

しかし、私はそこで止まりませんでした。multitenant gem では、スコープを適切に設定したいときはいつでも Multitenant.with_tenant と言う必要があるため、次のような TenantController を作成しました。

  around_filter :scope_current_tenant

  def scope_current_tenant
    begin
      Firm.current = Firm.find_by_subdomain!(request.subdomain)
    rescue
      raise ActionController::RoutingError.new('Not Found')
    end

    Multitenant.with_tenant Firm.current do
      yield
    end

    ensure
      Firm.current = nil
    end
  end

そして、テナントによってスコープされたいコントローラーは、ApplicationController ではなく TenantController から継承します。そうすれば、コントローラーの詳細について何も覚えておく必要がなく、「うまくいった」だけです。開発者が考えなければならなかった唯一のことは、「これはテナント データを処理しているコントローラーか?」ということでした。

これはまだ開発者がいくつかのことを正しく行うことに依存していますが (適切なコントローラーから継承し、モデルで 'acts_as_multitenant' を指定します)、実際には非常にうまく機能します。

于 2013-06-24T20:56:41.590 に答える
1

OBS: 私は Ruby の専門家ではないので、PG 側のアイデアしか提供できません。

PostgreSQL スキーマを使用すると、簡単に管理できます。テナントごとにスキーマを作成するだけなので、アプリケーションでテナントを変更する必要がある場合は、次のようにします。

SET search_path TO client1;

これにより、テーブルに対してクエリを実行するとき、たとえばcustomer、同じ接続でのみ実行する必要があります。

SELECT ... FROM customer ...;

また、( にない) 別のテナントを照会する必要がある場合はsearch_path、スキーマを使用してテーブルを照会できます。

SELECT ... FROM client2.customer ...;

また、別のスキーマを使用して、スキーマのように公開情報を格納できますpublic。それを の末尾に追加するだけですsearch_path

SET search_path TO client1, public;
于 2013-06-24T17:32:28.590 に答える
-3

あなたはすでに現在のシステムにかなり投資しているように聞こえますが、NoSQL ソリューションにより適した仕事のように聞こえるので、言いたくないです。

具体的には、「スキーマレス」のキー値データベース設計を使用する MongoDB を考えています。これにより、キーに基づいてデータベースからデータを取得し、ソフトウェアで並べ替えることができます。MongoDB はシャーディングもサポートしているため、1 つのデータベースを必要なだけ多くのデータベース サーバーで使用できます。これは、アプリケーションでうまく機能するように思えます。http://www.mongodb.org/のドキュメントは、チェックする価値があるかもしれません。それが完璧にフィットするかどうかはわかりませんが、あなたのアプリケーションではうまくいくように思えます.

于 2013-06-24T16:14:16.990 に答える