mysql - Rails Multi-Tenancy 架构,限定对多个租户的访问

标签 mysql ruby-on-rails postgresql rails-postgresql multi-tenant

我们目前采用单租户数据库架构,MySQL 运行超过 100 个数据库。我们使用 Apartment gem 在子域上切换数据库连接,一切都很好!

但是,我们现在需要创建所谓的“Umbrella”客户端,它可以访问一组现有客户端的所有数据。我不认为这对于我们的单租户数据库架构来说是立即可行的(我调查了一下,查询多个 MySQL 数据库似乎很糟糕),所以我开始研究 Postgres 模式的不同实现。

我正在寻找一些建议:

  • 是否可以在 Postgres 中查询多个模式并以某种方式整理结果(寻找 Rails 实现)?我可以预见主键冲突的问题吗?

  • 有一个新的模式会更好吗? 表示/复制需要的模式组中的所有数据 被访问?它需要是实时的。

  • 如果是这样,可以在我当前的多数据库中实现类似的东西吗 使用 MySQL 设置? (尽量减少痛苦)

我对使用数据库字段在 MySQL 中实现 Multi-Tenancy 持谨慎态度,因为数据安全/隐私对该产品来说是一件大事,而且开发人员犯错误的可能性很大。

最佳答案

尽管在我第一次着手使用 Rails 应用程序时发现了许多 Multi-Tenancy 示例,但我也找不到一个让我感到完全舒服的示例。但我终于有了一个令我满意的解决方案。

我从“范围 Multi-Tenancy ”railscast 开始

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

然后使用本指南研究如何使用设计子域进行 Multi-Tenancy 工作:

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

但我并没有从表面上接受它;我一头扎进去,真正理解设计是如何工作的。

一旦我准备好所有这些,我就可以使用 Multi-Tenancy gem:

https://github.com/wireframe/multitenant

但我并没有就此止步。 Multi-Tenancy 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

然后我希望租户范围内的任何 Controller 都继承自 TenantController 而不是 ApplicationController。这样我就不必记住 Controller 的任何细节,它“正常工作”。开发人员唯一需要考虑的是“这是一个处理租户数据的 Controller 吗?”

虽然这仍然取决于开发人员正确地做一些事情(从正确的 Controller 继承,在模型中说“acts_as_multitenant”,但它在实践中确实运作良好。

关于mysql - Rails Multi-Tenancy 架构,限定对多个租户的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17279141/

相关文章:

mysql - 无法启动 MySQL 服务器 - 控制进程退出并出现错误代码

ruby-on-rails - Rails 5 ActionCable 应用程序未定义

postgresql - 具有动态参数的postgres存储过程中的语法错误

php - 出现错误数据库未选择

performance - 简单的 MySQL 查询需要很长时间

php - mySQLi 永远插入脚本

javascript - React-on-Rails,传递和格式化 props?

mysql - Rails + MySQL + Transactions + Locking,如何防止打开事务解锁表?

python - Django 数据迁移类型转换问题

postgresql - psql 无法连接到 IP 和端口 5432 上的 PostgreSQL 服务器(postmaster)?