我们的软件当前在MySQL上运行。所有租户的数据都存储在同一架构中。由于我们使用的是Ruby on
Rails,因此我们可以轻松确定哪些数据属于哪个租户。但是,当然有些公司担心其数据可能会遭到破坏,因此我们正在评估其他解决方案。
到目前为止,我已经看到了三种选择:
我最喜欢Multi-Schema(考虑成本)。但是,创建一个新帐户并进行迁移似乎很痛苦,因为我将不得不遍历所有模式并更改其表/列/定义。
问: Multi-Schema似乎被设计为每个租户都有略微不同的表-
我不希望这样。是否有任何RDBMS允许我使用多模式多租户解决方案,其中所有租户之间共享表结构?
PS多指的是类似超级多(10.000+个租户)的东西。
但是,当然有些公司担心其数据可能会遭到破坏,因此我们正在评估其他解决方案。
这是不幸的,因为客户有时会误以为只有物理隔离才能提供足够的安全性。
有一篇有趣的MSDN文章,标题为Multi-Tenant Data Architecture,您可能需要检查一下。这就是作者如何解决对共享方法的误解:
一个普遍的误解认为,只有物理隔离才能提供适当级别的安全性。实际上,使用共享方法存储的数据也可以提供强大的数据安全性,但是需要使用更复杂的设计模式。
至于技术和业务方面的考虑,本文简要分析了某种方法可能比另一种方法更合适的地方:
您期望服务的租户的数量,性质和需求都会以不同的方式影响您的数据体系结构决策。以下某些问题可能会使您偏向于更孤立的方法,而另一些问题可能使您偏向于更共享的方法。
* 您希望定位多少个潜在租户?您可能无法凭一己之力来估计预期用途,但要考虑数量级:您是否正在为数百个租户构建应用程序?几千?成千上万?更多?您期望租户基数越大,您就越有可能考虑采用更共享的方法。
* 您希望普通租户的数据占用多少存储空间?如果您希望某些或所有租户存储大量数据,则最好使用分离数据库方法。(实际上,数据存储要求可能仍然迫使您采用单独的数据库模型。如果是这样,从一开始就以这种方式设计应用程序比以后再采用单独的数据库方法要容易得多。)
更新: 进一步更新预期的租户数量。
对于大多数(如果不是全部)场景,预期的租户数量(10k)应该排除多数据库方法。我认为您不会喜欢维护10,000个数据库实例,每天都必须创建数百个新实例的想法。
仅从该参数来看,似乎最适合共享数据库单模式方法。每个租户将仅存储大约50Mb的事实,并且没有每个租户的附加组件,这一事实使这种方法更加合适。
上面引用的MSDN文章提到了三种安全模式,这些模式解决了共享数据库方法的安全注意事项:
如果您对应用程序的数据安全措施充满信心,则可以为客户提供服务级别协议,以提供强有力的数据安全保证。在SLA中,除了保证之外,您还可以描述将要采取的确保数据不被破坏的措施。
更新2:
显然,Microsoft伙计们移动/撰写了有关此主题的新文章,原始链接不见了,这是新链接:多租户SaaS数据库租用模式(对Shai Kerer表示感谢)
问题内容: 即使对于基于文件的存储,也不希望其他人打开进程中的HSQLDB数据库。 该文档提示这是可能的:服务器模式,高级主题,但是我还没有找到有关如何激活此行为的URL。 有没有人这样做,以便他们可以共享方法? 问题答案: 以下对我有用: 从您的代码启动服务器,该代码显示在HSQLDB源代码的org.hsqldb.test.TestBase代码中。就像是: 在同一个JVM中,以与普通(非服务器)
如何使用django租户模式将数据从共享模式迁移到多租户模式? 我们有一个saas,最初没有使用django租户模式,而是使用共享数据库、共享模式的方法。我们现在发现了django租户模式,并认为这是正确的选择。 现在的问题是如何将数据从单一的模式迁移到独立的租户模式。 文档说明如下: 注意:如果这是您第一次运行此命令,您的数据库应该是空的。 在我现有的应用程序中,我有一个租户表,所有其他模型都有
问题内容: 我有两个共享大量代码的JSF项目-Java类,xhtml文件,标记库,css和javascript文件等。我的开发环境/平台主要包括Eclipse,Ant,Perforce和Tomcat。 有没有人找到一种创建和组织共享代码的方法,以便公用代码可以保留在一组文件夹中? Eclipse使添加Java源的外部文件夹变得容易,但是在其他文件类型上却不足。我将不胜感激。 问题答案: 在Ecli
我们正在开发一个多租户应用程序。在体系结构方面,我们为业务逻辑设计了共享中间层,为数据持久性设计了每个租户一个数据库。也就是说,业务层将与每个租户的数据库服务器建立一组连接(连接池)。这意味着应用程序为每个租户维护单独的连接池。如果我们预计约有5000个租户,那么这个解决方案需要高资源利用率(每个租户的应用服务器和数据库服务器之间的连接),这会导致性能问题。 我们已经通过保持公共连接池解决了这个问
问题内容: 让我们说我需要设计一个数据库,该数据库将托管多个公司的数据。现在出于安全和管理目的,我需要确保正确隔离了不同公司的数据,但我也不想启动10个mysql进程来在10个不同的服务器上托管10个公司的数据。使用mysql数据库执行此操作的最佳方法是什么。 问题答案: 多租户数据库有几种方法。为了进行讨论,它们通常分为三类。 每个租户一个数据库。 共享数据库,每个租户一个模式。 共享数据库,共
这是我第一次尝试将更复杂的对象存储到数据库中。我需要一些关于数据库设计的帮助。 要存储并从数据库中重新生成的recipe对象 最复杂的部分是对象。每个食谱可以有不同数量的步骤和不同的配料分配给每一个步骤。 我做了另一个设计,其中与以及与相结合。我认为第一种布局更容易查询,因为我只需查看就可以通过进行搜索,但我不确定。有什么想法吗?