【问题标题】:mongo db insert big collectionsmongodb插入大集合
【发布时间】:2013-04-03 19:58:50
【问题描述】:

我在副本集配置中有一个 mongo(版本 2)在生产中(下一步是添加分片)。

我需要实现以下内容:

  • 每天我会收到一个包含数百万行的文件,我会将其加载到 mongo 中。
  • 我有一个运行时应用程序,它总是从这个集合中读取 - 非常大量的读取,它们的性能非常重要。 集合被索引,所有读取都执行 readByIndex 操作。

我目前的加载实现是:

  1. 删除收藏
  2. 创建集合
  3. 插入集合新文档

我看到的一件事是,由于 mongoDB 锁定,我的总体性能在加载过程中变得最差。 我已经检查了多达 1000 万个条目的集合。 对于更大的尺寸,我认为我应该开始使用分片

喜欢这样的问题的最佳方式是什么? 或者我应该使用其他解决方案策略吗?

【问题讨论】:

  • 对于您的用例来说,对这个集合的所有读取都是“一致的”重要吗(因为他们将看到前一天的任何 5M 记录的记录,或者当天的记录)?或者是否可以接受一些读取来自昨天的转储,而另一些来自今天的转储?
  • 不,如果在加载期间某些数据将“无法访问”,那也没关系(因为我在操作开始时删除了所有值)。但这当然如果负载需要一些合理的时间,比如最多 1-2 小时。否则我可能应该有两个集合和一个从中读取的元数据(每次都像它们之间的交换)
  • 第 N 天和第 N+1 天的数据文件之间,是否曾经删除过记录?还是它们只是添加(或更新)?也就是说,有没有在第 N 天出现而在第 N+1 天没有出现的记录?

标签: java performance mongodb


【解决方案1】:

你可以使用两个集合:)

  • collectionA 包含今天的数据
  • 新数据到达
  • 创建一个新集合 (collectionB) 并插入数据
  • 现在使用 collectionB 作为您的数据

然后,第二天,重复上述操作,只是交换 A 和 B :)

这将让 collectionA 在更新 collectionB 时仍然为请求提供服务。

PS 刚刚注意到我迟到了一年才回答这个问题:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2020-09-15
    • 2015-06-19
    • 2017-02-25
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多