【发布时间】:2017-02-08 15:34:51
【问题描述】:
更新:我在驱动程序上使用的是 2.1 版本,而不是 3.2
我有一个使用 MongoDB 的节点应用程序。我遇到的问题是,如果 MongoDB 服务器因任何原因出现故障,应用程序不会重新连接。 为了做到这一点,我的测试基于this official tutorial 中的代码。
var MongoClient = require('mongodb').MongoClient
, f = require('util').format;
MongoClient.connect('mongodb://localhost:27017/test',
// Optional: uncomment if necessary
// { db: { bufferMaxEntries: 3 } },
function(err, db) {
var col = db.collection('t');
setInterval(function() {
col.insert({a:1}, function(err, r) {
console.log("insert")
console.log(err)
col.findOne({}, function(err, doc) {
console.log("findOne")
console.log(err)
});
})
}, 1000)
});
想法是运行这个脚本,然后停止mongod,然后重新启动它。 所以,我们开始吧:
测试 1:停止 mongod 10 秒
将 MongoDb 停止 10 秒会达到预期的效果:它将停止运行这 10 秒的查询,然后在服务器返回 ip 后运行所有查询
测试 2:停止 mongod 30 秒
正好 30 秒后,我开始得到:
{ [MongoError: topology was destroyed] name: 'MongoError', message: 'topology was destroyed' }
insert
{ [MongoError: topology was destroyed] name: 'MongoError', message: 'topology was destroyed' }
麻烦的是,从这里开始,当我重新启动 mongod 时,连接没有重新建立。
解决方案?
这个问题有解决办法吗?如果是这样,你知道它是什么吗? 一旦我的应用开始吐出“拓扑已被破坏”,让一切恢复正常的唯一方法是重新启动整个应用......
【问题讨论】:
-
您可能从错误的方向处理此问题。根据连接字符串,您的应用程序正在连接到数据库的单个节点实例。如果您的应用程序需要正常运行时间,您应该强烈考虑连接到具有多个数据承载节点的副本集。如果配置正确,驱动程序将在故障转移后自动重新连接到新的主节点。