在MongoDB中使用大量集合

时间:2014-07-02 11:36:17

标签: mongodb

我正在考虑使用MongoDB来保存我们的广告系列日志数据

{
    "domain"     : ""
    "log_time"   : ""
    "email"      : ""
    "event_type" : "",
    "data" : {
        "campaign_id" : "",
        "campaign_name" : "",
        "message" : "",     
        "subscriber_id" : ""
    }
}

以上是我们的事件结构,每个事件都与一个域相关联,

一个域可以包含任意数量的事件,并且一个域与另一个域之间没有关系

我们的大多数查询一次都针对一个域

用于快速查询响应我计划为每个域创建一个集合,以便我可以查询特定的域集合数据,而不是查询包含所有域数据的整个数据

我们将来会有至少100k +域名,因此我需要创建100k +馆藏。 我们预计每个系列会有100万份文件。

我们的主要目的是仅对所需的集合进行索引,我们不想对整个数据建立索引,这就是我们计划每个域有一个集合的原因

哪种方法对我的情况更好

1.在一个集合中监控所有域事件    (或)

2.单独收集中的每个域事件

我已经看到一些关于mongodb可以支持的最大收集数量的问题,但是我没有清楚这个主题,据我所知,我们可以扩展默认限制大小24k,但是如果我创建100k +收藏怎么样?性能会受到影响

这个解决方案(使用最大收集数量)是否适用于我的案例
请提前了解我的方法

1 个答案:

答案 0 :(得分:0)

如果没有一些硬数字,这个问题可能只是基于意见。 但是,如果您使用您提供的数字进行一些计算,您将获得解决方案。

所以你的总文件数是:

100 K collections x 1M documents = 100 G (100.000.000.000) documents.

从你的文档结构中,我将做一个粗略的估计,并说每个文档的平均大小将是240字节(可能更高)。

将这两个数字相乘〜21.82 TB数据。您无法仅在一台服务器上存储此数据量,因此您必须在多台服务器之间拆分数据。

有了这么多的数据,你的问题不再是一个集合与多个集合,而是如何将所有这些数据存储在多个服务器上的MongoDB中,这样我就可以有效地进行查询。

如果你有100K的收藏品,你可以做一些手工工作和存储,例如每个MongoDB服务器10个K集合。但是有更好的方法。

您可以使用sharding让MongoDB在服务器之间分配数据。通过分片,您将为所有域创建一个集合,然后在多个服务器上对该集合进行分片。

我强烈建议您在尝试部署此大小的系统之前阅读有关分片的所有文档。