2012-12-18 119 views
13

我正在设计一个系统与MongoDb(64位版本)来处理大量的用户(大约100,000),并且每个用户将有大量的数据(大约100万条记录)。MongoDb数据库与集合

什么是设计的最佳策略?

  1. 转储单集

  2. 所有记录的集合为每个用户

  3. 为每一个用户的数据库。

非常感谢,

+1

肯定不是最后2 –

+0

从数据库架构角度来看,我会建议使用一个单一的集合,但我不知道他们是否还扩展这么好,当你有上百*千亿*在他们的记录。 – Philipp

回答

12

因此,您正在寻找1000亿个记录(100万条记录* 100,000个用户)的地区。

处理大量数据的首选方法是创建一个分割的集群,将数据分散到多个服务器上,这些服务器通过mongo客户端呈现为单个逻辑单元。

因此,您的问题的答案是将所有记录放入单个分片集合中。

集群所需的分片数量和配置数量与数据大小和其他因素(如读取和写入的数量和分布)有关。这些问题的答案可能非常针对你的独特情况,所以我不会试图猜测它们。

我可能会首先决定有多少分片可供您在多台机器的集群上设置和测试系统。根据其性能,您可以决定在群集中是否需要更多或更少的碎片

+3

虽然在这种情况下分片架构肯定是相关的,但是您的文章没有解决OP的问题,即关于是使用一个集合,多个集合还是多个数据库。 – Philipp

+3

是啊,备选方案2和3是如此直觉对我说,我忘了,清楚,你应该把它变成一个单一的收集和分片 – chrisbunney

+1

@chrisbunney什么是对使用的数据库或集合”模式的2个便士每个用户“只是为了安全和简化访问控制管理的唯一目的? – kommradHomer

3

关于每个用户的集合:

使用默认配置,MongoDB是限于12K集合。您可以通过--nssize增加这个尺寸,但它不是无限的。 而且你必须计入这个12k的索引。 (检查mongo文档中的“命名空间”概念)。

关于为每个用户数据库:

换一个型号上来看,这是非常奇怪的。 对于技术而言,mongo没有限制,但是您可能对文件描述符有限制(限制您的操作系统/设置)。

所以@Rohit说,最后两个不好。也许你应该更多地解释你的情况。 也许你可以将用户剪切成不同的集合(例如:每个名字的首字母等等,或者公司的每个服务......)。 并且当然使用分片

编辑:也许MongoDb不是您的用例的最佳数据库。

5

因此,您正在为100K用户寻找100,000,000个详细记录?

很多人似乎有什么不明白的是,MongoDB是善于水平缩放。水平缩放通常被归类为跨越大型集群中许多(许多)服务器的巨大单个数据集合。

因此,如果您对一般数据使用单个集合(即一个集合称为user,另一个集合称为detail),那么您已经适合MongoDB的核心目的和构建。

MongoDB中,如前所述,通过别人是不是在许多藏品垂直缩放那么好。它有一个nssize的限制开始,即使12K初始集合是估计由于索引大小,您可以在您的数据库只有5K集合。

所以每个用户的集合是不可行的。它将使用MongoDB来对付其核心原则。

有每个用户数据库涉及到同样的问题,也许更多,具有每个用户的单一集合。

我从来没有遇到过某个人无法将MongoDB扩展到数十亿甚至接近数十亿(甚至更高)的优化设置,但是,我不明白为什么它不能;毕竟Facebook能够使MySQL扩展到每个用户数十亿用户(跨越32K +分片),并且这两个数据库之间的分割概念相似。

所以这样做的理论和可能性就在那里。这完全取决于选择正确的模式和分片概念和关键(以及服务器和网络等等等)。

如果你目睹了问题,你可以去拆分归档集合或从主集合中删除项目,但我认为这太过分了,而你想确保MongoDB知道你的大数据集的每个部分是在任何给定的时间点在主数据库上,并确保这些数据总是很热,这样一来,不会执行全局和分散式操作的查询应该非常快。

相关问题