我正在考虑使用MongoDB创建一个多租户应用程序.关于我还有多少租户,我没有任何猜测,但我希望能够扩展到成千上万.
我可以想到三个策略:
同一集合中的所有租户,使用特定于租户的字段来确保安全
1单个共享数据库中每个租户的收集
每个租户1个数据库
我头脑中的声音暗示我选择2.
任何想法和影响,任何人?
我有同样的问题要解决,也考虑变种.由于我有多年创建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:
你将有一小部分租户(几百个).
业务的细节要求您能够支持不同租户的数据库结构的巨大差异(例如,与第三方系统的集成,数据的导入 - 导出).
您的应用程序设计将允许客户(租户)在应用程序运行时(添加模块,自定义字段等)中进行重大更改.
如果您有足够的资源可以快速扩展新的硬件节点.
如果您需要为每个租户保留数据的版本/备份.恢复也很容易.
有法律/监管限制迫使您将不同的租户保留在不同的数据库(甚至是数据中心).
如果您想充分利用mongodb的开箱即用安全功能,如角色.
租户之间的规模差异很大(你有很多小租户,很少有很大的租户).
如果您发布有关您的应用程序的其他详细信息,也许我可以给您更详细的建议.
我在这个链接的评论中找到了一个很好的答案:
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