pricing - mongodb atlas
mongodb, replica y error:{"$ err": "no maestro y slaveOk=falso", "código": 13435} (5)
Para evitar escribir rs.slaveOk()
cada vez, haga esto:
Crea un archivo llamado replStart.js
, que contiene una línea: rs.slaveOk()
Luego incluya --shell replStart.js
cuando ejecute el shell de Mongo. Por supuesto, si te estás conectando localmente a una sola instancia, esto no guarda ningún tipeo.
Probé sets de réplicas de mongo por primera vez.
Estoy usando ubuntu en ec2 y arranqué tres instancias. Usé la dirección IP privada de cada una de las instancias. Escogí como primario y abajo está el código.
mongo --host Private IP Address
rs.initiate()
rs.add(“Private IP Address”)
rs.addArb(“Private IP Address”)
Todo en este punto está bien. Cuando voy al sitio http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:28017/_replSet , veo que tengo un primario, un seconday y un árbitro.
Ok, ahora para una prueba.
En la primaria crear una base de datos en este es el código:
use tt
db.tt.save( { a : 123 } )
en la secundaria, luego hago esto y obtengo el siguiente error:
db.tt.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
Soy muy nuevo en mongodb y replica, pero pensé que si hacía algo en uno, pasaba al otro. Entonces, si agrego un registro en uno, ¿qué debo hacer para replicar en las máquinas?
Solo estoy agregando esta respuesta para una situación incómoda del proveedor de DB.
lo que sucedió en nuestro caso es el db primario y secundario desplazado en sentido inverso (de primario a secundario y viceversa) y estamos obteniendo el mismo error.
así que por favor revise los ajustes de configuración para el estado de la base de datos que pueden ayudarlo.
Tienes que configurar el modo "esclavo correcto" para que el caparazón de mongo sepa que estás permitiendo lecturas de un secundario. Esto es para protegerlo a usted y a sus aplicaciones de realizar lecturas consistentes con el tiempo por accidente. Puedes hacer esto en el shell con:
rs.slaveOk()
Después de eso puedes consultar normalmente desde secundarios.
Una nota sobre "coherencia eventual": en circunstancias normales, los secundarios de conjunto de réplicas tienen todos los mismos datos que los primarios en un segundo o menos. Con una carga muy alta, los datos que haya escrito en la primaria pueden tardar un tiempo en replicarse en los secundarios. Esto se conoce como "retraso de réplica", y la lectura de un secundario retrasado se conoce como lectura "eventualmente consistente", ya que, aunque los datos recién escritos aparecerán en algún momento (salvo errores de red, etc.), puede que no sea Inmediatamente disponible.
Editar: solo necesita establecer slaveok cuando consulta desde secundarios, y solo una vez por sesión.
en mongodb2.0
debes escribir
rs.slaveOk()
en el nodo mongod secundario
ESTO ES SOLO UNA NOTA PARA CUALQUIERA QUE TRATA DE ESTE PROBLEMA CON EL CONDUCTOR RUBY
Tuve el mismo problema cuando uso Ruby Gem.
Para configurar slaveOk en Ruby, simplemente pásalo como argumento cuando crees el cliente así:
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)
Tenga en cuenta que ''args'' es el tercer argumento opcional.