【发布时间】:2011-07-30 14:36:25
【问题描述】:
MongoDB MapReduce 作业是否锁定数据库?我正在开发一个多用户 MongoDB Web 应用程序,并且担心多用户冲突和性能。有人对我有什么智慧之言吗?
【问题讨论】:
-
智慧之言,请注意我对已接受答案 WRT 并行性的评论。
MongoDB MapReduce 作业是否锁定数据库?我正在开发一个多用户 MongoDB Web 应用程序,并且担心多用户冲突和性能。有人对我有什么智慧之言吗?
【问题讨论】:
简单的答案?有时...
这在很大程度上取决于您如何使用 map/reduce ...但根据我的经验,这从来都不是问题。
这方面的信息不多,但在docs 中明确指出,有时会锁定,但它“允许大量并发操作。” em>
在 mongodb-user 组 asking 中有几个关于这个的问题......我见过的最好的回答 offically 是......“在 1.4 中它产生但不如它应该在 1.5 中对其他请求更加友好。”
这并不意味着它根本不会阻塞,但与阻塞whole mongod process 的 db.eval() 相比……这是你最好的选择。
也就是说,在 1.7.2 及更高版本中,现在有一个 nolock 选项用于 db.eval() ...
【讨论】:
不,mapreduce 不会锁定数据库。请参阅 the note here,就在“使用 db.eval()”之后(它解释了为什么 mapreduce 可能比 eval 更适合使用,因为 mapreduce 不会阻塞)。
如果您要运行大量 mapreduce 作业,您应该使用分片,因为这样作业可以在所有分片上并行运行。不幸的是,mapreduce 作业不能在副本集中的辅助节点上运行,因为必须写入结果并且副本是只读的。
【讨论】:
在 2.1.0 版本中,在输出选项中添加了一个“nonAtomic”标志。
【讨论】: