多租户MySQL数据库中的数据虚拟分离

时间:2012-08-21 13:39:04

标签: mysql mongodb database-schema multi-tenant

这更像是一个概念性问题,因此如果它们能够实现相同的概念,那么堆栈的变化是受欢迎的。我们目前正在使用MySQL并将一些服务扩展到MongoDB。

我们的想法是,我们希望能够管理单个物理数据库模式/结构,以便调整,扩展等不会变得过于繁琐,因为使用该结构的客户端数量增长到数千,数十个但是,我们希望在这个级别上分离他们的数据,而不是简单地在应用层,以提供更严格的分离。是否可以使用相同的结构为每个客户创建虚拟箱,但是它们的数据在结构上是否彼此分离?

通常的方法显然是直接或通过外部关系向每行数据添加客户端密钥,但考虑到我们无法预测20/20我们系统上的黑客攻击可能会导致“跨客户端”数据检索,我想进一步将分离嵌入到几乎结构层面。

我还在这里阅读了另一篇文章:MySQL: how to do row-level security (like Oracle's Virtual Private Database)?使用“视图”作为方法但是这似乎在客户列表中越大越好。

谢谢!

----编辑----

根据以下建议的一些文献,这里有关于我们意图的更多信息:

@Stennie提供的MSDN文章中概述的最接近的情况将是单个数据库,多模式,但不同的是,我们对创建后自定义客户端模式不感兴趣,我们实际上更喜欢它们仍然锁定在父/主模式上。

理想情况下,解决方案会将每个架构保持链接到父表集结构,而不是简单地复制它,希望对所有客户端/租户架构级别对父架构或主架构进行任何更改。

更进一步,在一个集群中,我们可以拥有一个具有主模式的主服务器,并且每个服务器都可以从中复制,但使用一组分片的租户。然后,可以在不中断的情况下通过集群对主服务器进行更改,并保持所有实例的一致性,从而使我们能够更快地更新应用程序层,因为所有数据库都与更新的模式兼容。

希望有道理,我在这个级别上仍然有点新鲜。

1 个答案:

答案 0 :(得分:1)

有一些常见的基础架构方法,从“无共享”(又名multi-instance)到“分享所有内容”(又名multi-tenant)。

例如,对“虚拟容器”的直接方法是使用共享数据库服务器为每个客户端分配数据库。这是在两个共享极端之间的某个地方,因为您的客户将共享数据库服务器基础结构,但保持他们的数据和模式分离。

每个客户端的数据库方法允许您:

  • 使用数据库的身份验证和管理来管理每个客户端的身份验证和访问权限。访问控制
  • 支持不同的数据库软件(你提到使用支持视图的MySQL和没有支持视图的MongoDB)
  • 更轻松地为每个客户端备份和恢复数据
  • 避免数据库级别的潜在跨客户端泄漏
  • 避免单个大型数据库的表过度增长和相关管理问题

一些潜在的缺点包括:

  • 拥有更多要管理的数据库
  • 对于要强制执行某些架构(即MySQL)的数据库,您需要在所有数据库中应用架构更改或支持某种形式的版本控制
  • 对于预分配存储的数据库(即MongoDB),您可以为每个客户端使用更多存储空间(特别是如果您的实际数据量很小)。
  • 您可能会遇到名称空间或打开文件的限制
  • 您仍然需要担心应用程序和数据安全性:)

如果您对多租户进行一些研究,您会发现一些其他解决方案,从这个示例(共享数据库服务器架构上的每个客户端的隔离数据库)到更复杂的分区数据方案。

此Microsoft文章包含有关方法和注意事项的有用概述:Multi-tenant SaaS database tenancy patterns