mongodb, प्रतिकृति और त्रुटि: {"$ गलत": "मास्टर और दास नहीं = गलत", "कोड": 13435}


174

मैंने पहली बार मोंगो प्रतिकृति सेट की कोशिश की।

मैं ec2 पर ubuntu का उपयोग कर रहा हूं और मैंने तीन उदाहरणों को बूट किया है। मैंने प्रत्येक उदाहरण के निजी आईपी पते का उपयोग किया। मैंने प्राथमिक के रूप में चुना और नीचे कोड है।

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:28017/_replSet साइट पर जाता हूं, तो देखता हूं कि मेरे पास एक प्राथमिक, दूसरा और मध्यस्थ है।

ठीक है, अब एक परीक्षण के लिए।

प्राथमिक में एक डेटाबेस बनाएँ इसमें कोड है:

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

द्वितीयक पर, मैं तब ऐसा करता हूं और नीचे त्रुटि प्राप्त करता हूं:

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

मैं मोंगोडब और प्रतिकृति के लिए बहुत नया हूं लेकिन मैंने सोचा कि अगर मैं एक में कुछ करता हूं, तो यह दूसरे पर जाता है। इसलिए, यदि मैं एक में रिकॉर्ड जोड़ देता हूं, तो मुझे मशीनों को दोहराने के लिए क्या करना होगा?


पता लगा कि मुझे rsslaveOk () का उपयोग करना है; वह मुझे एक और सवाल पर छोड़ देता है। मुझे ऐसा हर क्वेरी के लिए करना होगा? अगर मैं मास्टर नोड पर हूं तो क्या होगा?

जवाबों:


282

आपको मूंगो शेल को यह बताने के लिए "गुलाम ठीक है" मोड सेट करना होगा कि आप एक माध्यमिक से रीड की अनुमति दे रहे हैं। यह आपको और आपके अनुप्रयोगों को दुर्घटना से अंततः सुसंगत रीडिंग करने से बचाने के लिए है। आप इसे शेल में कर सकते हैं:

rs.slaveOk()

उसके बाद आप सामान्य रूप से सेकंडरी से क्वेरी कर सकते हैं।

"अंतिम स्थिरता" के बारे में एक नोट: सामान्य परिस्थितियों में, प्रतिकृति सेट सेकंडरी में एक दूसरे या कम के भीतर प्राइमरी के समान सभी डेटा होते हैं। बहुत अधिक लोड के तहत, आपने प्राथमिक को जो डेटा लिखा है, वह सेकंडरी को दोहराने में थोड़ा समय ले सकता है। इसे "रेप्लिका लैग" के रूप में जाना जाता है, और लैगिंग सेकेंडरी से पढ़ने को "अंततः सुसंगत" रीड के रूप में जाना जाता है, क्योंकि, नव लिखित डेटा कुछ बिंदु पर दिखाई देगा (नेटवर्क विफलता को रोकना, आदि), यह नहीं हो सकता है तत्काल उपलब्ध।

संपादित करें: आपको केवल सेकंड से क्वेरी करते समय, और प्रति सत्र केवल एक बार स्लेवोक सेट करना होगा।


3
हमेशा अपने डीबी को समझने में न आने वाली कमांड्स को निष्पादित करने से पहले मैनुअल की जांच करें। आदेश के परिणाम हो सकते हैं कि उत्तर की व्याख्या नहीं करता है। क्या यह कमांड रीपिका सेट के सभी कनेक्शनों के लिए रीड ओपी राशन वितरित करने के तरीके को बदल देता है? बेहतर पता लगाना। यह आदेश v2.2 docs.mongodb.com/v2.2/reference/method/rs.slaveOk के रूप में आपको दिखाई देता है (और चाहिए) हमेशा docs.mongodb.com URL के "/ मैनुअल /" भाग को बदल सकता है अपने विशिष्ट संस्करण के लिए सुनिश्चित करें कि आप प्रासंगिक जानकारी प्राप्त कर रहे हैं।
ब्रूनो ब्रोंस्की

45

rs.slaveOk()हर बार टाइपिंग से बचने के लिए ऐसा करें:

replStart.jsएक पंक्ति नाम की फ़ाइल बनाएँ ,rs.slaveOk()

फिर --shell replStart.jsजब आप मानगो शेल लॉन्च करते हैं तो शामिल करें । बेशक, यदि आप स्थानीय रूप से एक ही उदाहरण से जोड़ रहे हैं, तो यह किसी भी टाइपिंग को नहीं बचाता है।


26
टाइपिंग पर बचत करने का एक बेहतर तरीका यह होगा कि आप rs.slaveOk()अपनी ~/.mongorc.jsफ़ाइल में जोड़ें , जो कि मूंग खोल को शुरू करने पर स्वचालित रूप से निष्पादित हो जाएगी।
स्टेनी

2
मैं इसे उपयोगी में डिफ़ॉल्ट कॉन्फ़िगरेशन डाल करने के लिए लगता है ~/.mongorc.jsमें और कस्टम विन्यास replStart.jsया adminStart.jsया जो कुछ भी।
एड नॉरिस

41

mongodb2.0 में

आपको टाइप करना चाहिए

rs.slaveOk()

द्वितीयक मंगल नोड में


11

इस समस्या से निपटने के लिए किसी के लिए भी ध्यान दें

रूबी रत्न का उपयोग करते समय मुझे यही समस्या थी।

Ruby में slaveOk सेट करने के लिए, आप इसे एक तर्क के रूप में पास करते हैं जब आप इस तरह से क्लाइंट बनाते हैं:

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)

ध्यान दें कि 'आर्ग्स' तीसरा वैकल्पिक तर्क है।



1

मैं सिर्फ डीबी प्रदाता से एक अजीब स्थिति के लिए इस जवाब को जोड़ रहा हूं।

हमारे मामले में जो हुआ है, वह प्राथमिक और द्वितीयक db का उत्क्रमण है (प्राथमिक से द्वितीयक और इसके विपरीत) और हमें एक ही त्रुटि मिल रही है।

इसलिए कृपया डेटाबेस की स्थिति के लिए कॉन्फ़िगरेशन सेटिंग्स में देखें जो आपकी मदद कर सकती है।


0

मैं यहाँ एक ही त्रुटि के लिए खोज रहा था, लेकिन Node.js के मूल चालक से । मेरे लिए जवाब कैंपसटर और प्रभात द्वारा जवाब का संयोजन था

मुद्दा यह है कि readPreferenceसेटिंग को डिफॉल्ट करता है primary, जो तब किसी तरह भ्रामक slaveOkत्रुटि की ओर जाता है । मेरी समस्या यह है कि मैं किसी भी नोड से सेट की गई प्रतिकृति से पढ़ना चाहता हूं। मैं भी इसे replicaset के रूप में कनेक्ट नहीं है। मैं बस इसे पढ़ने के लिए किसी भी नोड से जोड़ता हूं।

स्थापना readPreferenceकरने के लिए primaryPreferred(या बेहतर करने के लिए ReadPreference.PRIMARY_PREFERREDनिरंतर) मेरे लिए इसे हल। बस के लिए एक विकल्प के रूप में इसे पारित MongoClient.connect()या करने के लिए client.db()या किसी के लिए find(), aggregate()या अन्य कार्य करते हैं।

const { MongoClient, ReadPreference } = require('mongodb');
const client = await MongoClient.connect(MONGODB_CONNECTIONSTRING, { readPreference: ReadPreference.PRIMARY_PREFERRED });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.