webentwicklung-frage-antwort-db.com.de

MongoDB-Replikatsatz, der verhindert, dass Abfragen auf sekundär gesetzt werden

Um den Replikatsatz einzurichten, habe ich drei separate Terminal-Registerkarten verwendet:

 $ 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 habe ich die Replikation in der Mongo Shell konfiguriert und überprüft, ob sie 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

Gegen jeden sekundären:

 $ ./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 habe an mehreren Stellen gelesen, dass ich rs.slaveOk() oder db.getMongo().setSlaveOk() verwenden soll, aber keine davon hatte Auswirkungen, unabhängig davon, ob sie über die Shell eingegeben oder in meinem Skript aufgerufen wurden. Diese Anweisungen verursachten beim Aufrufen keine Fehler, konnten das Problem jedoch auch nicht beheben.

Weiß jemand, warum ich mein Replset nicht so konfigurieren kann, dass das sekundäre abgefragt werden kann?

27
Ryan Kennedy

rs.slaveOk() läuft in der Mongo-Shell und ermöglicht das Lesen von Secondaries. Hier ist eine Demonstration mit der Mongo Shell unter MongoDB 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
66
James Wahlin

Sie müssen den Befehl rs.slaveOk() in der Shell des sekundären Servers ausführen.

17
Dung Nguyen