如何防止庞大的综合查询使MongoDB崩溃?

时间:2018-09-13 00:11:57

标签: mongodb ubuntu

我有一个MongoDB实例,有时需要进行以前意外的查询。 (这就是无模式的全部重点,对吧?)

其中一些非常复杂,因此需要很长时间。这对我来说很好,但是我正在苦苦挣扎的是这些查询使Mongod服务本身崩溃了。

我认为处理这些情况的自然方法就是超时或拒绝查询,但看起来Mongod只是崩溃了(内核杀死了带OOM错误的mongod进程)

这令人沮丧,因为这没有警告。我知道MongoDB将内存管理留给了操作系统,所以我很困惑为什么它允许这种类型的崩溃发生。

有没有一种简单的方法来处理这种情况?

1 个答案:

答案 0 :(得分:0)

当然。 cursor.maxTimeMS()允许您为查询设置超时。如果经过指定的时间,查询将终止。

来自文档

如果关联的游标超出了其分配的时间限制,则MongoDB将终止操作作为目标。 MongoDB使用与db.killOp()相同的机制终止超出其分配的时间限制的操作。 MongoDB仅在其指定的中断点之一处终止操作。

MongoDB不会将客户端和服务器之间的网络延迟计入游标的时间限制。但是,对于分片群集,MongoDB确实包括mongos和mongod实例之间的延迟时间。

生成多批结果的查询将继续返回批处理,直到光标超过其分配的时间限制为止。

用法

db.collection.find({description: /August [0-9]+, 1969/}).maxTimeMS(50)