মংডোব, প্রতিলিপি এবং ত্রুটি: {"$ ভুল": "মাস্টার এবং স্লেভওক নয় = মিথ্যা", "কোড": 13435}


174

আমি প্রথমবার মঙ্গো রেপ্লিকা সেট চেষ্টা করেছিলাম।

আমি ইক 2 তে উবুন্টু ব্যবহার করছি এবং আমি তিনটি উদাহরণ বুট আপ করেছি। আমি প্রতিটি দৃষ্টান্তের ব্যক্তিগত আইপি ঠিকানা ব্যবহার করেছি। আমি প্রাথমিক হিসাবে বাছাই করেছি এবং নীচে কোডটি।

mongo --host Private IP Address
rs.initiate()
rs.add(“Private IP Address”)
rs.addArb(“Private IP Address”)

এই মুহুর্তে সব ঠিক আছে। আমি যখন http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com entitled8017/_replSet সাইটে যাই তখন আমি দেখতে পাই যে আমার একটি প্রাথমিক, দ্বিতীয় এবং আরবিটার রয়েছে।

ঠিক আছে, এখন একটি পরীক্ষার জন্য।

প্রাথমিকটিতে একটি ডাটাবেস তৈরি করতে কোডটি হল:

use tt
db.tt.save( { a : 123 } )

মাধ্যমিকের উপর, আমি তখন এটি করি এবং নীচের ত্রুটিটি পেয়েছি:

db.tt.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }

আমি মঙ্গোডব এবং প্রতিলিপিগুলিতে খুব নতুন কিন্তু আমি ভেবেছিলাম যে আমি যদি কিছু করি তবে তা অন্যটিতে যায়। সুতরাং, আমি যদি একটিতে একটি রেকর্ড যোগ করি, মেশিন জুড়ে প্রতিলিপি করতে আমার কী করতে হবে?


বুঝলাম যে আমাকে আরএস.স্লাভক () ব্যবহার করতে হবে; এটি আমাকে অন্য একটি প্রশ্নে ফেলেছে। প্রতি প্রশ্নের জন্য আমাকে এটি করতে হবে? আমি যদি মাস্টার নোডে থাকি?

উত্তর:


282

মঙ্গো শেলটি জানতে দিতে যে আপনি একটি মাধ্যমিক থেকে পড়তে দিচ্ছেন আপনাকে "স্লেভ ওকে" মোড সেট করতে হবে। এটি আপনাকে এবং আপনার অ্যাপ্লিকেশনগুলি দুর্ঘটনাক্রমে নিয়মিত পাঠ্যক্রম সম্পাদন করা থেকে রক্ষা করা। আপনি এটি দিয়ে শেলটিতে এটি করতে পারেন:

rs.slaveOk()

এরপরে আপনি দ্বিতীয়ত থেকে সাধারণত জিজ্ঞাসা করতে পারেন।

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

সম্পাদনা করুন: সেকেন্ডারি থেকে জিজ্ঞাসা করার সময় আপনার কেবলমাত্র স্লেভোক সেট করতে হবে এবং প্রতি সেশনে কেবল একবার।


3
আপনি আপনার ডিবিতে বুঝতে না পেরে কমান্ড কার্যকর করতে যাওয়ার আগে সর্বদা ম্যানুয়ালটি পরীক্ষা করে দেখুন। কমান্ডের এমন পরিণতিও হতে পারে যা উত্তরটি ব্যাখ্যা করে না। এই আদেশটি প্রতিলিপি সেটটিতে সমস্ত সংযোগের জন্য পঠিত অপারেশন রাশনগুলি বিতরণের পদ্ধতি পরিবর্তন করে? আরও ভাল। এই কমান্ডটি v2.2 ডকস হিসাবে অনেক পিছনে প্রদর্শিত হবে m.মংডব.কম / ভি ২.২ / রেফারেন্স / মেমোথড / এস.স্লাভওক আপনি সর্বদা ডকস.মংগডব.কম URL এর "/ ম্যানুয়াল /" অংশটি প্রতিস্থাপন করতে পারেন (এবং হওয়া উচিত) আপনি প্রাসঙ্গিক তথ্য পাচ্ছেন তা নিশ্চিত করার জন্য আপনার নির্দিষ্ট সংস্করণে।
ব্রুনো ব্রোনোস্কি

45

rs.slaveOk()প্রতিবার টাইপ করা এড়াতে , এটি করুন:

একটি replStart.jsলাইন যুক্ত নামের একটি ফাইল তৈরি করুন :rs.slaveOk()

তারপরে --shell replStart.jsআপনি মোঙ্গো শেলটি চালু করার পরে অন্তর্ভুক্ত করুন । অবশ্যই, আপনি যদি স্থানীয়ভাবে কোনও একক সংযোগে যুক্ত হন তবে এটি কোনও টাইপই সংরক্ষণ করে না।


26
টাইপিংয়ে সংরক্ষণের আরও ভাল উপায় হ'ল rs.slaveOk()আপনার ~/.mongorc.jsফাইলে যুক্ত হওয়া যা মঙ্গো শেলটি শুরু করার পরে স্বয়ংক্রিয়ভাবে কার্যকর করা হবে।
স্টেনি

2
আমি এটা দরকারে ডিফল্ট কনফিগারেশন করা খুঁজতে ~/.mongorc.jsএবং স্বনির্ধারিত মান replStart.jsবা adminStart.jsবা যাই হোক না কেন।
এড নরিস

41

মঙ্গোদবি ২.০ এ

আপনার টাইপ করা উচিত

rs.slaveOk()

গৌণ মংডোড নোডে


11

রুবি চালক ব্যবহার করে এই সমস্যাটির সাথে যে কারও কারও কারও চুক্তি নেই J

রুবি রত্ন ব্যবহার করার সময় আমারও একই সমস্যা ছিল।

রুবিতে স্লেভঅক স্থাপন করতে, আপনি যখন ক্লায়েন্টটি তৈরি করেন তখন আপনি কেবল এটি একটি আর্গুমেন্ট হিসাবে পাস করেন:

mongo_client = MongoClient.new("localhost", 27017, { slave_ok: true })

https://github.com/mongodb/mongo-ruby-driver/wiki/Tutorial#making-a-connection

mongo_client = MongoClient.new # (optional host/port args)

লক্ষ্য করুন যে 'আরগস' তৃতীয় alচ্ছিক যুক্তি।



1

আমি কেবল এই উত্তরটি ডিবি সরবরাহকারীর কাছ থেকে একটি বিশ্রী পরিস্থিতির জন্য যুক্ত করছি।

আমাদের ক্ষেত্রে যা ঘটেছিল তা হ'ল প্রাথমিক এবং মাধ্যমিক ডিবি বিপরীতভাবে স্থানান্তরিত (প্রাথমিক থেকে মাধ্যমিক এবং বিপরীতে) এবং আমরা একই ত্রুটি পাচ্ছি getting

সুতরাং দয়া করে ডাটাবেস স্থিতির জন্য কনফিগারেশন সেটিংস পরীক্ষা করুন যা আপনাকে সহায়তা করতে পারে।


0

আমি এখানে একই ত্রুটিটি অনুসন্ধান করে পেয়েছি তবে নোড.জেএস নেটিভ ড্রাইভার থেকে । আমার জন্য উত্তর করে উত্তর সমন্বয় ছিল campeterson এবং প্রভাত

সমস্যাটি হ'ল readPreferenceডিফল্ট সেট করা primary, যা পরে কোনওভাবে বিভ্রান্তিকর slaveOkত্রুটির দিকে পরিচালিত করে । আমার সমস্যাটি হ'ল আমি কেবল কোনও নোড থেকে আমার রেপ্লিকা সেটটি পড়তে চাই। এমনকি আমি এটির সাথে সংযুক্তও করি না প্রতিলিপি হিসাবে। আমি এটি থেকে পড়তে যে কোনও নোডের সাথে সংযুক্ত হয়েছি।

(বা ধ্রুবক থেকে আরও ভাল ) সেট readPreferenceকরা আমার জন্য এটি সমাধান করে। শুধু একটি বিকল্প যেমন পাস বা বা কোন , বা অন্যান্য ফাংশন।primaryPreferredReadPreference.PRIMARY_PREFERREDMongoClient.connect()client.db()find()aggregate()

const { MongoClient, ReadPreference } = require('mongodb');
const client = await MongoClient.connect(MONGODB_CONNECTIONSTRING, { readPreference: ReadPreference.PRIMARY_PREFERRED });
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.