替代MongoDB 2.4.5驱动程序中的`replSetGetConfig`?

时间:2017-07-23 17:43:01

标签: node.js mongodb replication mongodb-replica-set

我正在使用运行MongoDB 2.4.5 的应用程序,目前升级是不可能的。

我正在node.js中编写一些自动化脚本来启动副本集,但是由于我开始使用3个相同的现有mongodb节点,所以我不能只使用replSetInitiate命令节点 - 我需要初始化一个我打算成为主要节点的节点,然后用额外的2调用replSetReconfig以使它们擦除和同步。

问题是,我会调用replSetGetConfig命令来获取一个我可以操作并发回的配置对象,但是这个命令只在mongodb 3.0中添加。那么我有什么选择呢?是否有replSetGetConfig的替代命令?有没有办法在replSetInitiate完成后自己生成相应的配置对象?或者我应该放弃并使用rs.conf()运行mongo shell?

这就是现在代码的样子,在所述版本中不起作用:

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;
    });
}

1 个答案:

答案 0 :(得分:2)

在引入replSetGetConfig命令之前,驱动程序直接从本地数据库读取配置:db.getSiblingDB("local").system.replset.findOne()

您可以阅读此配置文档作为早于MongoDB 3.0的服务器的后备,后者将replSetGetConfig作为正确的命令抽象引入。对于较新的服务器,该命令是支持的API。