通过查询删除数百万个文档时对副本集的影响是什么?

时间:2013-09-23 21:02:01

标签: mongodb database-replication mongodb-query

我的藏品有超过820万份文件。我需要通过查询删除2-3百万个(属性或两个属性被索引)。

我担心的是,由于oplog比我的容量增长更大,然后需要我从备份重新播种所有内容,导致我的辅助设备落后。

会是这样的......

db.my_collection.remove({attribute_1:'xyz'},false);

db.my_collection.remove({attribute_1:'xyz',attribute_2:'abc'},false);

是一个oplog条目,不会对我的辅助文件产生负面影响(除了实际删除文档)?或者它会被翻译成2-3百万次复制操作吗?

我认为答案是它将是一个操作,我可能需要从中恢复一些碎片,但不一定是oplog /辅助同步问题。

2 个答案:

答案 0 :(得分:2)

对于在主要文件中删除的每个文档,您最终会在oplog中输入单个条目。

因此,如果您在主服务器上删除了300万个文档,那么您最终将通过辅助服务器上的_id密钥删除300万个删除语句。

我会批处理它们并根据滞后限制删除,然后压缩或重新同步。

如果您有大量文档移动,您可能需要考虑使用paddingFactor集进行压缩。

答案 1 :(得分:2)

通过创建一个集合并向remove()添加一些匹配的文档来测试它是很容易的。

然后,您可以检查oplog以查看生成的条目:

use local
db.oplog.rs.find({op:'d'})

为了确保在主要和辅助文档上删除相同的文档,删除的每个文档都会在oplog中生成一个条目。

例如,在op: 'd'匹配两个文档后,oplog(remove())中的条目被删除:

{
    "ts" : Timestamp(1379971718, 1),
    "h" : NumberLong("8227301495520897544"),
    "v" : 2,
    "op" : "d",
    "ns" : "test.foo",
    "b" : true,
    "o" : {
        "_id" : ObjectId("5240b21e2fa8b603e8aaaceb")
    }
}
{
    "ts" : Timestamp(1379971718, 2),
    "h" : NumberLong("-5339031341149346886"),
    "v" : 2,
    "op" : "d",
    "ns" : "test.foo",
    "b" : true,
    "o" : {
        "_id" : ObjectId("5240b2202fa8b603e8aaacec")
    }
}