【问题标题】:Multiple Databases in MongoDB for SaaS用于 SaaS 的 MongoDB 中的多个数据库
【发布时间】:2012-09-11 20:04:10
【问题描述】:

我正在 node.js 中构建一个 SaaS 应用程序,并希望将 MongoDB 用于具有 Mongoose ODM 的数据库。我需要支持成百上千(希望如此)的多个客户,并且每个客户的数据之间没有交互。

我的想法是为每个客户创建一个新数据库和一个保存全球信息的“主”数据库。例如,应用程序只有一个登录页面,所以我想将所有用户/密码信息存储在“主”数据库中,但所有用户的个人资料信息都存储在他们所属的客户数据库中。我觉得这将是一个很好的设计,因为它可以完全隔离每个客户的数据,并且可以轻松地单独备份/恢复一个客户。

我担心从 node.js 连接到多个数据库的性能影响。有谁知道这将如何影响该应用程序,或者对总体架构有什么看法?

额外问题:您是否知道在 SaaS 解决方案中执行相反操作并将所有客户数据存储在单个数据库中(以客户 ID 分隔)的任何审计影响?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    这不是一个简单的答案,因为很大程度上取决于您的应用架构、使用和查询模式、客户端之间的分布(即:客户端之间的使用水平是否大致相同,或者您是否有 10% 的客户端使用 90 % 的资源),您可以在代码与操作管理以及一大堆其他问题上花费多少。以下是一些需要考虑的事项:

    1) 拥有一个数据库将使您的操作管理更容易,需要更少的计算资源,并且可以让您更好地横向扩展,但是对访问层进行编码会更加困难,您确实必须很好地构建您的安全层,以便显而易见原因。您还将在客户端/网络服务器端消耗更少的资源,因为连接会更少。

    在处理一个单体数据库时,有两种流行的架构选项:

    • 您可以将所有相似的数据放在一个集合中(即:所有帐户的配置文件都放在同一个集合中),并为每个文档提供一个 clientid 键来标识哪些数据属于哪个帐户。这可能会为您提供最佳选择(取决于您的架构架构),以使用最少的计算资源进行横向扩展。
    • 另一种选择是通过集合分隔客户端数据 - 每个客户端将在数据库中拥有自己的集合,并以 clientid 前缀标识(即:clientid_userprofiles)。

    2) 每个客户端的数据库选项会给您带来更多的操作管理难题并且成本更高,因为您需要更多的计算资源。另一方面,您的编码成本应该更低,因为代码更容易编写。它还可以让您更好地在重度用户和轻量级用户之间分配资源。例如,您可以将使用量大的客户端转移到功能更强大的机器上,并为每个客户提供分片。

    3) 您可以提供两个选项的组合 - 为高端用户(支付更多费用的帐户)提供专用数据库,然后为低端客户和测试/免费增值帐户提供按集合分隔数据的共享数据库。

    请注意,如果您确实采用多数据库路线,则应查看 --smallfiles 启动选项。这将帮助您解决有很多人设置“测试帐户”但他们不经常使用它们的情况。

    无论如何,希望以上内容能让您深思。在 https://groups.google.com/forum/?fromgroups#!searchin/mongodb-user/multitenant 上进行搜索,因为在 Mongo 论坛中已经对此特定问题进行了许多讨论。

    至于审计影响,取决于您需要遵守什么级别的审计合规性。如果您期望财富 1000 强的客户,您的合规要求将远高于(而且成本更高——想想 10 美元到 100 美元的数千美元),而不是您的客户是可能从未听说过 SAS70 等的初创公司。 答案还取决于您存储的数据类型 - 是用户财务数据,还是只是用户论坛?基本上,如果对未来需要通过大公司的安全审计有任何顾虑,那就别想共享数据库的方法了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-08
      • 2010-09-09
      • 2021-07-10
      • 2012-09-24
      • 1970-01-01
      • 2016-10-19
      • 2015-01-11
      • 2018-01-31
      相关资源
      最近更新 更多