在 MongoDB 2.4.5 驱动程序中替代 `replSetGetConfig`?
Alternative to `replSetGetConfig` in MongoDB 2.4.5 driver?
我正在使用应用程序 运行ning MongoDB 2.4.5,目前无法升级。
我正在 node.js 中编写一些自动化脚本来启动副本集,但是由于我从 3 个相同的现有 mongodb 节点开始,所以我不能只使用replSetInitiate
命令与所有 3 个节点 - 我需要用一个我打算成为主要节点的初始化,然后用另外 2 个调用 replSetReconfig
使它们擦除和同步。
问题是,我会调用 replSetGetConfig
命令来获取我可以操作并发回的配置对象,但此命令仅在 mongodb 3.0 中添加。那么我有什么选择呢? replSetGetConfig
有替代命令吗? replSetInitiate
完成后,有什么方法可以让我自己生成合适的配置对象吗?或者我应该放弃 运行 一个 mongo shell 和 rs.conf()
?
这就是代码现在的样子,在所述版本中不起作用:
return connectToMongoDB(host)
.then((db) => {
// Initial configuration contains only the intended primary
var cfg = {
_id : id,
members : [{ _id: 0, host: host }]
};
return executeMongoCommand(db, { replSetInitiate : cfg })
.then((res) => {
// Passing on the db object so I don't have to reconnect
return {
db: db
};
});
})
.then((data) => {
// This would work in 3.0.0 and up to get the current RS config, but doesn't work at all in 2.4.5
return executeMongoCommand(data.db, { replSetGetConfig: 1 })
.then((res) => {
// storing the config we got and passing it on with the db object to the next step
data.cfg = data;
return data;
})
})
.then((data) => {
otherNodes.forEach((val, idx) => {
data.cfg.members.push({ _id: idx+1, host: val });
});
return executeMongoCommand(data.db, { replSetReconfig : data.cfg });
})
.catch(console.error);
返回的错误是no such cmd: replSetGetConfig
(作为旁注,rs.conf()
应该是 replSetGetConfig
的包装器,因为包装器以某种方式受支持,而底层功能不受支持。不要明白。)
更新/回答:
根据下面@Stennie 的回答,我实现了以下函数来获取版本 3.0.0 双方的此信息:
function getRSconfig(db){
return new Promise((resolve, reject) => {
if(parseInt(mongoVersion, 10) < 3){
db.db("local").collection("system.replset").findOne()
.then((data) => {
resolve(data);
}, (err) => {
reject(err);
});
}
else {
executeMongoCommand(db, { replSetGetConfig: 1 })
.then((data) => {
resolve(data);
}, (err) => {
reject(err);
})
}
});
}
并使用这个获取当前版本:
function getMongoVersion(db){
var adminDb = db.admin();
adminDb.serverStatus(function(err, info) {
mongoVersion = info.version;
});
}
在引入 replSetGetConfig
命令之前,驱动程序直接从本地数据库读取配置:db.getSiblingDB("local").system.replset.findOne()
。
您可以阅读此配置文档作为早于 MongoDB 3.0 的服务器的回退,它引入了 replSetGetConfig
作为适当的命令抽象。对于较新的服务器,该命令是受支持的 API 使用。
我正在使用应用程序 运行ning MongoDB 2.4.5,目前无法升级。
我正在 node.js 中编写一些自动化脚本来启动副本集,但是由于我从 3 个相同的现有 mongodb 节点开始,所以我不能只使用replSetInitiate
命令与所有 3 个节点 - 我需要用一个我打算成为主要节点的初始化,然后用另外 2 个调用 replSetReconfig
使它们擦除和同步。
问题是,我会调用 replSetGetConfig
命令来获取我可以操作并发回的配置对象,但此命令仅在 mongodb 3.0 中添加。那么我有什么选择呢? replSetGetConfig
有替代命令吗? replSetInitiate
完成后,有什么方法可以让我自己生成合适的配置对象吗?或者我应该放弃 运行 一个 mongo shell 和 rs.conf()
?
这就是代码现在的样子,在所述版本中不起作用:
return connectToMongoDB(host)
.then((db) => {
// Initial configuration contains only the intended primary
var cfg = {
_id : id,
members : [{ _id: 0, host: host }]
};
return executeMongoCommand(db, { replSetInitiate : cfg })
.then((res) => {
// Passing on the db object so I don't have to reconnect
return {
db: db
};
});
})
.then((data) => {
// This would work in 3.0.0 and up to get the current RS config, but doesn't work at all in 2.4.5
return executeMongoCommand(data.db, { replSetGetConfig: 1 })
.then((res) => {
// storing the config we got and passing it on with the db object to the next step
data.cfg = data;
return data;
})
})
.then((data) => {
otherNodes.forEach((val, idx) => {
data.cfg.members.push({ _id: idx+1, host: val });
});
return executeMongoCommand(data.db, { replSetReconfig : data.cfg });
})
.catch(console.error);
返回的错误是no such cmd: replSetGetConfig
(作为旁注,rs.conf()
应该是 replSetGetConfig
的包装器,因为包装器以某种方式受支持,而底层功能不受支持。不要明白。)
更新/回答:
根据下面@Stennie 的回答,我实现了以下函数来获取版本 3.0.0 双方的此信息:
function getRSconfig(db){
return new Promise((resolve, reject) => {
if(parseInt(mongoVersion, 10) < 3){
db.db("local").collection("system.replset").findOne()
.then((data) => {
resolve(data);
}, (err) => {
reject(err);
});
}
else {
executeMongoCommand(db, { replSetGetConfig: 1 })
.then((data) => {
resolve(data);
}, (err) => {
reject(err);
})
}
});
}
并使用这个获取当前版本:
function getMongoVersion(db){
var adminDb = db.admin();
adminDb.serverStatus(function(err, info) {
mongoVersion = info.version;
});
}
在引入 replSetGetConfig
命令之前,驱动程序直接从本地数据库读取配置:db.getSiblingDB("local").system.replset.findOne()
。
您可以阅读此配置文档作为早于 MongoDB 3.0 的服务器的回退,它引入了 replSetGetConfig
作为适当的命令抽象。对于较新的服务器,该命令是受支持的 API 使用。