从没有锁的mongodb读取

时间:2013-02-04 15:29:46

标签: mongodb

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

2 个答案:

答案 0 :(得分:6)

在MongoDB中,读取和写入确实会相互影响。读锁是共享的,但读锁会阻止写锁被捕获,当然在保持写锁时不会发生其他读或写操作。 MongoDB操作定期产生,以防止其他线程等待锁定饥饿。您可以详细了解here的详细信息。

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

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

  1. 读取作业的时间会缩短,因此会更快完成,这将使您有机会评估查询对您的“实时”表现产生的影响。
  2. 您不会立即将所有旧数据都拉入RAM中 - 通过将这些分析查询随时间隔开,您将最大限度地减少它对当前写入性能的影响。
  3. 根据您无法承担获得另一台服务器的费用 - 您可能会考虑获得一个短暂的AWS实例,该实例可能不是很强大,但可用于对数据集的副本运行长分析查询。在制作数据副本时要小心 - 从生产系统中完全同步会对其造成沉重负担(更有效的方法是使用最近的备份/文件快照从中恢复)。

答案 1 :(得分:2)

此类操作最好留给副本集的从属。首先,可以共享读锁以允许一次读取多次,但写锁将阻止读取。而且,虽然您无法确定查询的优先级,但mongodb会产生长时间运行的读/写查询。 Their concurrency docs应该提供帮助

如果你买不起另一台服务器,你可以在同一台机器上设置一个从机,只要你有一些备用的RAM /磁盘空间,你就可以轻易/偶尔使用从机。你必须小心,你的磁盘I / O会显着增加。