我正在设计一个带有MongoDb(64位版本)的系统来处理大量用户(大约100,000),每个用户将拥有大量数据(大约100万条记录)。
最佳设计策略是什么?
转储单个集合中的所有记录
为每个用户设置一个集合
为每个用户建立一个数据库。
非常感谢,
答案 0 :(得分:13)
所以你正在寻找1000亿条记录(100万条记录* 100,000名用户)的地方。
处理大量数据的首选方法是创建一个分片群集,将数据分散到多个服务器上,这些服务器通过mongo客户端呈现为单个逻辑单元。
因此,您的问题的答案是将您的所有记录都放在一个分片集合中。
所需的分片数量和群集配置与数据大小和其他因素(如读取和写入的数量和分布)有关。这些问题的答案可能非常特定于您的独特情况,所以我不会试图猜测它们。
我可能首先要决定你有多少分片,你有时间和机器可以在很多机器的集群上设置和测试系统。根据其性能,您可以决定群集中是否需要更多或更少的分片
答案 1 :(得分:5)
因此,您正在为100K用户寻找100,000,000条详细记录?
许多人似乎并不理解MongoDB擅长横向扩展。水平扩展通常被归类为在庞大集群中的许多(许多)服务器上扩展巨大的单个数据集合。
如果您对公共数据使用单个集合(即一个名为user
的集合和一个名为detail
的集合),那么您已经适合MongoDB的核心目的和构建。
因此,每个用户的集合根本不可行。它将使用MongoDB来实现其核心原则。
每个用户拥有一个数据库涉及相同的问题,可能更多,因为每个用户都有单一的集合。
我从来没有遇到过一些人无法将MongoDB扩展到数十亿甚至接近100亿(或者可能超出)的优化设置,但是,我不明白为什么它不能;毕竟Facebook能够将MySQL扩展到每个用户数十亿(跨越32K +分片)的数量,并且两个数据库之间的分片概念类似。
所以这样做的理论和可能性就在那里。这是关于选择正确的架构和分片概念和密钥(以及服务器和网络等等)。
如果您要见证问题,可以去拆分档案馆藏,或者从主要馆藏中删除项目,但我认为这样做太过分了,相反,您要确保MongoDB知道您的大型数据集的每个片段在哪里在主服务器上的任何给定时间点,并确保此数据始终是热的,这样,不执行全局和分散OP的查询应该非常快。
答案 2 :(得分:3)
关于每个用户的集合:
默认配置,MongoDB限制为12k集合。您可以使用 - nssize 来增加此尺寸,但这不是无限制的。 而你必须将指数计入这个12k。 (在mongo文档中查看“名称空间”概念)。
关于每个用户的数据库:
从模型的角度来看,这非常好奇。 对于技术,mongo没有限制,但是你可能对文件描述符有限制(限制你的操作系统/设置)。
正如@Rohit所说,最后两个并不好。 也许你应该解释一下你的案子。 也许你可以将用户分成不同的集合(例如:每个名字的第一个字母等,或者公司的每个服务......)。 当然,使用分片。
编辑:也许MongoDb不是您用例的最佳数据库。