Para configurar el conjunto de réplicas, me he quedado en 3 terminal separada pestañas:

 $ 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

Entonces, he configurado la replicación en el Mongo shell y verificado que se trabajó:

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

Mi script se ejecuta bien, en contra de la primaria:

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

Sin embargo, en contra de cualquiera de secundaria:

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

He leído en varios lugares para utilizar rs.slaveOk() o db.getMongo().setSlaveOk(), pero ninguno de ellos ha tenido algún efecto, si se ingresa desde el shell o llamado en mi guión. Estas declaraciones no producir errores cuando se llama, pero que no soluciona el problema.

¿Alguien sabe por qué no puedo configurar mi replset para permitir la consulta de la secundaria?

  • rs.slaveOk() debe permitir que usted lea. Acabo de probar el uso de la mongo shell y 2.4.3 y un count() trabajó para mí. Puede compartir su guión?
  • es la única manera de que esto está sucediendo es que si usted no tenía la rs.slaveOk() antes de ejecutar el comando que dio este resultado. Más información acerca de la js script de contenido puede ayudar.
  • posibles duplicados de mongodb, se replica y error: { «$err» : «no maestro y slaveOk=false», «código» : 13435 }
InformationsquelleAutor Ryan Kennedy | 2013-06-17

2 Comentarios

  1. 68

    rs.slaveOk() ejecutar en el shell mongo permitirá a leer a partir de los secundarios. Aquí está una demostración utilizando el mongo shell en 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
    • Hay razones por las que slaveOK existe, valdría la pena señalar cuáles son esas razones. Por ejemplo: IMPORTANT Exercise care when specifying read preferences: Modes other than primary may return stale data because with asynchronous replication, data in the secondary may not reflect the most recent write operations.
    • Duhhh yo estaba conectado en 27017 que fue mi primaria…. después de un reinicio que tuvo que reconstruir la estupidez, y mi nuevo maestro era 27018. El post anterior ayudado.
    • Sólo para información: rs.slaveOk() es por la configuración de la conexión. Cada conexión debe emitir este comando antes de intentar interactuar con las bases de datos.

Dejar respuesta

Please enter your comment!
Please enter your name here