我正在设计一个带有MongoDb(64位版本)的系统来处理大量用户(大约100,000个),每个用户将拥有大量数据(大约100万条记录).
什么是最好的设计策略?
转储单个集合中的所有记录
为每个用户准备一个集合
为每个用户建立一个数据库.
非常感谢,
chr*_*ney 13
因此,您正在寻找1000亿条记录(100万条记录*100,000名用户)的地区.
处理大量数据的首选方法是创建一个分片群集,将数据分散到多个服务器上,这些服务器通过mongo客户端呈现为单个逻辑单元.
因此,您的问题的答案是将您的所有记录放在一个分片集合中.
所需的分片数量和群集配置与数据大小和其他因素(如读取和写入的数量和分布)有关.这些问题的答案可能非常特定于您的独特情况,因此我不会尝试猜测它们.
我可能首先决定你有多少分片,你有时间和机器可以在很多机器的集群上设置和测试系统.根据其性能,您可以决定群集中是否需要更多或更少的分片
那么您正在为100K用户寻找100,000,000条详细记录?
许多人似乎并不理解MongoDB擅长横向扩展.水平扩展通常被归类为在庞大的集群中跨越许多(许多)服务器扩展巨大的单个数据集合.
因此,如果您使用单个集合来处理公共数据(即一个集合被调用user,一个称为一个集合detail),那么您就已经适应了MongoDB的核心目的和构建.
正如其他人所提到的,MongoDB并不擅长在许多集合中进行垂直扩展.它有一个nssize限制开始,即使实际估计 12K初始集合由于索引大小,您可以在数据库中只有5K集合.
因此,每个用户的集合根本不可行.它将使用MongoDB来实现其核心原则.
每个用户拥有一个数据库涉及相同的问题,可能更多,因为每个用户都有单一的集合.
我从来没有遇到过一些人无法在一个优化的设置上将MongoDB扩展到数十亿甚至接近数十亿(或者可能超过)的100,但是,我不明白为什么它不能; 毕竟Facebook能够将MySQL扩展到每个用户数十亿(跨越32K +分片)的数量,并且两个数据库之间的分片概念类似.
所以这样做的理论和可能性就在那里.这是关于选择正确的架构和分片概念和密钥(以及服务器和网络等等).
如果您要见证问题,您可以去分割存档集合,或者从主集合中删除项目,但我认为这是过度的,而是您要确保MongoDB知道您的大数据集的每个段在任何给定点的位置及时在主服务器上并确保此数据始终处于热状态,这样,不执行全局和分散OP的查询应该非常快.
| 归档时间: |
|
| 查看次数: |
11435 次 |
| 最近记录: |