在 MongoDB 中使用大量集合
Posted
技术标签:
【中文标题】在 MongoDB 中使用大量集合【英文标题】:Using Large number of collections in MongoDB 【发布时间】:2014-07-02 11:36:16 【问题描述】:我正在考虑使用 MongoDB 来保存我们的活动日志数据,
"domain" : ""
"log_time" : ""
"email" : ""
"event_type" : "",
"data" :
"campaign_id" : "",
"campaign_name" : "",
"message" : "",
"subscriber_id" : ""
上面是我们的事件结构,每个事件关联一个域,
一个域可以包含任意数量的事件,一个域与另一个域之间没有关系
我们的大多数查询一次只针对一个域
为了快速查询响应,我计划为每个域创建一个集合,以便我可以查询特定域集合数据,而不是查询包含所有域数据的整个数据
未来我们将拥有至少 100k+ 个域,因此我需要创建 100k+ 个集合。 我们预计每个集合有 100 万多个文档。
我们的主要目的是仅对必需的集合进行索引,我们不想对整个数据进行索引,这就是为什么我们计划每个域有一个集合
哪种方法更适合我的情况
1.将所有域事件存储在一个集合中 (或)
2.每个领域事件在单独的集合中
我看到了一些关于 mongodb 可以支持的最大集合数的问题,但我并不清楚这个主题,据我所知,我们可以扩展默认限制大小 24k,但是如果我创建 100k+ 集合,性能会怎样它会受到影响
这个解决方案(使用最大数量的集合)是否适合我的情况 请建议我的方法,提前谢谢
【问题讨论】:
在 1 个 DB 中可以拥有的集合数量是有限制的……您可以 read more here 了解 mongoDB 限制和阈值……我确实认为 100K 集合太多了。使用正确的索引,您应该仍然能够通过一个集合中的所有事件获得所需的性能。 您希望在每个集合中平均存储多少文档? 我们预计每个集合有 100 万多个文档 每个数据库允许的集合数量取决于名称空间文件的大小(请参阅docs.mongodb.org/manual/reference/limits/…) 【参考方案1】:如果没有一些硬性数字,这个问题可能只是基于意见。 但是,如果您使用您提供的数字进行一些计算,您将得到一个解决方案。
所以您的文档总数为:
100 K collections x 1M documents = 100 G (100.000.000.000) documents.
根据您的文档结构,我将粗略估计每个文档的平均大小为 240 字节(可能更高)。
将这两个数字相乘可获得约 21.82 TB 的数据。您不能仅在一台服务器上存储这么多数据,因此您必须将数据拆分到多台服务器上。
有了这么多数据,您的问题不再是一个集合与多个集合,而是我如何将所有这些数据存储在多台服务器上的 MongoDB 中,以便我可以高效地进行查询。
如果您有 10 万个集合,您可能可以做一些手动工作并存储例如每个 MongoDB 服务器 10 K 个集合。但是有更好的方法。
您可以使用sharding 并让 MongoDB 完成在服务器之间拆分数据的繁重工作。通过分片,您将为所有域拥有一个集合,然后将该集合分片到多台服务器上。
我强烈建议您在尝试部署这种规模的系统之前阅读所有有关分片的文档。
【讨论】:
嘿克里斯蒂安,我对 mongodb 很陌生,在这里我为每个域创建集合,我的主要目的是为只需要的集合创建索引。我不想索引整个所有域数据。 嗯.. 分片和索引是两个不同的东西。如果您是 MongoDB 新手,我强烈建议您在开始设计大型系统之前查看 MongoDB 文档并阅读一些有关它的书籍。您甚至可以在他们的网站university.mongodb.com 上获得一些免费的开发/dba 课程 嘿,我知道分片和索引是不同的概念。在这里,我的问题是一个包含所有数据的集合或每个域的单独集合,哪个更好。 @ramesh 就像我在回答中所说的那样,如果您计划存储 20 TB 的数据,您不能在一台服务器上进行。因此,如果您计划将文档拆分为 100K 集合,或者将它们全部放在该服务器上的 1 个集合中,这并不重要。请参阅我的编辑以获取更多解释。 感谢您的解释。假设我只有 500gb 的数据可以存储在一台服务器上,在这种情况下,您对大型集合与具有完整数据的单个集合之间有何建议以上是关于在 MongoDB 中使用大量集合的主要内容,如果未能解决你的问题,请参考以下文章
Node.JS、Express 和 MongoDB :: 多个集合