我们在工作中使用 MongoDB 2.2.0。数据库包含大约 51GB 的数据(目前),我想对我们迄今为止收集的用户数据进行一些分析。问题是,它是活机器,我们现在买不起另一个奴隶。我知道 MongoDB 有一个读锁,它可能会影响任何发生的写入,尤其是复杂查询时。有没有办法告诉 MongoDB 以最低优先级处理我的(特定)查询?
最佳答案
在 MongoDB 中,读取和写入确实会相互影响。读锁是共享的,但读锁会阻止获取写锁,当然在持有写锁时不会发生其他读取或写入。 MongoDB 操作会定期产生以防止其他等待锁的线程饿死。您可以阅读更多关于 here 的详细信息.
这对您的用例意味着什么?因为没有办法告诉 MongoDB 在没有读锁的情况下访问数据,也没有办法确定请求的优先级(至少现在还没有)读取是否显着影响写入性能取决于您有多少“净空”在写入事件进行时可用。
我可以提出的一个建议是,在弄清楚如何运行分析时,而不是扫描整个数据集(即对所有历史数据进行聚合查询),尝试在较短的时间片上运行较小的聚合查询。这将完成两件事:
- 读取作业的生命周期会更短,因此会更快完成,这将使您有机会评估查询对“实时”性能的影响。
- 您不会一次将所有旧数据提取到 RAM 中 - 通过随着时间的推移将这些分析查询分开,您将最大限度地减少它对当前写入性能的影响。
根据您买不起另一台服务器的能力,您可能会考虑获得一个生命周期较短的 AWS 实例,该实例可能不是很强大,但可用于针对您的数据集副本运行长时间的分析查询.在制作数据副本时要小心 - 对生产系统进行完全同步会对其造成沉重负担(更有效的方法是使用最近的备份/文件快照来恢复)。
关于mongodb - 从没有锁的mongodb读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14689934/