Ich arbeite mit einer Anwendung mit MongoDB 2.4.5, und derzeit ein Upgrade ist nicht in Frage.Alternative zu `replSetGetConfig` in MongoDB 2.4.5 Treiber?
Ich schreibe einige Automatisierungsskripte in node.js, um einen Replikatsatz zu initiieren, aber da ich mit 3 identischen, existierenden mongodb-Knoten anfange, kann ich nicht einfach den replSetInitiate
Befehl mit allen 3 Knoten - I verwenden muss mit einem initialisiert werden, der die primäre sein soll, und dann replSetReconfig
mit den zusätzlichen 2 aufrufen, damit sie gelöscht und synchronisiert werden.
Das Problem ist, würde ich den replSetGetConfig
Befehl aufrufen, um ein Config-Objekt zu erhalten, das ich manipulieren und zurücksenden kann, aber dieser Befehl wurde nur in mongodb 3.0 hinzugefügt. Was sind meine Alternativen? Gibt es einen alternativen Befehl zu replSetGetConfig
? Gibt es eine Möglichkeit, das passende Config-Objekt selbst zu erzeugen, nachdem replSetInitiate
fertig ist? Oder sollte ich einfach aufgeben und eine Mongo Shell mit rs.conf()
laufen lassen?
Dies ist, was der Code wie jetzt aussieht, die nicht in der Version funktioniert:
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);
Und die zurückgegebene Fehler no such cmd: replSetGetConfig
(Als Randbemerkung, rs.conf()
sein soll ist ein Wrapper für replSetGetConfig
für irgendwie ist der Wrapper unterstützt und die zugrundeliegende Funktion ist nicht sie es nicht bekommen)
UPDATE/ANTWORT:..
Basierend auf @Stennie ‚s Antwort unten ich die folgende Funktion implementiert haben für beide Seiten der Version, diese Informationen zu erhalten 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);
})
}
});
}
und dieses mit der aktuellen Version zu erhalten:
function getMongoVersion(db){
var adminDb = db.admin();
adminDb.serverStatus(function(err, info) {
mongoVersion = info.version;
});
}
Danke! Lief wie am Schnürchen. – motig88