6

我们在工作中使用 MongoDB 2.2.0。数据库包含大约 51GB 的数据(目前),我想对我们迄今为止收集的用户数据进行一些分析。问题是,它是活机器,我们现在买不起另一个奴隶。我知道 MongoDB 有一个读锁,它可能会影响任何发生的写入,尤其是复杂查询时。有没有办法告诉 MongoDB 以最低优先级处理我的(特定)查询?

4

2 回答 2

6

在 MongoDB 中,读取和写入确实会相互影响。读锁是共享的,但读锁会阻止获取写锁,当然在持有写锁时不会发生其他读取或写入。MongoDB 操作会定期产生以防止其他等待锁的线程饿死。您可以在此处阅读有关详细信息的更多信息。

这对您的用例意味着什么?因为没有办法告诉 MongoDB 在没有读锁的情况下访问数据,也没有办法确定请求的优先级(至少目前还没有)读取是否显着影响写入性能取决于您有多少“净空”在写入活动进行时可用。

我可以提出的一个建议是,在弄清楚如何运行分析时,而不是扫描整个数据集(即对所有历史数据进行聚合查询)尝试在短时间片上运行较小的聚合查询。这将完成两件事:

  1. 读取作业的寿命会更短,因此会更快完成,这将使您有机会评估查询对“实时”性能的影响。
  2. 您不会一次将所有旧数据拉入 RAM - 通过随着时间的推移将这些分析查询间隔开,您将最大限度地减少它对当前写入性能的影响。

取决于您买不起另一台服务器的原因——您可能会考虑获得一个寿命短的 AWS 实例,它可能不是很强大,但可用于针对您的数据集副本运行长时间的分析查询。在制作数据副本时要小心 - 对生产系统进行完全同步会对其造成沉重的负担(更有效的方法是使用最近的备份/文件快照来恢复)。

于 2013-02-06T20:55:41.103 回答
2

这样的操作最好留给副本集的从属。一方面,可以共享读锁以允许一次多次读取,但写锁会阻止读取。而且,虽然您无法确定查询的优先级,但 mongodb 会产生长时间运行的读/写查询。他们的并发文档应该会有所帮助

如果你买不起另一台服务器,你可以在同一台机器上设置一个从属服务器,前提是你有一些空闲的 RAM/磁盘空间,并且你偶尔/偶尔使用从属服务器。但是你必须小心,你的磁盘 I/O 会显着增加。

于 2013-02-04T15:39:08.520 回答