মঙ্গোআরার: টপোলজি নষ্ট হয়েছিল


163

আমার কাছে রিস্টিফাই এবং মঙ্গুজের সাথে নোড.জেজে এবং প্রায় 30.000 নিয়মিত আকারের নথি সহ সংগ্রহ সহ একটি মঙ্গোডিবিতে নির্মিত একটি রেস্ট সার্ভিস রয়েছে। আমার নোড পরিষেবাটি pmx এবং pm2 এর মধ্যে দিয়ে চলছে।

গতকাল, হঠাৎ, নোড "মঙ্গোইরির: টপোলজিটি ধ্বংস হয়ে গেছে" বার্তাটি দিয়ে ত্রুটিগুলি ছাঁটাই শুরু করে, এর চেয়ে বেশি কিছুই নয়। এর অর্থ কী এবং সম্ভবত এটির কারণ হতে পারে তা আমার কোনও ধারণা নেই। গুগল-অনুসন্ধান করার সময় এটি খুঁজে পাওয়ার মতো খুব বেশি কিছু নেই। তাই আমি ভেবেছিলাম আমি এখানে জিজ্ঞাসা করব।

আজ নোড পরিষেবাটি পুনরায় চালু করার পরে, ত্রুটিগুলি আসা বন্ধ হয়ে গেছে production আমার এইগুলির মধ্যে একটি প্রযোজনা রয়েছে এবং এটি আমাকে ভীতি প্রদর্শন করে যে সেখানে কোনওভাবেই চলমান সেটআপের একটি অত্যন্ত গুরুত্বপূর্ণ অংশে এটি ঘটতে পারে ...

আমি উল্লিখিত প্যাকেজগুলির নিম্নলিখিত সংস্করণগুলি ব্যবহার করছি:

  • মঙ্গুজ: 4.0.3
  • পুনরায় আকার দিন: 3.0.3
  • নোড: 0.10.25

2
আমি কেবল মঙ্গোদব ড্রাইভার ব্যবহার করে একই ধরণের সমস্যায় পড়ছি :(
0x8890

1
আমি পাল ব্যবহার করছি না, তাই না, আমি মনে করি না এটি আমার সমস্যার সমাধান করবে
dreagan

উত্তর:


98

মনে হচ্ছে এটি আপনার মংডোডিবি ইনস্ট্যান্সের সাথে নোড সার্ভারের সংযোগটি এতে লেখার চেষ্টা করার সময় বাধাগ্রস্ত হয়েছিল।

কটাক্ষপাত মোঙ্গো সোর্স কোড যে ত্রুটি উত্পন্ন

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
আমার একই সমস্যা রয়েছে এবং এটি প্রায় প্রতি সপ্তাহে ঘটে এবং মঙ্গো নিয়ে কাজ করা অ্যাপ্লিকেশনটি বন্ধ করে দেয়, এটি কি আমি উত্পন্ন কিছু সমস্যা বা এটি মঙ্গুজের সমস্যা?
মোহাম্মদ গাঞ্জি

@ মোহাম্মাদগঞ্জি: ক্লায়েন্ট কোডটি ডিবাগ করার সময় এবং বিবৃতিতে পদক্ষেপ নেওয়ার পক্ষে পর্যাপ্ত দ্রুত না হয়ে আমি মঙ্গুজ ছাড়াই এই ত্রুটিটি পেয়েছি। এটি কী কারণে ঘটছে তা নিশ্চিত নয়, তবে মঙ্গো ক্যোয়ারীগুলি ঠিক পরে ব্রেকপয়েন্টগুলি সেট করে তা এড়ানো যায়।
ড্যান ড্যাসকলেসকু

@ ড্যানডাসকলেসকু আমি উল্লেখ করতে ভুলে গেছি যে আমার সমস্যাটি সমাধান হয়ে গেছে, লগিংয়ের ক্ষেত্রে এটি একটি সমস্যা ছিল, দেখে মনে হচ্ছে লগগুলিতে কিছু সতর্কতা ছিল যা কিছু সময় পরে গিগাবাইট স্টোরেজ নিয়েছিল এবং মঙ্গো প্রক্রিয়াটি বন্ধ করে দিয়েছিল, তাই আমি জিপ করে ব্যাক আপ করার চেষ্টা করেছি এবং সমস্যার সমাধান
মোহাম্মদ গাঞ্জি

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 থেকে মঙ্গো ড্রাইভার ব্যবহার করে, এই বিকল্পগুলি শীর্ষ স্তরের হওয়া দরকার: বিকল্পগুলি: {কিপলাইভ: 1, কানেক্টটাইমআউটএসএম: 30000, পুনরায় সংযুক্তি চেষ্টা করুন: 30, পুনরায় সংযুক্ত করুন আন্তঃকাল: 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 থেকে মঙ্গো ড্রাইভার ব্যবহার করে, এই বিকল্পগুলি শীর্ষ স্তরের হওয়া দরকার: বিকল্পগুলি: {কিপলাইভ: 1, কানেক্টটাইমআউটএসএম: 30000, পুনরায় সংযুক্তি চেষ্টা করুন: 30, পুনরায় সংযুক্ত করুন ইন্টারভেল: 2000}
সেবাস্তিয়ান এইচ।

1
স্পষ্ট করার জন্য, নোড মঙ্গোডিবি ড্রাইভারের ডকুমেন্টেশন অনুযায়ী , ডিফল্টরূপে সার্ভার প্রতিটি পুনরায় চেষ্টা করার মধ্যে এক সেকেন্ডের পাশাপাশি 30 বার পুনরায় সংযোগ করার চেষ্টা করবে।
বোজ

4
আপনার এখন সার্ভার অবজেক্টের অধীনে এই বিকল্পগুলি সরবরাহ করার দরকার নেই। এটি সরাসরি বিকল্পগুলির মধ্যে যায়।
অনিমেষ সিং

3
কেবল যোগ করতে চেয়েছিলেন যে মঙ্গুজের সাম্প্রতিক সংস্করণগুলিতে শীর্ষ স্তরের সেই বিকল্পগুলি রয়েছে, তাই server: {ইত্যাদি যুক্ত করার দরকার নেই
অ্যালেক্স কে

17

আমার ক্ষেত্রে, এই ত্রুটিটি db.close();'অ্যাসিঙ্ক' এর অভ্যন্তরে 'অপেক্ষার' বিভাগের বাইরে থাকার কারণে হয়েছিল

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ব্লকে সরানো আমার পক্ষে দেশীয় মঙ্গোডিবি নোড.জেএস ড্রাইভারের সাথে দুর্দান্ত কাজ করেছে।
কেভিনমিক 16

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
এটা আমার জন্য ছিল। ধন্যবাদ! টপোলজি বা খোলা হ্যান্ডলগুলি / অসম্পূর্ণ প্রতিশ্রুতিগুলিতে বিক্ষিপ্ত ত্রুটি পেয়ে আমি মঙ্গডব-মেমরি-সার্ভার দিয়ে জেস্টে পরীক্ষা চালাচ্ছিলাম। তবে কখনও কখনও এটি কাজ করে। সূচীতে অপেক্ষা যোগ করা এটি স্থির করে।
রোবিলিং

@Roblingle এর মতো জেস্ট কোডটি ডিবাগ করার সময় এবং বিবৃতিতে পদক্ষেপ নেওয়ার পক্ষে পর্যাপ্ত দ্রুত না হয়ে আমি মঙ্গুজ ছাড়াই এই ত্রুটিটি পেয়েছি। এটি কী কারণে ঘটছে তা নিশ্চিত নয়, তবে মঙ্গো ক্যোয়ারীগুলি ঠিক পরে ব্রেকপয়েন্টগুলি সেট করে তা এড়ানো যায়।
ড্যান ড্যাসকলেসকু

@ আরব্লিং আপনি কীভাবে এটি স্থির করলেন? আমি কেবল এই সমস্যায় পড়েছিলাম এবং আমার পক্ষে আবার মঙ্গোডিবিতে সংযোগ স্থাপন করা অসম্ভব হয়ে পড়েছে। আমি তখন থেকে সমস্ত কিছু মুছে ফেলেছি এবং মংগোডিবি (হোস্টাব্রুয়ের মাধ্যমে) পুনরায় ইনস্টল করেছি এবং এখন এটি আর আরম্ভ করে চলবে না। (কোনও অপ্রাসঙ্গিক সমস্যা হতে পারে)
ববিজ

সম্পর্কহীন মনে হচ্ছে। আমার অ্যাপ্লিকেশনটি ভাল কাজ করেছে তবে পরীক্ষাগুলি ব্যর্থ হয়।

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

অন্যথায় একই ত্রুটি ছিল। অবশেষে, আমি খুঁজে পেয়েছি যে আমার কোডটিতে আমার কিছু ত্রুটি রয়েছে। আমি দুটি নোডেজ সার্ভারের জন্য লোড ব্যালেন্স ব্যবহার করি তবে আমি কেবল একটি সার্ভারের কোড আপডেট করি।

আমি আমার মংডোড সার্ভারটি পরিবর্তন করেছি from standalone to replication, তবে আমি সংযোগের স্ট্রিংয়ের জন্য সংশ্লিষ্ট আপডেটটি করতে ভুলে গেছি, সুতরাং আমি এই ত্রুটিটি পেয়েছি।

স্বতন্ত্র সংযোগ স্ট্রিং: mongodb://server-1:27017/mydb প্রতিলিপি সংযোগ স্ট্রিং: mongodb://server-1:27017,server-2:27017,server-3:27017/mydb?replicaSet=myReplSet

বিশদ এখানে :[সংযোগের স্ট্রিংয়ের জন্য মঙ্গো ডক]


2

আমি এটি কুবেরনেটস / মিনিক्यूब + নোডেজ + মঙ্গুজ পরিবেশে পেয়েছি। সমস্যাটি হ'ল ডিএনএস পরিষেবাটি এক ধরণের বিলম্বের সাথে ছিল। ডিএনএস চেক করা আমার সমস্যার সমাধান প্রস্তুত।

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

(ডিবি_পশনগুলিতে সংখ্যাগুলি স্ট্যাকওভারফ্লোতে এবং অনুরূপ সাইটের মতো স্বেচ্ছাসেবী পাওয়া যায়)


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

তাই আপনাকে স্বাগতম! দয়া করে আপনার উত্তরটি সম্পাদনা করুন এবং আরও কিছু তথ্য যুক্ত করুন, যেমন এটি সমস্যাটি কীভাবে সমাধান করে, আরও নির্দেশিকার জন্য দেখুন স্ট্যাকওভারফ্লো.com
বি - রিয়ান

1

আমি আমার মঙ্গোডিবি কম্পাস সম্প্রদায়টিতে একটি নতুন ডাটাবেস তৈরি করার সময় এই ত্রুটিটি পেয়েছি। বিষয়টি আমার মংগোদকে নিয়ে ছিল, এটি চলছিল না। ঠিকঠাক হিসাবে আমাকে পূর্ববর্তী হিসাবে মংড কমান্ডটি চালাতে হয়েছিল।

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

কমান্ডটি চালানোর পরে আমি একটি ডাটাবেস তৈরি করতে সক্ষম হয়েছি।

আশা করি এটা সাহায্য করবে.


1

আমি কিছু সময়ের জন্য এটির সাথে লড়াই করে যাচ্ছিলাম - আপনি অন্যান্য উত্তর থেকে দেখতে পাচ্ছেন, বিষয়টি খুব আলাদা হতে পারে।

এর কারণ কী তা খুঁজে বের করার সহজ উপায় হ'ল loggerLevel: 'info'বিকল্পগুলি চালু করা


0

আমার ক্ষেত্রে, এই ত্রুটিটি ইতিমধ্যে চলমান ব্যাকগ্রাউন্ডে কোনও অভিন্ন সার্ভার উদাহরণের কারণে ঘটেছে।

অদ্ভুত বিষয়টি যখন আমি বিজ্ঞপ্তি ছাড়াই আমার সার্ভারটি শুরু করেছি সেখানে ইতিমধ্যে একটি চলছে, কনসোলটি 'কিছু পোর্ট এক্সএক্সএক্সএক্স ব্যবহার করছে' এর মতো কিছুই দেখায় নি। এমনকি আমি সার্ভারে কিছু আপলোড করতে পারি। সুতরাং, এই সমস্যাটি সনাক্ত করতে আমার বেশ সময় লেগেছে।

আরও কী, আমি কল্পনা করতে পারি এমন সমস্ত অ্যাপ্লিকেশন বন্ধ করার পরেও আমি আমার ম্যাকের ক্রিয়াকলাপ মনিটরে এই পোর্টটি ব্যবহার করছে এমন প্রক্রিয়াটি এখনও খুঁজে পেলাম না। আমি lsofট্রেস ব্যবহার করতে হবে। অপরাধী অবাক হওয়ার মতো ছিল না - এটি একটি নোড প্রক্রিয়া। তবে, টার্মিনালে দেখানো পিআইডি সহ, আমি দেখতে পেলাম যে মনিটরে থাকা পোর্ট নম্বরটি আমার সার্ভার দ্বারা ব্যবহৃত একের থেকে আলাদা।

সব মিলিয়ে সমস্ত নোড প্রক্রিয়া হত্যা করুন সরাসরি এই সমস্যাটি সমাধান করতে পারে।


-3

আমি এই সমস্যাটি এর দ্বারা সমাধান করেছি:

  1. মঙ্গো চলছে তা নিশ্চিত করে চলছে
  2. আমার সার্ভার পুনরায় চালু করা হচ্ছে

4
এটি আবার সমস্যা হতে বাধা দেয় না
স্যাম মুনরো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.