it-swarm.com.de

mongoError: Topologie wurde zerstört

Ich habe einen REST - Dienst in node.js mit Restify und Mongoose und einen MongoDB mit einer Sammlung mit etwa 30.000 regulären Dokumenten entwickelt .. Ich habe meinen Knotendienst durch pmx und pm2.

Gestern begann der Knoten plötzlich mit der Meldung "MongoError: Topologie wurde zerstört" Fehler zu quetschen, mehr nicht ... Ich habe keine Ahnung, was damit gemeint ist und was möglicherweise dazu geführt haben könnte. Es gibt auch nicht viel zu finden, wenn Google dies sucht. Also dachte ich, ich würde hier fragen.

Nach dem Neustart des Knotendienstes heute sind keine Fehler mehr aufgetreten. Ich habe auch einen davon in der Produktion und es macht mir Angst, dass dies jederzeit zu einem ziemlich wichtigen Teil des dortigen Setups passieren könnte ...

Ich verwende folgende Versionen der genannten Pakete:

  • mungo: 4.0.3
  • wieder herstellen: 3.0.3
  • knoten: 0.10.25
101
dreagan

Es scheint zu bedeuten, dass die Verbindung Ihres Knotenservers zu Ihrer MongoDB-Instanz unterbrochen wurde, während versucht wurde, darauf zu schreiben.

Schauen Sie sich den Mongo-Quellcode an, der diesen Fehler generiert

Mongos.prototype.insert = function(ns, ops, options, callback) {
    if(typeof options == 'function') callback = options, options = {};
    if(this.s.state == DESTROYED) return callback(new MongoError(f('topology was destroyed')));
    // Topology is not connected, save the call in the provided store to be
    // Executed at some point when the handler deems it's reconnected
    if(!this.isConnected() && this.s.disconnectHandler != null) {
      callback = bindToCurrentDomain(callback);
      return this.s.disconnectHandler.add('insert', ns, ops, options, callback);
    }

    executeWriteOperation(this.s, 'insert', ns, ops, options, callback);
}

Dies scheint nicht mit dem in den Kommentaren zitierten Problem von Sails in Zusammenhang zu stehen, da keine Upgrades installiert wurden, um den Absturz oder das "Update" auszulösen.

72
Jason Nichols

Ich weiß, dass Jasons Antwort akzeptiert wurde, aber ich hatte das gleiche Problem mit Mongoose und stellte fest, dass der Dienst, der meine Datenbank hostet, die folgenden Einstellungen empfohlen hat , um die Verbindung von Mongodb in der Produktion aufrecht zu erhalten:

var options = {
  server: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } },
  replset: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } }
};
mongoose.connect(secrets.db, options);

Ich hoffe, dass diese Antwort anderen Leuten helfen kann, die Fehler "Topologie wurde zerstört" haben.

70
Adrien Joly

Dieser Fehler ist darauf zurückzuführen, dass der Mongotreiber die Verbindung aus irgendeinem Grund abbricht (der Server war beispielsweise inaktiv).

Standardmäßig versucht mongoose, die Verbindung 30 Sekunden lang wiederherzustellen, beendet dann den Wiederholungsversuch und gibt Fehler für immer aus, bis es neu gestartet wird. 

Sie können dies ändern, indem Sie diese beiden Felder in den Verbindungsoptionen bearbeiten

mongoose.connect(uri, 
    { server: { 
        // sets how many times to try reconnecting
        reconnectTries: Number.MAX_VALUE,
        // sets the delay between every retry (milliseconds)
        reconnectInterval: 1000 
        } 
    }
);

Dokumentation der Anschlussmöglichkeiten

56
Gaafar

In meinem Fall wurde dieser Fehler durch eine db.close(); aus einem 'waitit'-Abschnitt in' async 'verursacht.

MongoClient.connect(url, {poolSize: 10, reconnectTries: Number.MAX_VALUE, reconnectInterval: 1000}, function(err, db) {
    // Validate the connection to Mongo
    assert.equal(null, err);    
    // Query the SQL table 
    querySQL()
    .then(function (result) {
        console.log('Print results SQL');
        console.log(result);
        if(result.length > 0){

            processArray(db, result)
            .then(function (result) {
                console.log('Res');
                console.log(result);
            })
            .catch(function (err) {
                console.log('Err');
                console.log(err);
            })
        } else {
            console.log('Nothing to show in MySQL');
        }
    })
    .catch(function (err) {
        console.log(err);
    });
    db.close(); // <--------------------------------THIS LINE
});
10

Nur ein kleiner Zusatz zu Gaafars Antwort, es gab mir eine Abwertungswarnung. Anstelle des Serverobjekts wie folgt:

MongoClient.connect(MONGO_URL, {
    server: {
        reconnectTries: Number.MAX_VALUE,
        reconnectInterval: 1000
    }
});

Es kann auf das Objekt der obersten Ebene gehen. Im Grunde nehmen Sie es einfach aus dem Serverobjekt und fügen Sie es wie folgt in das Optionsobjekt ein:

MongoClient.connect(MONGO_URL, {
    reconnectTries: Number.MAX_VALUE,
    reconnectInterval: 1000
});
7
alucinare

"Topologie wurde zerstört" kann durch das Trennen der Verbindung von Mungo verursacht werden, bevor Mungo-Dokumentindizes erstellt werden, per dieser Kommentar

Um vor dem Trennen der Verbindung sicherzustellen, dass für alle Modelle die Indizes erstellt wurden, können Sie:

await Promise.all(mongoose.modelNames().map(model => mongoose.model(model).ensureIndexes()));

await mongoose.disconnect();
6
golfadas

Ich traf dies in kubernetes/minikube + nodejs + mongoose-Umgebung .. Das Problem war, dass der DNS-Dienst eine Art Latenz hatte. Das Überprüfen von DNS ist bereit, mein Problem gelöst.

const dns = require('dns');

var dnsTimer = setInterval(() => {
	dns.lookup('mongo-0.mongo', (err, address, family) => {
		if (err) {
			console.log('DNS LOOKUP ERR', err.code ? err.code : err);
		} else {
			console.log('DNS LOOKUP: %j family: IPv%s', address, family);
			clearTimeout(dnsTimer);
			mongoose.connect(mongoURL, db_options);
		}
	});
}, 3000);


var db = mongoose.connection;
var db_options = {
	autoReconnect:true,

	poolSize: 20,
	socketTimeoutMS: 480000,
	keepAlive: 300000,

	keepAliveInitialDelay : 300000,
	connectTimeoutMS: 30000,
	reconnectTries: Number.MAX_VALUE,
	reconnectInterval: 1000,
	useNewUrlParser: true
};

(Die Zahlen in db_options sind in stackoverflow und ähnlichen Websites beliebig.)

2
tkrizsa

Ich hatte auch den gleichen Fehler. Schließlich habe ich festgestellt, dass mein Code fehlerhaft ist. Ich benutze den Lastausgleich für zwei nodejs-Server, aber ich aktualisiere nur den Code eines Servers. 

Ich ändere meinen mongod-Server from standalone to replication, vergesse jedoch das entsprechende Update für die Verbindungszeichenfolge, so dass ich diesen Fehler gefunden habe.

standalone-Verbindungszeichenfolge: mongodb://server-1:27017/mydb Replikationsverbindungszeichenfolge: mongodb://server-1:27017,server-2:27017,server-3:27017/mydb?replicaSet=myReplSet

details hier : [Mongo-Dokument für Verbindungszeichenfolge]

2
lutaoact

Ich habe diesen Fehler erhalten, als ich eine neue Datenbank in meiner MongoDb Compass Community erstellte. Das Problem war mit meinem Mongod, es lief nicht. Als Fix musste ich also den Mongod-Befehl wie zuvor ausführen.

C:\Program Files\MongoDB\Server\3.6\bin>mongod

Nachdem ich diesen Befehl ausgeführt hatte, konnte ich eine Datenbank erstellen.

Ich hoffe es hilft.

1
Sibeesh Venu

Ich hatte einige Zeit damit zu kämpfen - wie Sie aus anderen Antworten ersehen können, kann das Problem sehr unterschiedlich sein.

Der einfachste Weg, um herauszufinden, was die Ursache ist, besteht darin, loggingLevel: info in den Optionen zu aktivieren

1
orepor

Sebastian Kommentar zu Adriens Antwort braucht mehr Aufmerksamkeit, es hat mir geholfen, aber es könnte sein, dass ein Kommentar irgendwann ignoriert wird also hier ist eine Lösung :

var options =  { useMongoClient: true, keepAlive: 1, connectTimeoutMS: 30000, reconnectTries: 30, reconnectInterval: 5000 }
mongoose.connect(config.mongoConnectionString, options, (err) => {
    if(err) {
        console.error("Error while connecting", err);
    }
});
0
Black Mamba

In meinem Fall wurde dieser Fehler von einer identischen Serverinstanz verursacht, die bereits im Hintergrund ausgeführt wird. 

Das Seltsame ist, wenn ich meinen Server ohne Benachrichtigung gestartet habe, läuft bereits einer. Die Konsole zeigte nichts wie "etwas benutzt Port xxx". Ich könnte sogar etwas auf den Server hochladen. Ich habe also ziemlich lange gebraucht, um dieses Problem zu lokalisieren.

Nach dem Schließen aller Anwendungen, die ich mir vorstellen kann, konnte ich den Vorgang, der diesen Port verwendet, im Aktivitätsmonitor meines Mac immer noch nicht finden. Ich muss lsof verwenden, um zu verfolgen. Der Täter war nicht überraschend - es ist ein Knotenprozess. Bei der im Terminal angezeigten PID habe ich festgestellt, dass sich die Portnummer im Monitor von der meines Servers unterscheidet.

Alles in allem können alle Knotenprozesse dieses Problem direkt lösen.

0
AnLuoRidge

Sie müssen mongo neu starten, um den Topologiefehler zu beheben, und anschließend einige Optionen von mongoose oder mongoclient ändern, um dieses Problem zu beheben:

var mongoOptions = {
    useMongoClient: true,
    keepAlive: 1,
    connectTimeoutMS: 30000,
    reconnectTries: Number.MAX_VALUE,
    reconnectInterval: 5000,
    useNewUrlParser: true
}

mongoose.connect(mongoDevString,mongoOptions);
0
Ganesh sharma

Hier, was ich getan habe, funktioniert es gut. Das Problem wurde behoben, nachdem die folgenden Optionen hinzugefügt wurden.

const dbUrl = "mongodb://localhost:27017/sampledb";
const options =  { useMongoClient: true, keepAlive: 1, connectTimeoutMS: 30000, reconnectTries: 30, reconnectInterval: 5000, useNewUrlParser: true }
mongoose.connect(dbUrl,options, function(
  error
) {
  if (error) {
    console.log("mongoerror", error);
  } else {
    console.log("connected");
  }

});