我有一个MongoDB实例,有时需要进行以前意外的查询。 (这就是无模式的全部重点,对吧?)
其中一些非常复杂,因此需要很长时间。这对我来说很好,但是我正在苦苦挣扎的是这些查询使Mongod服务本身崩溃了。
我认为处理这些情况的自然方法就是超时或拒绝查询,但看起来Mongod只是崩溃了(内核杀死了带OOM错误的mongod进程)
这令人沮丧,因为这没有警告。我知道MongoDB将内存管理留给了操作系统,所以我很困惑为什么它允许这种类型的崩溃发生。
有没有一种简单的方法来处理这种情况?
答案 0 :(得分:0)
当然。 cursor.maxTimeMS()允许您为查询设置超时。如果经过指定的时间,查询将终止。
如果关联的游标超出了其分配的时间限制,则MongoDB将终止操作作为目标。 MongoDB使用与db.killOp()相同的机制终止超出其分配的时间限制的操作。 MongoDB仅在其指定的中断点之一处终止操作。
MongoDB不会将客户端和服务器之间的网络延迟计入游标的时间限制。但是,对于分片群集,MongoDB确实包括mongos和mongod实例之间的延迟时间。
生成多批结果的查询将继续返回批处理,直到光标超过其分配的时间限制为止。
db.collection.find({description: /August [0-9]+, 1969/}).maxTimeMS(50)