6

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

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

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

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

4

1 回答 1

6

这不是一个简单的答案,因为很大程度上取决于您的应用程序架构、使用和查询模式、客户端之间的分布(即:客户端之间的使用水平是否大致相同,或者您是否可以让 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 的初创公司等。答案还取决于您存储的数据类型 - 是用户财务数据,还是只是用户论坛?基本上,如果对未来需要通过大公司的安全审计有任何顾虑,那就别想共享数据库的方法了。

于 2012-09-11T03:21:04.663 回答