如何创建具有共享表结构的多租户数据库?


129

我们的软件当前在MySQL上运行。所有租户的数据都存储在同一架构中。由于我们使用的是Ruby on Rails,因此我们可以轻松确定哪些数据属于哪个租户。但是,当然有些公司担心其数据可能会遭到破坏,因此我们正在评估其他解决方案。

到目前为止,我已经看到了三种选择:

  • 多数据库(每个租户都有自己的-每个客户几乎与1台服务器相同)
  • 多模式(在MySQL中不可用,每个租户都在共享数据库中获得自己的模式)
  • 共享模式(我们当前的方法,可能在每列上都有其他标识记录)

我最喜欢Multi-Schema(考虑到成本)。但是,创建一个新帐户并进行迁移似乎很痛苦,因为我将不得不遍历所有模式并更改其表/列/定义。

问: Multi-Schema似乎被设计为每个租户都有略微不同的表-我不想要这个。是否有任何RDBMS允许我使用多模式多租户解决方案,其中所有租户之间共享表结构?

PS多重代表我的意思是超级多重(10.000+个租户)。


1
“ Multi-Schema似乎被设计为每个租户具有略微不同的表”那么?多模式和所有相同的表有什么问题?您是说不想在所有架构中重新创建相同的表结构吗?还是说您不能在所有架构中创建相同的结构?
S.Lott

为好/有趣的问题+1
AdaTheDev

2
@ S.Lott我希望每天有10.000+个租户,每天进行100多个注册。在单个表定义中具有数百万个条目(定义=共享,数据=隔离)使我感觉好于在成千上万个表定义中具有成千上万个条目。既然没有多少人这样做,那么我对多重模式并不那么自信。
Marcel Jackwerth'2

1
我同意Daniel的观点,根据这些数字,不包括多数据库。我已经更新了我的答案以反映这一点,但更多地保留了历史。共享方法肯定确实是最合理的方法。
AdaTheDev

2
dynjo的答案:“ 大文章从瑞安比格确切的主题”
费利克斯·加侬-格雷尼尔

Answers:


95

但是,当然有些公司担心其数据可能会遭到破坏,因此我们正在评估其他解决方案。

这是不幸的,因为客户有时会误以为只有物理隔离才能提供足够的安全性。

有一篇有趣的MSDN文章,标题为Multi-Tenant Data Architecture,您可能需要检查一下。这就是作者如何解决对共享方法的误解:

一个普遍的误解认为,只有物理隔离才能提供适当级别的安全性。实际上,使用共享方法存储的数据也可以提供强大的数据安全性,但是需要使用更复杂的设计模式。

至于技术和业务方面的考虑,本文简要分析了某种方法可能比另一种方法更合适的地方:

您期望服务的租户的数量,性质和需求都以不同的方式影响您的数据体系结构决策。以下某些问题可能会使您偏向于一种更孤立的方法,而另一些问题可能使您偏向于一种更加共享的方法。

  • 您预计要定位多少个潜在租户?您可能无法凭一己之力来估计预期的用途,但要考虑数量级:您是否正在为数百个租户构建应用程序?几千?成千上万?更多?您期望租户基数越大,您就越有可能考虑采用更共享的方法。

  • 您希望普通租户的数据占用多少存储空间?如果您期望某些或所有租户存储大量数据,则使用单独数据库方法可能是最好的。(实际上,数据存储要求可能仍然迫使您采用单独的数据库模型。如果是这样,那么从一开始就以这种方式设计应用程序比以后再采用单独的数据库方法要容易得多。)

  • 您希望普通租户支持多少个并发最终用户?数量越大,越能满足最终用户需求的方法越合适,越孤立。

  • 您是否希望提供任何按租户的增值服务,例如按租户的备份和还原功能?通过更隔离的方法更容易提供此类服务。


更新:进一步更新预期的租户数量。

对于大多数(如果不是全部)场景,预期的租户数量(10k)应该排除多数据库方法。我认为您不会喜欢维护10,000个数据库实例,每天都必须创建数百个新实例的想法。

仅从该参数来看,似乎最适合共享数据库单模式方法。每个租户将仅存储大约50Mb的事实,并且没有每个租户的附加组件,这一事实使这种方法更加合适。

上面引用的MSDN文章提到了三种安全模式,这些模式解决了共享数据库方法的安全注意事项:

如果您对应用程序的数据安全措施充满信心,则可以为客户提供服务级别协议,以提供强有力的数据安全保证。在SLA中,除了保证之外,您还可以描述将要采取的确保数据不被破坏的措施。

更新2:显然,Microsoft伙计们移动/撰写了有关此主题的新文章,原始链接不见了,这是新链接:多租户SaaS数据库租用模式(对Shai Kerer表示感谢)


1
哦,我昨天浏览了该文章,并跳过了误解部分。需要再次阅读。
Marcel Jackwerth'2

1
@Marcel:但是,除了客户对安全性的理解之外,我相信您决定采用哪种多租户方法应基于我在MSDN文章中引用的以下4点:1.预期的租户数量。-2.每个租户的预期存储需求。-3.预期的并发最终用户数。-4.预期的每租户附加组件。
丹尼尔·瓦萨洛

1
感谢您指出该部分。数量= 10k,存储= 50mb,并发最终用户=每个租户2个,附加组件=0。因此,采用共享方法的当前状况似乎是最合理的。我想下周我会打一些电话,以了解客户的真正需求/期望。德国和数据/ IT安全是一个非常艰难的故事。
Marcel Jackwerth'2

1
只是对于从现在开始阅读本文的用户而言,所提到的文章已经不存在,有人抄袭了吗?
gmslzr

1
@guillesalazar我不知道它的同一个,但我想它是- docs.microsoft.com/en-us/azure/sql-database/...(@DanielVassallo如果是一样的,或许考虑更新的链接您的答案:
Shai Kerer

20

我的经验(尽管有SQL Server)是,多数据库是必经之路,每个客户端都有自己的数据库。因此,尽管我没有mySQL或Ruby On Rails的经验,但我希望我的输入可能会增加一些价值。

原因包括:

  1. 数据安全/灾难恢复。每个公司的数据都与其他公司完全分开存储,从而降低了数据被泄露的风险(例如,如果您引入了代码错误,则意味着某些情况下如果不该错误地查看其他客户数据,就可以避免此类损失)特定的数据库被破坏等。给客户带来的安全利益更大(增加了额外的副作用!)
  2. 可扩展性。本质上,您将对数据进行分区以实现更大的可伸缩性-例如,数据库可以放在不同的磁盘上,您可以使多个数据库服务器联机并使数据库移动更容易分散负载。
  3. 性能调优。假设您有一个很大的客户,一个很小的客户。使用模式,数据量等可以有很大的不同。您可以根据需要为每个客户端更轻松地进行调整/优化。

我希望这能提供一些有用的输入!还有更多原因,但是我的想法变得一片空白。如果它恢复正常,我将更新:)

编辑:
自从我发布了这个答案以来,现在很明显,我们正在与10,000多个租户交谈。我的经验是在数百个大型数据库中-我认为对于您的方案而言,10,000个单独的数据库不会太容易管理,因此我现在不赞成在您的方案中使用多数据库方法。尤其是现在很明显,您正在为每个租户谈论小数据量!

无论如何都要保持我的答案,因为它可能对类似船只(租户较少)中的其他人有所帮助


是的,对不起,我没有早点澄清。仍然+1。;)
Marcel Jackwerth 2010年

谈到数据安全性,您是否会说每个数据库都应放在单独的服务器/ VM上?还是将所有数据库放在具有不同sql用户的单个/群集服务器上是否足够安全?
谢伊

@Shay-不,不需要将它们放置在单独的服务器上-假设您有100个,这是开始时需要使用的许多服务器实例/许可证。进一步了解Daniel的答案,那里有一些很好的链接。
AdaTheDev

我会反驳说,即使多数据库意味着10,000个单独的数据库并大大增加了维护成本,您仍然可以在云基础架构上使用自动化脚本来驯服这头野兽,从而使所有内容都以编程方式进行管理,几乎不需要人工就可以完成
Korayem

17

以下是Salesforce.com上白皮书如何实现多租户的链接:

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

它们有1个巨大的表,带有500个字符串列(Value0,Value1 ... ... Value500)。日期和数字以格式存储为字符串,以便可以在数据库级别将其转换为其本机类型。有元数据表定义了数据模型的形状,每个租户可以是唯一的。还有用于索引,关系,唯一值等的其他表。

为什么要麻烦?

每个租户都可以在运行时自定义自己的数据模式,而不必在数据库级别(更改表等)进行更改。这绝对是执行此类操作的困难方法,但非常灵活。


10

正如您提到的,每个租户一个数据库是一个选项,并且确实有一些较大的折衷。它可以在较小的规模上很好地工作,例如个位数或十位以下的租户,但除此之外,它变得更难管理。不仅是迁移,而且还只是保持数据库的正常运行。

每个模式模型不仅对于每个模式都有用,尽管仍然难以在所有租户之间进行迁移,而且在1000个模式下,Postgres可能会遇到麻烦。

更具可扩展性的方法是绝对让租户随机分布,存储在同一数据库中,但跨不同的逻辑分片(或)。根据您的语言,有许多库可以帮助您解决此问题。如果您使用的是Rails,则可以使用一个库来保存租期acts_as_tenant,这有助于确保租户查询仅拉回该数据。还有一个瑰宝apartment-尽管它使用模式模型,但确实有助于跨所有模式的迁移。如果您使用的是Django,那么会有很多数字,但是最受欢迎的数字之一似乎是跨模式的。所有这些都在应用程序级别提供了更多帮助。如果您正在直接在数据库级别上寻找更多东西,Citus致力于为您提供这种类型的分片与Postgres一起进行多租户工作更加容易。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.