【问题标题】:Virtual Segregation of Data in Multi-tenant MySQL Database多租户 MySQL 数据库中的数据虚拟隔离
【发布时间】:2012-08-21 13:39:03
【问题描述】:

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

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

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

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

谢谢!

---- 编辑----

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

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

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

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

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

【问题讨论】:

    标签: mysql mongodb database-schema multi-tenant


    【解决方案1】:

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

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

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

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

    一些潜在的缺点包括:

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

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

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

    【讨论】:

    • 谢谢斯坦尼!我一直假设这样做的唯一现实世界方法是在同一个基础设施上独立的数据库,就像你指出的那样......根据这种思路,我们可能只提供优质服务。对此的明显关注是保持一致性。您是否知道其他提供我梦寐以求的东西的数据库... oracle...MS...Maria?如果它在那里并且朝这个方向发展,如果成本/收益合适,我可能会考虑等待甚至迁移。
    • 顺便说一句,那篇 MSDN 文章非常有助于说明使用当前功能和优缺点的不同技术,非常感谢。
    • 不确定您在一致性和其他选择标准(成本、功能、支持、..)方面追求什么,但您可能可以使用几乎任何数据库找到一种方法。根据我的经验,Oracle 和 PostgreSQL 中的视图支持比 MySQL 成熟得多,但我是 MySQL 5 视图的早期采用者,它有一些令人痛苦的初期问题,现在可能要好得多。我不会假设您必须使用视图,实际上每个数据库的分区可能更高效/更易于管理。
    • 我也会担心架构更改或大型数据库修复的潜在中断,并希望将数据库保持在合理的大小或使用 NoSQL 数据库。除了存储之外,其他明显的考虑因素包括您将要读取/写入的数据的吞吐量。没有针对所有用途的最佳数据库选择,因此您确实必须权衡您自己的应用程序的标准。一个好的方法可能是对您的候选数据库进行概念验证,以了解它们对于不同规模和数据模型的管理难度。
    • 我已经更新了主要问题,以根据 MSDN 文章中的三种方法稍微澄清我们的意图,也许这会对我想要去的地方有所了解。
    猜你喜欢
    • 1970-01-01
    • 2018-01-31
    • 2012-12-23
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    相关资源
    最近更新 更多