我制作了一个简单的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;
}
});
});
遵循的步骤
Varsions: "表达":" 4.10.6", " mongodb":" 1.4.23", " mongoose":" 3.8.21",
我在https://melvingeorge@bitbucket.org/melvingeorge/nodejsmongorssample.git
上提供了我为调试此问题所做的示例应用我不确定这是一个错误还是我的错误配置。如何解决这个问题?
答案 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