对于MongoDB中的多租户数据库,推荐的方法是什么?

我正在考虑使用MongoDB创build一个多租户应用程序。 对于我现在有多less租客,我没有任何猜测,但我希望能够扩大到数千人。

我可以想到三个策略:

  1. 所有租户都在同一个集合中,使用租户特定的安全领域
  2. 1每个租户收集在一个共享的数据库中
  3. 每个租户1个数据库

我脑海中的声音暗示着我select了第二种select。

想法和含义,任何人?

我有同样的问题来解决,也考虑到变种。 由于我在创buildSaaS多租户应用程序方面有多年的经验,因此我也将根据以前的关系数据库经验select第二个选项。

在进行研究的同时,我在mongodb支持网站上find了这篇文章: http : //support.mongohq.com/use-cases/multi-tenant.html

这些家伙声称要避免第二个选项,据我所知,并不是特别针对mongodb。 我的印象是,由于数据库devise的具体情况,这适用于我研究的大部分NoSQL数据库(CoachDB,Cassandra,CouchBase Server等)。

集合(或桶或不pipe它们在不同的数据库中调用它)与RDBMS中的安全模式不同,尽pipe它们作为文档的容器,对于应用好的租户分离是无用的。 我找不到可以应用基于集合的安全限制的NoSQL数据库。

当然,您可以使用基于mongodbangular色的安全性来限制数据库/服务器级别的访问。 ( http://docs.mongodb.org/manual/core/authorization/

我会build议第一个选项时:

  • 您有足够的时间和资源来处理此场景的devise,实施和testing的复杂性。
  • 如果不同的租户在数据库的结构和function上不会有太大的差异。
  • 您的应用程序devise将允许租户在运行时只进行最less的自定义设置。
  • 如果你想优化空间并尽量减less硬件资源的使用。
  • 如果你将有成千上万的租户。
  • 如果你想快速和成本好的扩展。
  • 如果您不打算基于租户备份数据(为每个租户单独备份)。 甚至在这种情况下也可以做到这一点,但是努力将是巨大的。

我会去为变体3,如果:

  • 你将有一小部分租户(几百)。
  • 业务细节要求您能够支持不同租户(例如与第三方系统集成,数据导入导出)的数据库结构的巨大差异。
  • 您的应用程序devise将允许客户(租户)在应用程序运行时进行重大更改(添加模块,自定义字段等)。
  • 如果有足够的资源快速扩展新的硬件节点。
  • 如果您需要保留每个租户的数据版本/备份。 恢复也很容易。
  • 有法律/监pipe的限制,迫使你在不同的数据库(甚至数据中心)保持不同的租户。
  • 如果你想充分利用mongodb的开箱即用的安全function,比如angular色。
  • 租户之间在规模上有很大的差别(你有很多小租户和几个非常大的租户)。

如果您发布有关您的应用程序的其他细节,也许我可以给你更详细的build议。

我在这个链接的评论中find了一个很好的答案:

http://blog.boxedice.com/2010/02/28/notes-from-a-production-mongodb-deployment/

基本上选项#2似乎是最好的方式去。

引自David Mytton的评论:

由于MongoDB分配数据文件的方式,我们决定不为每个客户build立一个数据库。 每个数据库使用它自己的一组文件:

数据库的第一个文件是dbname.0,然后是dbname.1等,dbname.0将是64MB,dbname.1 128MB等,最高可达2GB。 一旦文件达到2GB的大小,每个连续的文件也是2GB。

因此,如果最后一个数据文件是1GB,那么如果最近到达该文件,该文件可能是90%空的。

从手册。

当用户注册试用并放弃使用时,即使整个数据文件没有被使用,我们也会得到越来越多的数据库,其大小至less为2GB。 我们发现这使用了大量的磁盘空间,相比之下,为所有客户提供了多个数据库,以便最大限度地提高磁盘空间的使用效率。

Sharding将以收集为基础,作为标准提出一个问题,即集合永远不会达到开始分片的最小大小,就像我们相当多的(例如只存储用户login细节的集合)那样。 但是,我们已经要求这也可以在每个数据库级别上完成。 参见http://jira.mongodb.org/browse/SHARDING-41

没有使用大量集合的性能权衡。 见http://www.mongodb.org/display/DOCS/Using+a+Large+Number+of+Collections

我会去select2。

但是你可以设置mongod.exe命令行选项–smallfiles。 这意味着一个范围的最大文件大小将是0.5千兆字节而不是2千兆字节。 我用mongo 1.42testing了这个。 所以选项3并不是不可能的。

有关MSDN的一篇关于多租户数据架构的合理文章 ,您可能想参考一下。 本文涉及的一些关键主题:

  • 经济考虑
  • 安全
  • 租户考虑
  • 监pipe(法律)
  • 技能设置关切

还涉及到软件即服务(SaaS)configuration的一些模式。

另外值得一提的是SQL Anywhere中的一些有趣的东西 。

我自己的个人看法 – 除非您确定强制执行的安全/信任,否则我会select第3种方式,或者如果可扩展性问题至less禁止回退到选项2。 这就是说…我不是专业的MongoDB。 我用一个共同的“模式”很紧张 – 但我会很乐意推迟到更有经验的从业者。

虽然这里讨论的是NoSQL,主要是MongoDB,但我们在Citus使用PostgreSQL并构build了一个分布式/分片的多租户数据库。

我们的用例指南介绍了一个示例应用程序,涵盖了架构和各种多租户特定function。

对于更多的非结构化数据,我们使用PostgreSQL的JSONB列来存储这样的租户特定的数据。