我正在考虑使用MongoDB创建一个多租户应用程序。我目前不清楚需要承载多少租户,但我希望能够扩展到数千个。
我可以想到三种策略:
- 所有租户在同一个集合中,使用租户特定的字段进行安全管理
- 在单个共享数据库中为每个租户创建1个集合
- 为每个租户创建1个数据库
我的想法是选择第2种选项。
有什么想法和影响吗?
我正在考虑使用MongoDB创建一个多租户应用程序。我目前不清楚需要承载多少租户,但我希望能够扩展到数千个。
我可以想到三种策略:
我的想法是选择第2种选项。
有什么想法和影响吗?
我面临着同样的问题,并正在考虑不同的选择。因为我有多年创建SaaS多租户应用程序的经验,所以我也打算基于自己在关系型数据库方面的经验选择第二个选项。
在做研究时,我发现了mongodb支持站点上的这篇文章(很久以前添加的,已经不存在): https://web.archive.org/web/20140812091703/http://support.mongohq.com/use-cases/multi-tenant.html
这些人指出要不惜一切代价避免第二种选项,我理解这并非特别适用于mongodb。我的印象是,这适用于我研究的大多数NoSQL数据库(CoachDB、Cassandra、CouchBase Server等),原因是由于数据库设计的特定性。
集合(或桶或者不同DB中称之为什么)不同于RDBMS中的安全模式,尽管它们像文档的容器一样的表现,但对于应用良好的租户分离来说是无用的。我找不到能够基于集合应用安全限制的NoSQL数据库。
当然,你可以使用mongodb基于角色的安全性在数据库/服务器级别上限制访问。(http://docs.mongodb.org/manual/core/authorization/)
我建议在以下情况下选择第一种选项:
如果符合以下条件,我会选择变体3:
如果您提供有关应用程序的其他详细信息,我可以给您更详细的建议。
我在这个链接的评论中找到了一个好的答案:
http://blog.boxedice.com/2010/02/28/notes-from-a-production-mongodb-deployment/
基本上,选项#2似乎是最好的选择。
引用David Mytton的评论:
我们决定不为每个客户创建一个数据库,因为MongoDB分配其数据文件的方式。每个数据库使用自己的一组文件:
数据库的第一个文件是dbname.0,然后是dbname.1等。dbname.0将是64MB,dbname.1是128MB,以此类推,直到2GB。一旦文件达到2GB大小,每个后续文件也是2GB。
因此,如果最后一个数据文件的大小为1GB,则该文件可能有90%的空余空间,即使它最近被使用过。
来自手册。
随着用户注册试用并尝试使用我们的产品,我们将获得越来越多至少为2GB的数据库,即使整个数据文件没有被完全使用。相比于每个客户都有几个数据库,磁盘空间可以最大限度地利用,我们发现这样使用了大量的磁盘空间。
分片将按照集合为标准进行,这在集合从未达到最小分片大小的情况下(例如仅存储用户登录详细信息的集合)会出现问题。但是,我们已经要求也可以按照每个数据库的级别进行操作。请参见
http://jira.mongodb.org/browse/SHARDING-41使用大量的集合不会影响性能。参见http://www.mongodb.org/display/DOCS/Using+a+Large+Number+of+Collections
这里有一篇关于多租户数据架构的MSDN上的合理文章,你可能会想要参考。这篇文章涉及到的一些关键主题:
此外,文章还涉及了一些软件即服务(SaaS)配置模式。
另外,值得一看的是来自SQL Anywhere团队的有趣写作。
我的个人看法 - 除非你确定有强制的安全/信任,否则我会选择选项3,或者如果可扩展性问题阻止回退到至少选项2。话虽如此...我对使用共享“模式”感到非常紧张,但我会乐意听取更有经验的从业者的建议。
我会选择第二个选项。
不过你也可以设置mongod.exe的命令行选项——--smallfiles。这意味着extent(MongoDB数据存储的最小单位)的最大文件大小为0.5GB而不是2GB。我已经在mongo 1.42上进行了测试,所以第三个选项并非不可能。