2017-07-23 2 views
0

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

Antwort

2

Bevor der Befehl replSetGetConfig eingeführt wurde, lesen Treiber die Konfiguration direkt aus der lokalen Datenbank: db.getSiblingDB("local").system.replset.findOne().

Sie könnten dieses Konfigurationsdokument als Fallback für ältere Server als MongoDB 3.0 lesen, die replSetGetConfig als richtige Befehlsabstraktion eingeführt haben. Bei neueren Servern ist der Befehl die zu verwendende unterstützte API.

+0

Danke! Lief wie am Schnürchen. – motig88