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

Posted

技术标签:

【中文标题】MongoDB 中多租户数据库的推荐方法是啥?【英文标题】:What is the recommended approach towards multi-tenant databases in MongoDB?MongoDB 中多租户数据库的推荐方法是什么? 【发布时间】:2011-02-14 11:36:55 【问题描述】:

我正在考虑使用 MongoDB 创建一个多租户应用程序。我还没有任何关于我会拥有多少租户的猜测,但我希望能够扩展到数千个。

我能想到三个策略:

    同一集合中的所有租户,使用特定于租户的字段来保证安全 单个共享数据库中每个租户 1 个集合 每个租户 1 个数据库

我脑海中的声音暗示我选择选项 2。

想法和启示,有人吗?

【问题讨论】:

亲爱的@Braintapper,我们的应用程序现在处于同样的情况,需要多租户。你有什么经验可以分享吗?太好了,谢谢。 对于我的应用程序,我最终选择了 Postgresql(我们通过 hstore 扩展获得了具有一些类似 NoSQL 功能的关系数据库的好处)而不是 MongoDB,并在 Rails 中使用范围来处理多租户.我们使用与此 Railscast 中使用的方法类似的方法:railscasts.com/episodes/388-multitenancy-with-scopes 我知道已经为这个问题选择了答案,但其他任何人都应该参考 mongohq 网站上的这个官方文件:support.mongohq.com/use-cases/multi-tenant.html。它明确主张反对下面的@Braintapper 解决方案 答案已更新。您链接中的信息在 2010 年 5 月还不容易获得。 @Braintapper 您现在正在使用 postgresql 解决方案(基于 railscasts.com)吗?我想使用它,但我不确定它是否增加了安全性以及它可以支持多少租户!请我需要您对此体验的反馈。谢谢 【参考方案1】:

我有同样的问题要解决,并且也在考虑变体。 由于我拥有多年创建 SaaS 多租户应用程序的经验,因此我也将根据我之前在关系数据库方面的经验选择第二个选项。

在进行研究时,我在 mongodb 支持网站上找到了这篇文章(因为它已经消失了,所以又添加了): https://web.archive.org/web/20140812091703/http://support.mongohq.com/use-cases/multi-tenant.html

这些家伙表示要不惜一切代价避免使用第二个选项,据我所知,这并不是 mongodb 所特有的。我的印象是,由于数据库设计的特殊性,这适用于我研究过的大多数 NoSQL 数据库(CoachDB、Cassandra、CouchBase Server 等)。

集合(或存储桶,或者它们在不同的数据库中调用它)与 RDBMS 中的安全模式不同,尽管它们充当文档的容器,但对于应用良好的租户分离毫无用处。我找不到可以基于集合应用安全限制的 NoSQL 数据库。

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

我会推荐第一种选择:

您有足够的时间和资源来处理 此场景的设计、实施和测试。 如果您不打算在结构和 数据库中针对不同租户的功能。 您的应用程序设计将允许租户只做最少的 在运行时进行自定义。 如果您想优化空间并尽量减少硬件使用 资源。 如果您要拥有数千名租户。 如果您想以合理的成本快速扩展。 如果您不打算基于租户备份数据(保持分开 每个租户的备份)。即使在这种情况下也可以这样做 但需要付出巨大的努力。

如果满足以下条件,我会选择变体 3:

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

如果您发布有关您的申请的更多详细信息,也许我可以给您更详细的建议。

【讨论】:

我猜原来的链接已经死了,去存档一个:web.archive.org/web/20140812091703/http://support.mongohq.com/… 您好,我们如何使用 mongodb 使用当前数据库创建新数据库? @Russian 如果我们要选择 1,我们将如何处理索引【参考方案2】:

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

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

【讨论】:

正如其他答案中所建议的,#2 不是一个好方法。请考虑更改接受的答案,因为这可能会错过领导其他开发人员。 更改了接受的答案,因为自 2010 年首次提出问题以来情况发生了重大变化。【参考方案3】:

您可能希望参考a reasonable article on MSDN about multi-tenant data architecture。本文涉及的一些关键主题:

经济考虑 安全性 租户注意事项 监管(法律) 技能组合问题

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

另外,值得一提的是an interesting write-up from the SQL Anywhere guys。

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

【讨论】:

我对那篇 MSDN 文章很熟悉,因为我最初的计划是使用关系数据库。然而,我的数据非常非结构化,现在让我研究像 MongoDB 这样的 NoSQL 数据库。 MongoDB 似乎不像 Lotus Domino 那样具有 ACL 支持,而且我真的不想重新发明***,这让我也认为 2 或 3 是要走的路。我也不知道在 MongoDB 中允许的集合或 dbs 数量方面我是否会遇到限制。【参考方案4】:

我会选择选项 2。

但是您可以设置 mongod.exe 命令行选项 --smallfiles。这意味着一个扩展区的最大文件大小将是 0.5 GB,而不是 2 GB。我用 mongo 1.42 对此进行了测试。所以选项3并非不可能。

【讨论】:

只是帮助,回顾:http://yazezo.com/2013/10/how-to-setup-saas-cloud-multi-tenant.html【参考方案5】:

根据我在MongoDB. Trucos y consejos. Aplicaciones multitenant. 的研究 如果您不知道可以拥有多少个租户,则不建议使用该选项,它可能有数千个,并且在分片方面会很复杂,还可以想象在一个数据库中拥有数千个集合......所以在你的情况下建议使用选项一。现在,如果您要拥有有限数量的用户,它已经不同了,是的,您可以按照您的想法使用选项二。

【讨论】:

【参考方案6】:

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

我们的use-case guide 介绍了一个示例应用,涵盖了架构和各种多租户特定功能。

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

【讨论】:

以上是关于MongoDB 中多租户数据库的推荐方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将 MongoDB 与部署在 Elastic Beanstalk 上的 NodeJS 应用程序一起使用的推荐方法是啥?

使用 MongoDB 存储缩略图的推荐方法是啥?

Grafana中多租户设置

管理多租户数据库连接

多租户和多应用怎么对应

大数据资源管理方案研究