【问题标题】:Any thoughts on Multi-tenant versus Multi-database apps in Rails关于 Rails 中的多租户与多数据库应用程序的任何想法
【发布时间】:2009-09-15 15:58:21
【问题描述】:

我们的应用目前为每个客户生成一个新数据库。我们开始怀疑是否应该考虑将其重构为多租户系统。

我们应该考虑哪些好处/权衡?在 Rails 中实现多租户应用的最佳实践是什么?

【问题讨论】:

    标签: ruby-on-rails web-applications


    【解决方案1】:

    我一直在研究同样的事情,只是发现这个演示文稿提供了一个有趣的解决方案:使用 Postgre 的模式(有点像命名空间)在数据库级别分离数据,同时将所有租户保持在同一个数据库中并保持(主要是) 对轨道透明。

    Writing Multi-Tenant Applications in Rails - Guy Naor

    【讨论】:

      【解决方案2】:

      多租户系统将为您带来一系列问题。我的快速想法如下

      • 必须检查所有 SQL 并 重构为包含一个 ClientId 价值。

      • 必须检查所有索引以 确定 ClientId 是否需要 包括

      • SQL 语句中的错误 生产中的开发人员/系统管理员将 影响您的所有客户。

      • 数据库损坏/问题将 影响您的所有客户

      • 您有一些数据隐私问题 由此糟糕的代码/实现可能 允许客户A查看属于的数据 给客户B

      • 一位使用您的系统的客户 沉重/激进的方式可能会影响 其他客户对性能的看法

      • 根据个人客户偏好定制静态数据变得更加复杂。

      我确信还有许多其他问题,但这些是我最初的想法。

      【讨论】:

      • 谢谢 steve.. 你听起来不太迷恋.. 你认为这样做有什么好处?
      • 嗯。多数据库方法也有很多缺点。如果我正在设计一个系统,它往往是多租户的,特定的大客户可能会拆分到一个单独的系统上。多租户系统确实有一些好处。数据库的数量之多成为管理上的难题。脚本更新多个数据库等也很痛苦。
      【解决方案3】:

      这真的取决于你在做什么。

      我们正在为印刷行业制定一个 MIS 程序,用于跟踪库存、员工、客户、设备,并进行一些认真的计算,以根据大量输入变量估算执行工作的成本。

      我们预计每个客户都有非常大的数据库,目前我们有 170 个表。为几乎每个表添加另一列只是为了存储 client_id 伤害了我的大脑。

      我们目前处于计划的测试阶段,以下是我们遇到的一些情况:

      • 迁移: Rails 假设您将只有 1 个数据库。您可以针对多个数据库进行调整,迁移就是其中之一。您需要一个自定义 rake 任务来将迁移应用到所有现有数据库。准备好进行大量故障排除,因为迁移可能在一个数据库上成功,但在另一个数据库上失败。
      • 生成数据库:如何创建新数据库?从 SQL 文件、复制现有数据库或运行所有迁移?如何在表创建系统和实时数据库之间保持架构一致?
      • 连接到适当的数据库:我们使用 cookie 来存储映射到正确数据库的唯一值。我们在 Authorized 控制器中使用 before 过滤器,它继承自 ActionController,从该唯一值获取 db,并在 ActiveRecord::Base 的子类上使用建立连接方法。这使我们可以从公共数据库中提取一些模型,而从客户端的特定数据库中提取其他模型。

      如果您对此有任何具体问题,我可以提供帮助。

      【讨论】:

      • 我们的应用程序的工作原理与您在上面概述的一样。我们一直在迁移数据库时遇到问题,并且发现我们的开发可能会漂移到不同的不一致模式中,这会导致在我们想要部署时尝试合并时付出很多努力。将我们的应用程序重构为多租户系统的主要吸引力在于,我们不必担心大量的数据库ergo less 迁移逻辑,我们可以基于单个数据库扩展我们的应用程序,并且可以构建一组更简洁的管理工具..
      【解决方案4】:

      我个人对此没有任何经验,但在 2009 年 Ruby Hoedown 的闪电演讲中,Andrew Coleman 展示了他设计并用于带有子域的 rails 中的多租户数据库的插件。你可以check out the lightning talk slides,这里是acts_as_restricted_subdomain repository

      【讨论】:

        【解决方案5】:

        你为什么要这样做?您是否在用户之间进行了大量聚合,或者您是否产生了太多的数据库?您是否考虑过为每个租户使用 SQLite 文件而不是共享数据库服务器(因为多租户应用程序通常是低配置的,不需要那么多并发性)?

        【讨论】:

        • 我们考虑了这一点,但是在负载平衡的 Web 服务器配置中,我们会在跨不同 Web 服务器使用 sqllite 时遇到问题,因此选择了 2 层方法
        猜你喜欢
        • 1970-01-01
        • 2018-08-29
        • 2017-12-23
        • 1970-01-01
        • 2014-01-26
        • 2014-11-01
        • 1970-01-01
        • 2015-03-04
        • 1970-01-01
        相关资源
        最近更新 更多