mongoError: टोपोलॉजी नष्ट हो गई थी


163

मेरे पास रेस्टोर और मोंगोज़ के साथ नोड.जेएस में निर्मित एक आरईएस सेवा है और लगभग 30.000 नियमित आकार के दस्तावेजों के साथ एक संग्रह के साथ एक मोंगोबडी है। मेरे पास pmx और pm2 के माध्यम से मेरी नोड सेवा चल रही है।

कल, अचानक, नोड ने "MongoError: टोपोलॉजी को नष्ट कर दिया" संदेश के साथ त्रुटियों को बाहर करना शुरू कर दिया, और कुछ नहीं। मुझे नहीं पता कि इसका क्या मतलब है और इससे क्या संभव हो सकता है। जब Google इसे खोज रहा है तो बहुत कुछ नहीं मिला है। इसलिए मैंने सोचा कि मैं यहाँ पूछूंगा।

आज नोड सेवा को फिर से शुरू करने के बाद, त्रुटियों में आना बंद हो गया। मेरे पास इनमें से एक उत्पादन में चल रहा है और यह मुझे डराता है कि यह किसी भी समय वहां चल रहे सेटअप के एक बहुत ही महत्वपूर्ण हिस्से में हो सकता है ...

मैं उल्लिखित संकुल के निम्नलिखित संस्करणों का उपयोग कर रहा हूँ:

  • mongoose: 4.0.3
  • पुनर्स्थापित करें: 3.0.3
  • नोड: 0.10.25

2
मैं केवल mongodb ड्राइवर का उपयोग करके इसी तरह की समस्याएँ ले रहा हूँ :(
0x8890

1
मैं पाल का उपयोग नहीं कर रहा हूं, इसलिए नहीं, मुझे नहीं लगता कि मेरी समस्या को ठीक किया जाएगा
9

जवाबों:


98

ऐसा लगता है कि आपके नोड सर्वर का कनेक्शन आपके MongoDB उदाहरण से बाधित हो गया था जबकि वह इसे लिखने की कोशिश कर रहा था।

उस त्रुटि उत्पन्न करने वाले Mongo स्रोत कोड पर एक नज़र डालें

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

यह टिप्पणी में उद्धृत पाल मुद्दे से संबंधित प्रतीत नहीं होता है, क्योंकि दुर्घटना को ठीक करने या "ठीक" करने के लिए कोई अपग्रेड स्थापित नहीं किया गया था


2
मेरे पास एक ही मुद्दा है और यह लगभग हर हफ्ते होता है और मानगो के साथ काम करने वाले एप्लिकेशन को बंद कर देता है, क्या यह कुछ समस्या है जो मैंने उत्पन्न की है या यह मानस में एक मुद्दा है?
मोहम्मद गंजी

@ मोहम्मदगांजी: क्लाइंट कोड डिबगिंग के दौरान और बयानों में तेजी से पर्याप्त नहीं होने के बावजूद मुझे यह त्रुटि मोंगोज के बिना मिलती है। सुनिश्चित नहीं है कि इसका क्या कारण है, लेकिन मानगो प्रश्नों के ठीक बाद ब्रेकपॉइंट सेट करना इससे बचा जाता है।
दान डस्केल्सस्कु

@DanDascalescu मैं यह उल्लेख करना भूल गया कि मेरी समस्या हल हो गई थी, यह लॉगिंग के साथ एक समस्या थी, ऐसा लगता है कि लॉग में कुछ चेतावनी थी कि कुछ समय बाद एक गीगाबाइट के भंडारण के बारे में लिया और मोंगो प्रक्रिया को बंद कर दिया, इसलिए मैंने ज़िपिंग और बैकअप लेने की कोशिश की और समस्या हल हो गई
मोहम्मद गंजी

83

मुझे पता है कि जेसन का उत्तर स्वीकार कर लिया गया था, लेकिन मुझे मोंगोसे के साथ भी यही समस्या थी और मैंने पाया कि मेरे डेटाबेस की मेजबानी करने वाली सेवा ने उत्पादन में मोंगोडब के कनेक्शन को जीवित रखने के लिए निम्नलिखित सेटिंग्स लागू करने की सिफारिश की है :

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

मुझे उम्मीद है कि इस उत्तर से अन्य लोगों को "टोपोलॉजी नष्ट हो गई" त्रुटियों में मदद मिल सकती है।


4
यह मेरे लिए समस्या को ठीक नहीं किया। मैंने वास्तव में अपने रख-रखाव को 30000 तक बढ़ा दिया है, जिससे काफी मदद मिली है। हालांकि मुझे अभी भी सामयिक सामयिक त्रुटि अभी भी आती है।
ifightcrime

9
संस्करण 3.4.2 से मोंगो ड्राइवर का उपयोग करते हुए, इन विकल्पों को शीर्ष स्तर पर होने की आवश्यकता है: विकल्प: {KeepAlive: 1, connectTimeoutMS: 30000, reconnectTries: 30, reconnectInterval: 5000}
सेबेस्टियन एच।

क्लाइंट कोड डिबगिंग करते समय और बयानों पर तेजी से पर्याप्त नहीं होने के कारण, मुझे यह त्रुटि मोंगोज़ के बिना मिलती है। सुनिश्चित नहीं है कि इसका क्या कारण है, लेकिन मानगो प्रश्नों के ठीक बाद ब्रेकपॉइंट सेट करना इससे बचा जाता है।
दान डस्केल्सस्कु

76

यह त्रुटि किसी भी कारण से ड्राइवर को कनेक्शन छोड़ने के कारण होती है (सर्वर उदाहरण के लिए नीचे था)।

डिफ़ॉल्ट रूप से 30 सेकंड के लिए फिर से कनेक्ट करने की कोशिश करेंगे और फिर से शुरू होने तक त्रुटियों को हमेशा के लिए हटा दें।

आप कनेक्शन विकल्पों में इन 2 क्षेत्रों को संपादित करके इसे बदल सकते हैं

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

कनेक्शन विकल्प प्रलेखन


3
हां। तकनीकी रूप से स्वीकृत जवाब से सवाल पूछा जाता है लेकिन यह चर्चा के तहत परिदृश्य से बचने का सही तरीका है।
किंडैंगो

3
संस्करण 3.4.2 से मैंगो ड्राइवर का उपयोग करते हुए, इन विकल्पों को शीर्ष स्तर पर होने की आवश्यकता है: विकल्प: {KeepAlive: 1, connectTimeoutMS: 30000, reconnectTries: 30, reconnectInterval: 2000}
सेबस्टियन एच।

1
स्पष्ट करने के लिए, नोड MongoDB चालक के प्रलेखन के अनुसार , डिफ़ॉल्ट रूप से सर्वर 30 बार पुन: कनेक्ट करने का प्रयास करेगा, प्रत्येक रिट्री के बीच एक सेकंड के अलावा।
बोअज

4
अब आपको सर्वर ऑब्जेक्ट के तहत ये विकल्प प्रदान करने की आवश्यकता नहीं है। यह सीधे विकल्प वस्तुओं पर जाता है।
अनिमेष सिंह

3
बस ऐसे ही हाल के संस्करणों को जोड़ने के लिए की नेवला शीर्ष स्तर में उन लोगों के विकल्प हैं, इसलिए जोड़ने की आवश्यकता नहीं चाहते थे server: {आदि
एलेक्स कश्मीर

17

मेरे मामले में, यह त्रुटि db.close();'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
});

2
कार्लोस के मामले में मुझे लगता है कि करीबी हर चीज से पहले हुआ था। मेरा मामला समान था: मैंने इसे बंद करने के बाद डीबी तक पहुंच बनाई। यह अच्छा होगा यदि मानगो डेवलपर्स अधिक स्पष्ट त्रुटि संदेश उत्पन्न कर सकें। "टोपोलॉजी टूटा हुआ" एक आंतरिक नोट की तरह लगता है।
जुआन लैनस

3
आपका समाधान db.closeएक thenब्लॉक में स्थानांतरित करना था , है ना?
एलेक्सचैफी

यह सही है, मेरे मामले में मैं केवल db.close () लाइन को हटाता हूं, लेकिन इसे तब ब्लॉक में ले जाना एक अच्छा समाधान लगता है।
कार्लोस रॉड्रिग्ज

1
आगे बढ़ते db.closeएक करने के लिए thenब्लॉक देशी MongoDB Node.js ड्राइवर के साथ मेरे लिए महान काम किया।
केविनमीक

12

गफ़र के जवाब के लिए बस एक मामूली जोड़ के रूप में, इसने मुझे पदावनति की चेतावनी दी। सर्वर ऑब्जेक्ट के बजाय, इस तरह:

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

यह शीर्ष स्तर की वस्तु पर जा सकता है। मूल रूप से, बस इसे सर्वर ऑब्जेक्ट से बाहर निकालें और इसे इस तरह विकल्प ऑब्जेक्ट में डालें:

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

7

इस टिप्पणी के अनुसार, मोंगो दस्तावेज सूचकांक बनाए जाने से पहले "टोपोलॉजी नष्ट हो गया" हो सकता है

यह सुनिश्चित करने के लिए कि सभी मॉडलों में डिस्कनेक्ट करने से पहले उनके सूचकांक बनाए गए हैं, आप यह कर सकते हैं:

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

await mongoose.disconnect();

धन्यवाद, अगर आप परीक्षण के मामले चला रहे हैं - यह शायद एक बहुत ही संभावित उत्तर है ...
निक एच 247

1
यह मेरे लिए था। धन्यवाद! मैं मेस्टोडब-मेमोरी-सर्वर के साथ जेस्ट में परीक्षण चला रहा था, टोपोलॉजी या खुले हैंडल / अधूरे वादों पर छिटपुट त्रुटियां प्राप्त कर रहा था। लेकिन कभी-कभी यह काम करता था। अनुक्रमित पर एक प्रतीक्षा जोड़कर इसे ठीक कर दिया।
12

मोंगोज़ के बिना मुझे यह त्रुटि मिलती है, जबकि @roblingle की तरह जेस्ट कोड को डीबग करना और बयानों पर तेजी से पर्याप्त नहीं होना। सुनिश्चित नहीं है कि इसका क्या कारण है, लेकिन मानगो प्रश्नों के ठीक बाद ब्रेकपॉइंट सेट करना इससे बचा जाता है।
डैन डस्केल्सस्कु

@roblingle आपने इसे कैसे ठीक किया? मैं बस इस समस्या में भाग गया और मेरे लिए फिर से MongoDB से जुड़ना असंभव हो गया। मैंने तब से सब कुछ डिलीट कर दिया है और MongoDB (होमब्रे के माध्यम से) को फिर से इंस्टॉल किया है और अब यह स्टार्टअप पर नहीं चलेगा। (एक असंबंधित मुद्दा हो सकता है)
बॉबीज़

असंबंधित लगता है। मेरे ऐप ने ठीक काम किया लेकिन परीक्षण विफल रहे।
लूट

3

एड्रियन के जवाब पर सेबेस्टियन की टिप्पणी पर अधिक ध्यान देने की जरूरत है, इससे मुझे मदद मिली, लेकिन यह टिप्पणी कुछ समय के लिए अनदेखी हो सकती है इसलिए यहां समाधान है :

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

2

मेरे पास एक ही त्रुटि थी। अंत में, मैंने पाया कि मुझे अपने कोड में कुछ त्रुटि है। मैं दो नोडज सर्वर के लिए लोड बैलेंस का उपयोग करता हूं, लेकिन मैं सिर्फ एक सर्वर के कोड को अपडेट करता हूं।

मैं अपने mongod सर्वर को बदलता हूं from standalone to replication , लेकिन मैं कनेक्शन स्ट्रिंग के लिए संबंधित अपडेट करना भूल जाता हूं, इसलिए मुझे यह त्रुटि मिली।

स्टैंडअलोन कनेक्शन स्ट्रिंग: mongodb://server-1:27017/mydb प्रतिकृति कनेक्शन स्ट्रिंग: mongodb://server-1:27017,server-2:27017,server-3:27017/mydb?replicaSet=myReplSet

यहाँ विवरण :[कनेक्शन स्ट्रिंग के लिए mongo डॉक्टर]


2

मैं इसे कुबेरनेट्स / मिनीक्यूब + नोडज्स + मोंगोज़ पर्यावरण में मिला था। समस्या यह थी कि DNS सेवा एक प्रकार की विलंबता के साथ थी। DNS की जाँच करने से मेरी समस्या हल हो गई है।

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

(db_options में संख्याएं स्टैटोओवरफ़्लो पर मनमाने ढंग से पाई जाती हैं और साइटों जैसी होती हैं)


2

यहाँ मैंने क्या किया, यह ठीक काम करता है। नीचे दिए गए विकल्पों को जोड़ने के बाद मुद्दा चला गया था।

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

});

2

टोपोलॉजी त्रुटि को हल करने के लिए आपको मोंगो को फिर से शुरू करने की आवश्यकता है, फिर इस समस्या को दूर करने के लिए मोंगो या मुंगोक्लिंट के कुछ विकल्पों को बदलें:

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

mongoose.connect(mongoDevString,mongoOptions);

एसओ में आपका स्वागत है! कृपया अपने उत्तर को संपादित करें और कुछ और जानकारी जोड़ें, अर्थात यह समस्या को कैसे हल करती है, अधिक मार्गदर्शन के लिए देखें stackoverflow.com/help/how-to-ask
B - rian

1

मुझे यह त्रुटि मिली, जबकि मैं अपने MongoDb कम्पास समुदाय पर एक नया डेटाबेस बना रहा था। मुद्दा मेरे मोंगोड के साथ था, यह नहीं चल रहा था। तो एक तय के रूप में, मुझे पूर्ववर्ती के रूप में मोंगॉड कमांड को चलाना था।

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

मैं उस कमांड को चलाने के बाद एक डेटाबेस बनाने में सक्षम था।

आशा करता हूँ की ये काम करेगा।


1

मैं कुछ समय से इससे जूझ रहा था - जैसा कि आप अन्य उत्तरों से देख सकते हैं, मुद्दा बहुत अलग हो सकता है।

यह पता लगाने का सबसे आसान तरीका है loggerLevel: 'info'कि विकल्प में चालू करना है


0

मेरे मामले में, यह त्रुटि पहले से चल रही पृष्ठभूमि के समान सर्वर उदाहरण के कारण हुई थी।

अजीब बात यह है कि जब मैंने अपना सर्वर बिना किसी नोटिस के शुरू किया, तो पहले से ही चल रहा है, कंसोल में कुछ भी नहीं दिखा जैसे 'कुछ पोर्ट एक्सएक्सएक्स का उपयोग कर रहा है।' मैं सर्वर पर कुछ अपलोड भी कर सकता था। इसलिए, मुझे इस समस्या का पता लगाने में काफी लंबा समय लगा।

क्या अधिक है, उन सभी अनुप्रयोगों को बंद करने के बाद जिनकी मैं कल्पना कर सकता हूं, मुझे अभी भी वह प्रक्रिया नहीं मिल पाई है जो मेरे मैक की गतिविधि मॉनिटर में इस पोर्ट का उपयोग कर रही है। मुझे इस्तेमाल करना हैlsof ट्रेस करने के करना होगा। अपराधी आश्चर्यचकित नहीं था - यह एक नोड प्रक्रिया है। हालाँकि, टर्मिनल में दिखाए गए PID के साथ, मैंने पाया कि मॉनिटर में पोर्ट नंबर मेरे सर्वर द्वारा उपयोग किए गए से अलग है।

सभी सभी, सभी नोड प्रक्रियाओं को मारते हैं, इस समस्या को सीधे हल कर सकते हैं।


-3

मैंने इस समस्या को हल किया:

  1. यह सुनिश्चित करने के लिए मानगो चल रहा है
  2. मेरे सर्वर को पुनरारंभ करना

4
यह समस्या को फिर से होने से नहीं रोकता है
सैम मुनरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.