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

MongoDB中多租户数据库的推荐方法是什么?,mongodb,multi-tenant,Mongodb,Multi Tenant,我正在考虑使用MongoDB创建一个多租户应用程序。我不知道我会有多少租户,但我希望能够扩大到数千人 我可以想出三种策略: 同一集合中的所有租户,使用租户特定字段进行安全保护 单个共享数据库中每个租户1个集合 每个租户1个数据库 我脑子里的声音建议我选择第二种方案 任何人的想法和含义?您可能希望参考其中一些。本文涉及的一些关键主题: 经济考虑 保安 租户注意事项 监管(法律) 技能集关注点 还涉及到软件即服务(SaaS)配置的一些模式 此外,值得一看的是 我个人的看法——除非您确定强制安全/

我正在考虑使用MongoDB创建一个多租户应用程序。我不知道我会有多少租户,但我希望能够扩大到数千人

我可以想出三种策略:

  • 同一集合中的所有租户,使用租户特定字段进行安全保护
  • 单个共享数据库中每个租户1个集合
  • 每个租户1个数据库
  • 我脑子里的声音建议我选择第二种方案

    任何人的想法和含义?

    您可能希望参考其中一些。本文涉及的一些关键主题:

    • 经济考虑
    • 保安
    • 租户注意事项
    • 监管(法律)
    • 技能集关注点
    还涉及到软件即服务(SaaS)配置的一些模式

    此外,值得一看的是


    我个人的看法——除非您确定强制安全/信任,否则我会选择选项3,或者如果可伸缩性问题至少禁止回退到选项2。也就是说。。。我不是MongoDB的专家。使用共享的“模式”我会非常紧张,但我很乐意听从更有经验的从业者。

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

    基本上,选项2似乎是最好的选择

    引用David Mytton的评论:

    我们决定不使用数据库 客户因为MongoDB的方式 分配其数据文件。每个 数据库使用自己的一组文件:

    数据库的第一个文件是 然后是dbname.1等dbname.0 将是64MB、dbname.1128MB等,最多 到2GB。一旦文件在内存中达到2GB 大小,每个连续文件也会 2GB

    因此,如果存在最后一个数据文件 比如说,1GB,该文件可能90%为空 如果它是最近到达的

    从手册上

    当用户注册试用并给出 事情一开始,我们会越来越多 中至少为2GB的数据库 大小,即使整个数据 文件没有被使用。我们发现这个用了一个 比较了大量的磁盘空间 为所有人提供多个数据库 可以使用磁盘空间的客户 用于最大限度地提高效率

    切分将在每个集合上进行 作为标准的基础 收藏永远不会出现的问题 达到要启动的最小大小 切分,这是相当长一段时间的情况 我们的产品很少(例如,仅收集 存储用户登录详细信息)。然而, 我们已要求这也将 能够在每个数据库上完成 水平。看见

    没有性能权衡 使用大量集合。看见


    我会选择选项2


    但是,您可以设置mongod.exe命令行选项——smallfiles。这意味着数据块的最大文件大小将为0.5 GB,而不是2 GB。我用mongo 1.42测试了这个。因此,选择3并非不可能

    我有同样的问题要解决,也考虑到了变体。 由于我有多年创建SaaS多租户应用程序的经验,我还打算根据我以前使用关系数据库的经验选择第二个选项

    在进行研究的过程中,我在mongodb支持站点上发现了这篇文章(自从它消失后,我又添加了这篇文章):

    这些家伙表示要不惜任何代价避免第二种选择,据我所知,这并不是mongodb所特有的。我的印象是,由于数据库设计的特殊性,这适用于我研究的大多数NoSQL数据库(CoachDB、Cassandra、CouchBase服务器等)

    集合(或者bucket,或者在不同的DBs中如何称呼它)与RDBMS中的安全模式不同,尽管它们的行为就像文档的容器,但它们对于应用良好的租户分离是无用的。我找不到可以基于集合应用安全限制的NoSQL数据库

    当然,您可以使用基于mongodb角色的安全性来限制对数据库/服务器级别的访问。()

    我建议在以下情况下选择第一种方案:

    • 您有足够的时间和资源来处理 此场景的设计、实现和测试
    • 如果你在结构和功能上没有太大的差异 数据库中针对不同租户的功能
    • 您的应用程序设计将允许租户只进行最低限度的 运行时的自定义
    • 如果您想优化空间并最小化硬件的使用 资源
    • 如果你有成千上万的房客
    • 如果您想快速且成本合理地扩展
    • 如果您不打算基于租户备份数据(请单独保存) 每个租户的备份)。即使在这种情况下也有可能做到这一点 但这一努力将是巨大的
    我会选择变体3,如果:

    • 你将有一个小的租户名单(几百个)
    • 业务的具体情况要求您能够支持不同租户在数据库结构上的巨大差异(例如,与第三方系统集成、数据导入导出)
    • 您的应用程序设计将允许客户(租户)在应用程序运行时进行重大更改(添加模块、自定义字段等)
    • 如果您有足够的资源快速扩展新的硬件节点
    • 如果需要为每个租户保留数据的版本/备份。恢复也将很容易
    • 法律/法规限制迫使您在不同的数据库(甚至数据中心)中保留不同的租户
    • 如果您想充分利用mongodb现成的安全特性,例如角色
    • 租户之间的规模差异很大(小租户很多,大租户很少)
    如果你发布额外的