mongoError:拓扑被破坏
我有一个使用Restify和Mongoose在node.js中构build的REST服务,以及一个带有大约30,000个常规大小文档的集合的mongoDB。 我有我的节点服务通过pmx和pm2运行。
昨天突然,节点开始用“MongoError:Topology被摧毁”的消息来剔除错误,仅此而已。 我不知道这是什么意思,什么可能触发这个。 谷歌search这个时候也没有多less东西可以find。 所以我想我会在这里问。
今天重新启动节点服务后,错误停止进来。我也有其中一个运行在生产中,它吓到我,这可能会发生在任何给定的时间的设置运行在那里非常关键的一部分…
我正在使用提到的软件包的以下版本:
- mongoose:4.0.3
- restify:3.0.3
- 节点:0.10.25
这似乎意味着您的节点服务器与您的MongoDB实例的连接在尝试写入时被中断。
看看产生这个错误的Mongo源代码
Mongos.prototype.insert = function(ns, ops, options, callback) { if(typeof options == 'function') callback = options, options = {}; if(this.s.state == DESTROYED) return callback(new MongoError(f('topology was destroyed'))); // Topology is not connected, save the call in the provided store to be // Executed at some point when the handler deems it's reconnected if(!this.isConnected() && this.s.disconnectHandler != null) { callback = bindToCurrentDomain(callback); return this.s.disconnectHandler.add('insert', ns, ops, options, callback); } executeWriteOperation(this.s, 'insert', ns, ops, options, callback); }
这似乎与评论中引用的Sails问题没有关系,因为没有安装升级来解决崩溃或“修复”
我知道Jason的答案被接受了,但是我对Mongoose也有同样的问题,并且发现托pipe我的数据库的服务build议应用以下设置以保持Mongodb在生产中的连接:
var options = { server: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } }, replset: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } } }; mongoose.connect(secrets.db, options);
我希望这个答复可以帮助其他人有“拓扑被摧毁”的错误。
这个错误是由于mongo驱动程序因任何原因而丢失了连接(例如服务器closures)。
默认情况下,mongoose会尝试重新连接30秒,然后停止重试,并永远抛出错误,直到重新启动。
您可以通过在连接选项中编辑这两个字段来更改它
mongoose.connect(uri, { server: { // sets how many times to try reconnecting reconnectTries: Number.MAX_VALUE, // sets the delay between every retry (milliseconds) reconnectInterval: 1000 } } );
连接选项文档
我也有同样的错误。 最后,我发现我的代码有一些错误。 我使用两个nodejs服务器的负载平衡,但我只是更新一个服务器的代码。
我将我的mongod服务器from standalone to replication
更改from standalone to replication
,但我忘记做连接string的相应更新,所以我遇到了这个错误。
独立连接string: mongodb://server-1:27017/mydb
复制连接string: mongodb://server-1:27017,server-2:27017,server-3:27017/mydb?replicaSet=myReplSet
详情在这里: [连接string的mongo文档]