我正在考虑使用MongoDB创建一个多租户应用。关于我还有多少租户,我没有任何猜测,但我希望能够扩展到数千个。
我可以想到三个策略:
我头脑中的声音暗示我选择了选项2.
思想和影响,任何人?
答案 0 :(得分:52)
我有同样的问题需要解决并考虑变种。 由于我有多年创建SaaS多租户应用程序的经验,我还将根据我以前使用关系数据库的经验选择第二个选项。
在进行我的研究时,我在mongodb支持网站上发现了这篇文章(因为它已经消失,所以回来了): https://web.archive.org/web/20140812091703/http://support.mongohq.com/use-cases/multi-tenant.html
这些家伙声称不惜任何代价避免第二种选择,据我所知,这并不是特别针对mongodb。我的印象是,由于数据库设计的具体细节,这适用于我研究的大多数NoSQL dbs(CoachDB,Cassandra,CouchBase Server等)。
集合(或桶或者它们在不同的DB中调用它)与RDBMS中的安全模式不同,尽管它们表现为文档的容器,它们对于应用良好的租户分离是无用的。我找不到可以根据集合应用安全限制的NoSQL数据库。
当然,您可以使用基于mongodb角色的安全性来限制对数据库/服务器级别的访问。 (http://docs.mongodb.org/manual/core/authorization/)
我会建议第一个选项:
如果符合以下情况,我会选择变体3:
如果您发布有关您的申请的其他详细信息,或许我可以给您更详细的建议。
答案 1 :(得分:8)
我在这个链接的评论中找到了一个很好的答案:
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 大小,即使整个数据 文件没用。我们发现这用了一个 大量的磁盘空间比较 为所有人提供多个数据库 客户所在的磁盘空间 用来达到最高效率。
Sharding将在每个集合上 作为标准的基础提出了一个 问题集合永远不会 达到最小尺寸即可开始 分片,就像一个很好的情况一样 我们很少(例如收藏品 存储用户登录详细信息)。然而, 我们要求这也是 能够在每个数据库上完成 水平。看到 http://jira.mongodb.org/browse/SHARDING-41
没有性能权衡 使用大量的集合。看到 http://www.mongodb.org/display/DOCS/Using+a+Large+Number+of+Collections
答案 2 :(得分:2)
您可能希望引用a reasonable article on MSDN about multi-tenant data architecture。本文涉及的一些关键主题:
还涉及软件即服务(SaaS)配置的一些模式。
此外,值得一眼的是an interesting write-up from the SQL Anywhere guys。
我自己的个人看法 - 除非您确定强制执行安全/信任,否则我会使用选项3,或者如果可伸缩性问题禁止至少回退到选项2。那就是说......我不是MongoDB的专家。使用共享的“架构”我感到非常紧张 - 但我很乐意接受更有经验的从业者。
答案 3 :(得分:2)
我会选择选项2.
但是你可以设置mongod.exe命令行选项--smallfiles。这意味着扩展区的最大文件大小为0.5千兆字节而不是2千兆字节。我用mongo 1.42进行了测试。因此选项3并非不可能。
答案 4 :(得分:0)
虽然这里的讨论是关于NoSQL而主要是MongoDB,但我们Citus正在使用PostgreSQL并构建分布式/分片多租户数据库。
我们的use-case guide遍历示例应用,涵盖架构和各种多租户特定功能。
对于更多非结构化数据,我们使用PostgreSQL的JSONB列来存储此类特定于租户的数据。
答案 5 :(得分:0)
根据我在MongoDB. Trucos y consejos. Aplicaciones multitenant.的研究 如果您不知道有多少租户可以使用该选项,那么它可能是数千个并且在分片时会很复杂,也可以想象在一个数据库中拥有数千个集合......所以在您的情况下它建议使用选项一。现在,如果您将拥有有限数量的用户,那么它已经不同了,是的,您可以按照您的想法使用选项二。