我做了一个简单的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;
}
});
});
遵循的步骤
- 在三个 VM 中创建了一个 MongoDB 副本集。
- 创建了一个简单的nodeJS应用程序(Express + Mongoose),测试API如上所述
- 从本地系统向应用程序发送 GET 请求以连续"测试",并具有一定的时间间隔。
- 已关闭主实例
- 控制台将记录"错误:错误:连接已关闭"
- 应用程序停止响应请求
校队: "快递": "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