我没有那么大的收藏,有大约500k的记录,但它的任务至关重要。
我想添加一个字段并删除另一个字段。我想知道它是否会锁定插入/更新的集合(我真的不想要任何停机时间)。
我做了一个实验,它看起来并没有阻止它:
// mongo-console 1
use "my_db"
// add new field
db.my_col.update(
{},
{ $set:
{ foobar : "bizfoo"}
},
{ multi: true}
);
// mongo-console 2
use "my_db"
db.my_col.insert({_id: 1, foobar: 'Im in'});
db.my_col.findOne({_id: 1});
=>{ "_id" : 1, "foo" : "bar" }
虽然我不太明白为什么,因为db.currentOp()显示它上面有Write锁。
同样在生产系统上我有副本集,我很好奇它是如何影响迁移的。 有人可以回答这些问题,或者指出一些很好解释的文章。 谢谢!
(我使用的MongoDB版本是2.4)
答案 0 :(得分:2)
MongoDB 2.4锁定每个分片的数据库级别。你提到你有副本集。副本集对锁定没有影响。碎片做。如果您对数据进行了分片,则在执行更新时,锁定将仅锁定数据所在的分片上的数据库。如果没有分片数据,则在写入操作期间数据库将被锁定。
为了看到影响,您需要进行大量工作的测试。
您可以在以下网址阅读更多内容: http://www.mongodb.org/display/DOCS/How+does+concurrency+work