从Mongoose(MongoDB,NodeJS驱动程序)无法在副本集故障转移后自动重新连接到新PRIMARY

时间:2015-01-19 15:27:05

标签: node.js mongodb mongoose node-mongodb-native

我制作了一个简单的NodeJS应用程序,使用Mongoose作为MongoDB驱动程序。并连接到mongodb副本集。应用程序正常工作,直到我关闭当前主服务器,当PRIMARY关闭时,副本集自动选择一个新的PRIMARY。但是,之后节点应用程序似乎没有响应数据库查询。

代码:数据库连接

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. 在三个VM中创建了一个MongoDB副本集。
  2. 使用上面的测试API创建了一个简单的nodeJS App(Express + Mongoose)
  3. 已将GET请求发送至' test'持续与本地系统的应用程序保持一定的时间间隔。
  4. 取下PRIMARY实例
  5. 控制台将记录"错误:错误:连接已关闭"
  6. 申请已停止响应请求
  7. Varsions:     "表达":" 4.10.6",     " mongodb":" 1.4.23",     " mongoose":" 3.8.21",

    我在https://melvingeorge@bitbucket.org/melvingeorge/nodejsmongorssample.git

    上提供了我为调试此问题所做的示例应用

    我不确定这是一个错误还是我的错误配置。如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

仅在主实例上进行写操作。副本集需要一些时间来选择新的主服务器。

来自http://docs.mongodb.org/manual/faq/replica-sets/

  

副本设置故障转移需要多长时间?

     

它有所不同,但副本集将选择一个新的主要内容   分钟。

     

副本集的成员可能需要10-30秒才能声明   主要无法访问。这会引发选举。在此期间   选举时,群集无法进行写入。

     

选举本身可能需要10-30秒。

使用读取操作检查代码(查找/计数)

只要没有主实例,就不能进行写操作

答案 1 :(得分:0)

' rs_name'在replset选项中指定replicaSet是必需的。您可以使用mongoose.createConnection(uri, conf, callback)并在回调中获得最终的配置。

答案 2 :(得分:0)

看起来这已在NODE-818 / 2.2.10中得到修复。

但是我使用的是2.2.22并且仍然有这样的问题。

重新连接后,mongo客户端重新连接到辅助节点,而不是新选择的主节点,然后,我无法写入数据库。

我的连接字符串类似于mongodb://mongo1,mongo2,mongo3/db?replicaSet=rs