从Mongoose(MongoDB,NodeJS Driver)复制集故障转移后,无法自动重新连接到新的PRIMARY
我做了一个简单的NodeJS应用程序,Mongoose作为MongoDB驱动程序。 并连接到一个mongodb副本集。 该应用程序工作正常,直到我closures当前的主要,当PRIMARYclosures时,副本集自动select一个新的主要。 但是,之后,节点应用程序似乎没有响应数据库查询。
代码:数据库连接
var options = { server: { socketOptions: { keepAlive: 1, connectTimeoutMS:30000, socketTimeoutMS:90000 } }, replset: { socketOptions: { keepAlive: 1, connectTimeoutMS : 30000 , socketTimeoutMS: 90000 }, rs_name: 'rs0' } }; var uri = "mongodb://xxx.xxx.xxx.xxx:27017,xxx.xxx.xxx.xxx:27017,xxx.xxx.xxx.xxx:27017/rstest"; mongoose.connect(uri,options);
代码:数据库查询
router.('/test',function(req,res){ var testmodel = new testModel('test') ; testmodel.save(function (err, doc,numberAffected) { if (err) { console.log("ERROR: "+ err); res.status = 404; res.end; }else{ console.log("Response sent "); res.status = 200; res.end; } }); });
步骤如下
- 在三个虚拟机中创build了一个MongoDB副本集。
- 用上面的testingAPI创build了一个简单的nodeJS App(Express + Mongoose)
- 发送GET请求,以一定的时间间隔从本地系统连续“testing”到应用程序。
- 接下来的主要事件
- 控制台将logging“错误:错误:连接closures”
- 应用程序停止响应请求
Varsions:“express”:“4.10.6”,“mongodb”:“1.4.23”,“mongoose”:“3.8.21”,
我已经完成了一个debugging此问题的示例应用程序, url为https://melvingeorge@bitbucket.org/melvingeorge/nodejsmongorssample.git
我不知道这是否是一个错误或从我的结尾错误的configuration。 如何解决这个问题?
写操作仅在主实例上进行。 副本集将需要一些时间才能select新的主服务器。
来自http://docs.mongodb.org/manual/faq/replica-sets/
副本集故障转移需要多长时间?
它有所不同,但副本集将在一分钟内select一个新的主。
副本集的成员可能需要10-30秒才能声明主要的不可访问。 这触发选举。 在选举期间,群集不可写入。
选举本身可能需要10-30秒。
用读操作检查你的代码(find / count)
只要没有主实例,就不能进行写操作
replset选项中的'rs_name'是指定replicaSet所必需的。 您可以使用mongoose.createConnection(uri, conf, callback)
并在callback中获得最终的conf。
看起来这个在NODE-818 / 2.2.10中已经修复了。
但是我正在使用2.2.22,仍然有这样的问题。
在重新连接后,mongo客户端重新连接到一个辅助节点,而不是新select的主节点,然后是我不能写入数据库。
我的连接string就像mongodb://mongo1,mongo2,mongo3/db?replicaSet=rs