2013-06-17 7 views
19

Verhindern des Replikatssatz einzurichten, I in 3 separate Anschlußfahnen ausgeführt haben:MongoDB Replikatssatz Abfragen an sekundären

$ 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 

Dann konfiguriert I-Replikation in der Schale Mongo und verifiziert, dass es funktioniert:

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

Mein Skript läuft gut gegen die primäre:

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

jedoch gegen eith er sekundär:

$ ./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 

ich an mehreren Stellen gelesen haben rs.slaveOk() oder db.getMongo().setSlaveOk() zu verwenden, aber keiner von ihnen hatten keine Wirkung, sei es aus der Shell eingegeben oder in meinem Skript aufgerufen. Diese Anweisungen haben beim Aufruf keine Fehler ausgelöst, aber sie haben das Problem auch nicht behoben.

Weiß jemand, warum ich meine replset nicht konfigurieren kann, Abfrage der sekundären zu ermöglichen?

+1

rs.slaveOk() sollte Ihnen erlauben zu lesen. Ich habe gerade mit der Mongo Shell und 2.4.3 getestet und eine count() funktionierte für mich. Kannst du dein Skript teilen? –

+0

@JamesWahlin hat recht - der einzige Weg, wie dies geschieht, ist, wenn Sie rs.slaveOk() nicht vor dem Ausführen des Befehls gesetzt haben, der diese Ausgabe lieferte. Mehr Informationen über Ihren js-Skript-Inhalt können helfen. –

+2

mögliches Duplikat von [Mongodb, Replikate und Fehler: {"$ err": "nicht Master und SlaveOk = false", "Code": 13435}] (http://stackoverflow.com/questions/8990158/mongodb-replicates- und-error-err-not-master-und-slaveok-false-code) – Pykler

Antwort

47

rs.slaveOk() in der Mongo-Shell ausführen können Sie aus Secondaries lesen. Hier ist eine Demonstration der Mongo Shell unter MongoDB mit 2.4.3:

$ 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

danke viel mann dafür. –

+1

Es gibt Gründe, dass 'slaveOK' existiert, es würde sich lohnen, auf diese Gründe hinzuweisen. Zum Beispiel: 'WICHTIG Vorsicht beim Angeben von Lesevoreinstellungen: Andere Modi als primäre können veraltete Daten zurückgeben, da bei der asynchronen Replikation die Daten auf der sekundären Seite möglicherweise nicht die neuesten Schreiboperationen enthalten. – Madbreaks

+0

Duhhh Ich wurde auf 27017 verbunden, was mein war Primär .... Nach einem Neustart musste ich das dumme Ding neu aufbauen, und mein neuer Meister war 27018. Der Beitrag oben half. – Andy

13

Sie haben den Befehl rs.slaveOk() in dem sekundären Server Shell auszuführen.

Verwandte Themen