从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; } }); }); 

步骤如下

  1. 在三个虚拟机中创build了一个MongoDB副本集。
  2. 用上面的testingAPI创build了一个简单的nodeJS App(Express + Mongoose)
  3. 发送GET请求,以一定的时间间隔从本地系统连续“testing”到应用程序。
  4. 接下来的主要事件
  5. 控制台将logging“错误:错误:连接closures”
  6. 应用程序停止响应请求

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