MongoRor: Topologie werd vernietigd

Ik heb een rustdienst gebouwd in Node.js met REQUITER EN MANGOOSE EN EEN MONGODB MET EEN COLLECTIE MET ongeveer 30.000 reguliere documenten.
Ik heb mijn knooppuntservice door PMX en PM2.

Gisteren, plotseling begon Knooppunt fouten te hangen met het bericht “MongoRor: Topology werd vernietigd”, niets meer.
Ik heb geen idee wat hierdoor wordt bedoeld en wat dit mogelijk zou kunnen hebben geactiveerd. Er is ook niet veel te vinden bij het zoeken van dit. Dus ik dacht dat ik hier zou vragen.

Nadat u de Node-service vandaag hebt gestart, zijn de fouten gestopt met binnenkomen.
Ik heb ook een van deze in productie en het maakt me bang dat dit op een bepaald moment kan gebeuren aan een behoorlijk cruciaal onderdeel van de opstelling die daar loopt …

Ik gebruik de volgende versies van de genoemde pakketten:

  • Mongoose: 4.0.3
  • RESTIFICEREN: 3.0.3
  • NODE: 0.10.25

Antwoord 1, Autoriteit 100%

Het lijkt te bedoelen dat de verbinding van je knooppuntserver op je MongoDB-instantie werd onderbroken, terwijl het probeerde eraan te schrijven.

Bekijk de mongo broncode die deze fout genereert

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

Dit lijkt niet te maken met het gevraagde sails-nummer in de opmerkingen, omdat er geen upgrades werden geïnstalleerd om de crash of de “fix”

te precipiteren


Antwoord 2, Autoriteit 81%

Ik weet dat het antwoord van Jason werd geaccepteerd, maar ik had hetzelfde probleem met mangoest en vond dat De service die mijn database is aanbevolen om de volgende instellingen toe te passen om MongoDB’s verbinding in leven te houden in de productie:

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

Ik hoop dat dit antwoord kan helpen andere mensen te hebben die “topologie is vernietigd” fouten.


Antwoord 3, Autoriteit 77%

Deze fout is het gevolg van Mongo-stuurprogramma die de verbinding om welke reden dan ook laat vallen (server was bijvoorbeeld).

Door de standaard mangoest zal proberen zich gedurende 30 seconden opnieuw aan te sluiten, dan stoppen met het opnieuw proberen en gooien fouten voor altijd totdat deze opnieuw wordt opgestart.

U kunt dit wijzigen door deze 2 velden in de aansluitopties

te bewerken

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

documentatie over verbindingsopties


Antwoord 4, autoriteit 19%

In mijn geval werd deze fout veroorzaakt door een db.close();uit een ‘wacht’-sectie binnen ‘async’

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

Antwoord 5, autoriteit 13%

Slechts een kleine toevoeging aan het antwoord van Gaafar, het gaf me een waarschuwing voor beëindiging. In plaats van op het serverobject, als volgt:

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

Het kan op het object op het hoogste niveau gaan. Kortom, haal het gewoon uit het serverobject en plaats het als volgt in het options-object:

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

Antwoord 6, autoriteit 7%

‘Topologie is vernietigd’ kan worden veroorzaakt doordat Mongoose de verbinding verbreekt voordat Mongo-documentindexen zijn gemaakt, volgens deze opmerking

Om ervoor te zorgen dat alle modellen hun indexen hebben voordat ze worden losgekoppeld, kunt u:

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

Antwoord 7, autoriteit 3%

Sebastian-commentaar op Adriens antwoord heeft meer aandacht nodig, het heeft me geholpen, maar als commentaar kan het soms worden genegeerd dus hier is een oplossing:

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

Antwoord 8, autoriteit 2%

Ik had ook dezelfde fout. Ten slotte ontdekte ik dat ik een fout in mijn code heb. Ik gebruik load balance voor twee nodejs-servers, maar ik werk alleen de code van één server bij.

Ik verander mijn mongod-server from standalone to replication, maar ik vergeet de bijbehorende update voor de verbindingsreeks uit te voeren, dus ik ontmoette deze fout.

standalone verbindingsreeks:

mongodb://server-1:27017/mydb

replicatie verbindingsreeks:

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

details hier:[mongo-document voor verbindingsreeks]


Antwoord 9, autoriteit 2%

Ik heb dit ontmoet in kubernetes/minikube + nodejs + mongoose-omgeving.
Het probleem was dat de DNS-service een soort latentie had. Controleren of DNS klaar is, heeft mijn probleem opgelost.

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

Antwoord 10, autoriteit 2%

Hier wat ik deed, het werkt prima. Het probleem was verdwenen na het toevoegen van onderstaande opties.

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

Antwoord 11, Autoriteit 2%

U moet MONGO opnieuw opstarten om de topologiefout op te lossen, verandert u gewoon enkele opties van mangoest of mongoklient om dit probleem te overwinnen:

var mongoOptions = {
    useMongoClient: true,
    keepAlive: 1,
    connectTimeoutMS: 30000,
    reconnectTries: Number.MAX_VALUE,
    reconnectInterval: 5000,
    useNewUrlParser: true
}
mongoose.connect(mongoDevString,mongoOptions);

Antwoord 12

Ik heb deze fout, terwijl ik een nieuwe database maakte op mijn MongoDB Compass Community. Het probleem was met mijn Mongod, het draaide niet. Dus als een oplossing moest ik het Mongod-commando uitvoeren als voorgaande.

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

Ik was in staat om een ​​database te maken na het uitvoeren van die opdracht.

Ik hoop dat het helpt.


Antwoord 13

Ik worstelde hier al een tijdje mee – zoals je van andere antwoorden kunt zien, kan het probleem heel anders zijn.

De eenvoudigste manier om erachter te komen wat het veroorzaakt is dat dit is om in te schakelen loggerLevel: 'info'in de opties


Antwoord 14

In mijn geval werd deze fout veroorzaakt door een identieke server-instantie die al aan de achtergrond loopt.

Het rare ding is toen ik mijn server begon zonder kennisgeving er is er nog één die hardloopt, de console toonde niets als ‘iets gebruikt Port XXX’. Ik zou zelfs iets naar de server kunnen uploaden. Dus het kostte me vrij lang om dit probleem te vinden.

Bovendien kon ik na het sluiten van alle programma’s die ik me kan voorstellen het proces dat deze poort gebruikt nog steeds niet vinden in de activiteitenmonitor van mijn Mac. Ik moet lsofgebruiken om te traceren. De boosdoener was niet verrassend – het is een knooppuntproces. Met de PID die in de terminal wordt weergegeven, ontdekte ik echter dat het poortnummer in de monitor anders is dan het nummer dat door mijn server wordt gebruikt.

Al met al kan het uitschakelen van alle knooppuntprocessen dit probleem direct oplossen.


Antwoord 15

Gebruik hier mangoest, maar je zou een soortgelijke controle zonder kunnen doen

export async function clearDatabase() {
  if (mongoose.connection.readyState === mongoose.connection.states.disconnected) {
    return Promise.resolve()
  }
  return mongoose.connection.db.dropDatabase()
}

Mijn gebruiksvoorbeeld was het testen van fouten, dus als we de verbinding hebben verbroken, voer ik geen bewerkingen uit.


Antwoord 16

Ik heb onlangs dit probleem gehad. Dit is wat ik doe:

  1. Herstart MongoDb: sudo service mongod restart
  2. Start My NodeJS APP opnieuw. Ik gebruik pm2 om deze pm2 restart [your-app-id]af te handelen. Gebruik de pm2 list
  3. om een identiteitsbewijs te krijgen


Antwoord 17

Ik heb dit probleem opgelost door:

  1. ervoor zorgen dat Mongo draait
  2. mijn server opnieuw opstarten

Other episodes