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



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

代码:数据库连接

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. 创建了一个简单的nodeJS应用程序(Express + Mongoose),测试API如上所述
  3. 从本地系统向应用程序发送 GET 请求以连续"测试",并具有一定的时间间隔。
  4. 已关闭主实例
  5. 控制台将记录"错误:错误:连接已关闭"
  6. 应用程序停止响应请求

校队: "快递": "4.10.6", "mongodb": "1.4.23", "猫鼬": "3.8.21",

我为调试此问题所做的示例应用程序可在 https://melvingeorge@bitbucket.org/melvingeorge/nodejsmongorssample.git

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

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

与 http://docs.mongodb.org/manual/faq/replica-sets/相比

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

它各不相同,但副本集将在 分钟。

副本集的成员可能需要 10-30 秒才能声明 主要无法访问。这会触发选举。期间 选择,则群集不可用于写入。

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

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

只要没有主实例,就不能做写入操作

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

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

但是我正在使用 2.2.22,但仍然有这样的问题。

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

我的连接字符串就像mongodb://mongo1,mongo2,mongo3/db?replicaSet=rs

相关内容

  • 没有找到相关文章

最新更新