我们正在使用MongoDB 2.2.0。数据库包含大约51GB的数据(目前),我想对我们迄今为止收集的用户数据进行一些分析。问题是,它是现场机器,我们现在买不起另一个奴隶。我知道MongoDB有一个读锁定,可能会影响任何特别是复杂查询的写入。有没有办法告诉MongoDB以最低优先级处理我的(特定)查询?
答案 0 :(得分:6)
在MongoDB中,读取和写入确实会相互影响。读锁是共享的,但读锁会阻止写锁被捕获,当然在保持写锁时不会发生其他读或写操作。 MongoDB操作定期产生,以防止其他线程等待锁定饥饿。您可以详细了解here的详细信息。
这对您的用例意味着什么?因为没有办法告诉MongoDB在没有读锁定的情况下访问数据,也没有办法确定请求的优先级(至少现在还没有),这些读取是否会显着影响写入的性能取决于你的“余量”是多少在写活动正在进行时可用。
我可以提出的一个建议是,在确定如何运行分析时,而不是扫描整个数据集(即对所有历史数据进行聚合查询),尝试在短时间片上运行较小的聚合查询。这将完成两件事:
根据您无法承担获得另一台服务器的费用 - 您可能会考虑获得一个短暂的AWS实例,该实例可能不是很强大,但可用于对数据集的副本运行长分析查询。在制作数据副本时要小心 - 从生产系统中完全同步会对其造成沉重负担(更有效的方法是使用最近的备份/文件快照从中恢复)。
答案 1 :(得分:2)
此类操作最好留给副本集的从属。首先,可以共享读锁以允许一次读取多次,但写锁将阻止读取。而且,虽然您无法确定查询的优先级,但mongodb会产生长时间运行的读/写查询。 Their concurrency docs应该提供帮助
如果你买不起另一台服务器,你可以在同一台机器上设置一个从机,只要你有一些备用的RAM /磁盘空间,你就可以轻易/偶尔使用从机。你必须小心,你的磁盘I / O会显着增加。