Mongodb 什么';通过查询删除数百万个文档时对复制集的影响是什么?

Mongodb 什么';通过查询删除数百万个文档时对复制集的影响是什么?,mongodb,database-replication,mongodb-query,Mongodb,Database Replication,Mongodb Query,我收集了超过820万份文件。我需要通过查询删除其中的200-300万个(属性或两个属性被索引) 我担心的是,由于oplog的容量超过了我的容量,然后需要我从备份中重新为它们设定种子,导致我的二级备份落后 像这样的东西 db.my_collection.remove({attribute_1:'xyz'},false); 或 是否只有一个oplog条目不会对我的二级数据库产生负面影响(除了实际删除文档之外)?还是会转化为200-300万次复制操作 我认为答案是这将是一个操作,我可能需要从中恢复一

我收集了超过820万份文件。我需要通过查询删除其中的200-300万个(属性或两个属性被索引)

我担心的是,由于oplog的容量超过了我的容量,然后需要我从备份中重新为它们设定种子,导致我的二级备份落后

像这样的东西

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

是否只有一个oplog条目不会对我的二级数据库产生负面影响(除了实际删除文档之外)?还是会转化为200-300万次复制操作


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

对于在主服务器上删除的每个文档,oplog中都会有一个单独的条目

因此,如果您在主服务器上删除了300万个文档,那么通过辅助服务器上的_id键,您将得到300万个remove语句

我会对它们进行批处理,并根据延迟限制删除,然后压缩或重新同步


如果你有很多文档移动,你可能会想考虑压缩与PATIGIN因子集的关系。

< P>你会在OPROG中得到一个单独的条目,用于在主文档中删除的每个文档。

因此,如果您在主服务器上删除了300万个文档,那么通过辅助服务器上的_id键,您将得到300万个remove语句

我会对它们进行批处理,并根据延迟限制删除,然后压缩或重新同步


如果你有大量的文档移动,你可能会想考虑压缩与PATION因子集的关系。

很容易通过创建一个集合来测试,并添加一些匹配的文档给<代码> Read()/<代码>

然后,您可以检查oplog以查看生成了哪些条目:

use local
db.oplog.rs.find({op:'d'})
为了确保删除主副本和辅助副本上的相同文档,删除的每个文档都会在oplog中生成一个条目

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

{
    "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")
    }
}

通过创建一个集合并向
remove()
添加一些匹配的文档,可以很容易地测试这一点

然后,您可以检查oplog以查看生成了哪些条目:

use local
db.oplog.rs.find({op:'d'})
为了确保删除主副本和辅助副本上的相同文档,删除的每个文档都会在oplog中生成一个条目

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

{
    "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")
    }
}

如果我想编写这样一个脚本,您知道有什么比尝试解析db.printReplicationInfo()或db.printSlaveReplicationInfo()的输出更好的方法吗?如果要编写脚本,我会使用底层的replSetGetStatus命令。如果我想编写这样一个脚本,有什么比尝试解析db.printReplicationInfo()或db.printSlaveReplicationInfo()的输出更好的方法吗?如果要编写脚本,我将使用底层的replSetGetStatus命令。这已经足够清楚了。MongoDB在这方面有推荐的最佳实践吗?如果您担心对复制的影响,jeffl的批处理和节流删除方法是非常明智的。如果不了解服务器环境的更多资源/性能详细信息,就很难说删除会产生什么影响(即,您的二级服务器可能能够保持良好的性能)。64位Linux系统的可用磁盘空间占可用磁盘空间的5%,因此,除非您有一个小的oplog,否则您可能不太可能通过数百万次删除将其回滚。最好在足够清晰的暂存/质量保证环境中进行测试。MongoDB在这方面有推荐的最佳实践吗?如果您担心对复制的影响,jeffl的批处理和节流删除方法是非常明智的。如果不了解服务器环境的更多资源/性能详细信息,就很难说删除会产生什么影响(即,您的二级服务器可能能够保持良好的性能)。64位Linux系统的可用磁盘空间占可用磁盘空间的5%,因此,除非您有一个小的oplog,否则您可能不太可能通过数百万次删除将其回滚。最好在阶段/质量保证环境中进行测试