2013-06-17 7 views
19

प्रश्नों को रोकने प्रतिकृति सेट सेट करने के लिए, मैं 3 अलग टर्मिनल टैब में सामना किया है: तो फिरMongoDB प्रतिकृति सेट करने के लिए माध्यमिक

$ sudo mongod --replSet rs0 --dbpath /data/mining --port 27017 
$ sudo mongod --replSet rs0 --dbpath /data/mining2 --port 27018 
$ sudo mongod --replSet rs0 --dbpath /data/mining3 --port 27019 

, मैं मोंगो खोल में प्रतिकृति विन्यस्त और सत्यापित है कि यह काम किया:

> var rsconf = { 
    _id: "rs0", 
    members: [ 
     { 
     _id: 0, 
     host: 'localhost:27017' 
     }, 
     { 
     _id: 1, 
     host: 'localhost:27018' 
     }, 
     { 
     _id: 2, 
     host: 'localhost:27019' 
     } 
    ] 
    }; 
> rs.initiate(rsconf); 
{ 
    "info": "Config now saved locally. Should come online in about a minute.", 
    "ok": 1 
} 
// Some time later... 
> rs.status() 
{ 
    "set": "rs0", 
    "date": ISODate("2013-06-17T13:23:45-0400"), 
    "myState": 2, 
    "syncingTo": "localhost:27017", 
    "members": [ 
    { 
     "_id": 0, 
     "name": "localhost:27017", 
     "health": 1, 
     "state": 1, 
     "stateStr": "PRIMARY", 
     "uptime": 4582, 
     "optime": { 
     "t": 1371489546, 
     "i": 1 
     }, 
     "optimeDate": ISODate("2013-06-17T13:19:06-0400"), 
     "lastHeartbeat": ISODate("2013-06-17T13:23:44-0400"), 
     "lastHeartbeatRecv": ISODate("2013-06-17T13:23:44-0400"), 
     "pingMs": 0 
    }, 
    { 
     "_id": 1, 
     "name": "localhost:27018", 
     "health": 1, 
     "state": 2, 
     "stateStr": "SECONDARY", 
     "uptime": 5034, 
     "optime": { 
     "t": 1371489546, 
     "i": 1 
     }, 
     "optimeDate": ISODate("2013-06-17T13:19:06-0400"), 
     "self": true 
    }, 
    { 
     "_id": 2, 
     "name": "localhost:27019", 
     "health": 1, 
     "state": 2, 
     "stateStr": "SECONDARY", 
     "uptime": 4582, 
     "optime": { 
     "t": 1371489546, 
     "i": 1 
     }, 
     "optimeDate": ISODate("2013-06-17T13:19:06-0400"), 
     "lastHeartbeat": ISODate("2013-06-17T13:23:44-0400"), 
     "lastHeartbeatRecv": ISODate("2013-06-17T13:23:45-0400"), 
     "pingMs": 0, 
     "syncingTo": "localhost:27017" 
    } 
    ], 
    "ok": 1 
} 

मेरे स्क्रिप्ट प्राथमिक के खिलाफ ठीक चलाता है:

$ ./runScripts.sh -h localhost -p 27017 
MongoDB shell version: 2.4.3 
connecting to: localhost:27017/test 
Successful completion 

हालांकि, eith के खिलाफ एर माध्यमिक:

$ ./runScripts.sh -h localhost -p 27018 
MongoDB shell version: 2.4.3 
connecting to: localhost:27017/test 
Mon Jun 17 13:30:22.989 JavaScript execution failed: count failed: 
{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" } 
at src/mongo/shell/query.js:L180 
failed to load: /.../.../myAggregateScript.js 

मैं कई स्थानों में पढ़ा है rs.slaveOk() या db.getMongo().setSlaveOk(), उपयोग करने के लिए है, लेकिन इनमें से कोई भी खोल से डाल देते हैं या मेरी स्क्रिप्ट में कहा जाता है कि किसी भी प्रभाव नहीं पड़ा। इन बयानों ने बुलाए जाने पर त्रुटियों को फेंक नहीं दिया, लेकिन उन्होंने समस्या को ठीक नहीं किया।

क्या किसी को पता है कि मैं माध्यमिक की पूछताछ की अनुमति देने के लिए अपनी प्रतिलिपि को कॉन्फ़िगर क्यों नहीं कर सकता?

+1

rs.slaveOk() आपको पढ़ने की अनुमति देनी चाहिए। मैंने अभी मोंगो खोल और 2.4.3 का उपयोग करके परीक्षण किया है और एक गिनती() ने मेरे लिए काम किया है। क्या आप अपनी स्क्रिप्ट साझा कर सकते हैं? –

+0

@ जेम्सस्हलिन सही है - यह एकमात्र तरीका हो रहा है यदि आपने इस आउटपुट को दिए गए आदेश को चलाने से पहले rs.slaveOk() सेट नहीं किया है। आपकी जेएस स्क्रिप्ट सामग्री के बारे में अधिक जानकारी मदद कर सकती है। –

+2

[mongodb, replicates और त्रुटि: {"$ err": "मास्टर और दास ओके = झूठा नहीं", "कोड": 13435}] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/8990158/mongodb-replicates- और-त्रुटि-गलती-मास्टर-और-दासोक-झूठी-कोड) – Pykler

उत्तर

47

rs.slaveOk() मोंगो खोल में चलने से आपको सेकेंडरी से पढ़ने की अनुमति मिल जाएगी।

$ mongo --port 27017 
MongoDB shell version: 2.4.3 
connecting to: 127.0.0.1:27017/test 
replset:PRIMARY> db.foo.save({}) 
replset:PRIMARY> db.foo.find() 
{ "_id" : ObjectId("51bf5dbd473d5e80fc095b17") } 
replset:PRIMARY> exit 

$ mongo --port 27018 
MongoDB shell version: 2.4.3 
connecting to: 127.0.0.1:27018/test 
replset:SECONDARY> db.foo.find() 
error: { "$err" : "not master and slaveOk=false", "code" : 13435 } 
replset:SECONDARY> rs.slaveOk() 
replset:SECONDARY> db.foo.find() 
{ "_id" : ObjectId("51bf5dbd473d5e80fc095b17") } 
replset:SECONDARY> db.foo.count() 
1 
+0

इसके लिए बहुत बहुत धन्यवाद। –

+1

ऐसे कारण हैं जिनसे 'गुलाम ओके' मौजूद है, यह बताए जाने के लायक होगा कि ये कारण क्या हैं। उदाहरण के लिए: 'महत्वपूर्ण पढ़ने की प्राथमिकताओं को निर्दिष्ट करते समय व्यायाम देखभाल: प्राथमिक के अलावा मोड अन्य डेटा को वापस कर सकते हैं क्योंकि एसिंक्रोनस प्रतिकृति के साथ, माध्यमिक में डेटा सबसे हालिया लेखन कार्यों को प्रतिबिंबित नहीं कर सकता है। – Madbreaks

+0

दुहह मैं 27017 पर जुड़ा था जो मेरा था प्राथमिक .... एक रिबूट के बाद मुझे बेवकूफ चीज का पुनर्निर्माण करना पड़ा, और मेरा नया मास्टर 27018 था। ऊपर दी गई पोस्ट में मदद मिली। – Andy

13

आप द्वितीयक सर्वर के खोल में आदेश rs.slaveOk() चलाने के लिए है: यहाँ एक प्रदर्शन MongoDB 2.4.3 के तहत मोंगो खोल का उपयोग कर रहा है।

संबंधित मुद्दे