2

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

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

正常的方法显然是直接或通过外部关系将客户端密钥添加到每一行数据,但鉴于我们无法预见 20/20 的情况下我们的系统可能会如何发生黑客攻击,从而允许“跨客户端”数据检索,我想要更进一步,将分离嵌入到一个几乎结构层面。

我还在这里阅读了另一篇文章:MySQL:如何进行行级安全性(如 Oracle 的虚拟专用数据库)?它使用“视图”作为一种方法,但是随着客户列表的增加,这似乎变得更有效。

谢谢!

- - 编辑 - -

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

@Stennie 提供的 MSDN 文章中概述的三者中最接近的情况是单个数据库、多模式,但不同之处在于,我们对创建后自定义客户端模式不感兴趣,我们实际上希望它们保持锁定到父/主模式。

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

更进一步,在集群中,我们可以有一个具有主模式的主控,每个从属从它复制,但有一组分片的租户。然后可以在不中断的情况下通过集群过滤对主节点的更改,并在所有实例之间保持一致性,还允许我们更快地更新应用程序层,因为我们知道所有数据库都与更新的模式兼容。

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

4

1 回答 1

1

有一些常见的基础设施方法,从“不共享”(又名multi-instance)到“共享一切”(又名multi-tenant)。

例如,“虚拟箱”的一种直接方法是使用共享数据库服务器为每个客户端分配一个数据库。这介于两个共享极端之间,因为您的客户将共享数据库服务器基础设施,但将他们的数据和架构分开。

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

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

一些潜在的缺点包括:

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

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

这篇 Microsoft 文章包括对方法和注意事项的有用概述:多租户 SaaS 数据库租户模式

于 2012-08-21T15:00:38.643 回答