【问题标题】:Multi-tenancy application: one database or multiple copies of same database多租户应用:一个数据库或同一数据库的多个副本
【发布时间】:2014-09-10 21:16:47
【问题描述】:

这是更多的建筑问题。创建多租户应用程序的最佳实践是什么?为所有租户使用单一数据库还是为每个租户使用单独的架构/数据库实例?

【问题讨论】:

  • 您期望拥有多个数据库有什么好处?显然,单个数据库更简单,因此您应该确定使用重复数据库的理由(安全性、模块化等)。但是,在做“可能可行的最简单的事情”方面犯了错误。
  • 在我看来,多数据库的主要好处是它提供了租户数据的物理隔离。此外,潜在的租户数据库可以部署在租户服务器上,允许他们快速轻松地进行数据挖掘操​​作
  • 一般来说,我不认为物理隔离有那么大的价值(这并不意味着它在您的特定情况下没有价值)。同样,您可以相当容易地为客户提供数据库中数据子集的转储。如果这些是真正的问题,而不是未来的“潜在”功能,那么重复数据库可能是有意义的。但是为未来做计划很棘手,而且为了可能发生的事情而过度复杂化您的基础架构可能会反过来咬您一口。

标签: java architecture multi-tenant


【解决方案1】:

这里的真正问题是整体客户(或者更确切地说是激活)服务隔离,可以在数据库层的不同资源共享级别上考虑:

  • 应用程序逻辑级别:不需要单独的架构/数据库,可以有更好的性能,可以导致更好的资源优化,可以帮助实现交叉激活逻辑(如果有的话)但提供最少的隔离:一次激活可能会影响(由于错误行为加上限制不足或仅仅由于错误)其他激活的所有数据、性能和可用性服务级别。
  • 架构级别:同上,但激活几乎不可能影响其他激活的数据服务级别,而且应用程序逻辑问题更难做到这一点。
  • 数据库级:同上,但更强;从这一点开始,备份数据开始变得更加复杂。
  • 数据库服务进程级别:同上,但应用程序几乎不可能影响交叉激活数据服务级别。此外,可以在操作系统级别对性能隔离进行更多的性能调整,但计算和 I/O 资源仍然是共享的,因此也不可能进行可用性隔离。
  • 数据库虚拟实例(=虚拟服务器)级别:同上,但不太可能出现交叉激活性能和可用性问题,但当虚拟服务器位于同一物理硬件上时,仍然不是不可能的。
  • 数据库物理实例(=物理服务器)级别:同上,但实际上不可能出现交叉激活性能和可用性问题。

上述推理仅针对 DB 层,通常是最底层,但类似的推理也可以应用于任何其他层。

也就是说,为了在所有关注点(I/O、网络、计算、可用性等)中实现真正全面的客户服务级别隔离,您必须完全放弃多租户和任何形式的资源共享。在极端情况下,这种推理意味着您需要一个单独的物理 IDC,每次激活都具有专用连接。

【讨论】:

    【解决方案2】:

    故事的更多信息。该公司要求我对多租户的意见是使用共享主机启动 - 所以他们可以使用的数据库实例的数量是有限的。

    这是我对请求者的建议: 使用单数据库解决方案,因为这不需要额外费用

    为了满足租户数据隔离的要求,我建议使用 Views 而不是 Tables 解决方案。 视图而不是表: 1.当前用户直接从表中选择数据 2. 在未来状态下,DB 中的表将隐藏在视图中。该视图将使用当前登录的数据库用户作为选择标准。这样就完成了虚拟租户数据隔离。

    【讨论】:

    • 这其实是一个非常好的提议,我一定会考虑的。
    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多