2012-01-24 12 views
126

Probé conjuntos de réplicas mongo por primera vez.

Estoy usando ubuntu en ec2 y arranqué tres instancias. Utilicé 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 segundo árbitro 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 el secundario, a continuación, hago esto y obtener 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 hago algo en uno, va al otro. Entonces, si agrego un registro en uno, ¿qué debo hacer para replicar en las máquinas?

+0

descubrí que tengo que usar rs.slaveOk(); Eso me deja a otra pregunta. Tengo que hacer esto para cada consulta? ¿Qué pasa si estoy en el nodo maestro? –

Respuesta

209

Tiene que establecer el modo "esclavo correcto" para que el shell mongo sepa que está permitiendo lecturas de un secundario. Esto es para protegerlo a usted y a sus aplicaciones de realizar lecturas consistentes con el tiempo por accidente. Puede hacer esto en el shell con:

rs.slaveOk() 

Después de eso puede consultar normalmente desde secundarios.

Una nota sobre "consistencia eventual": en circunstancias normales, los conjuntos secundarios 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 leer desde un secundario rezagado se conoce como lectura "eventualmente consistente", porque, 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.

+0

Siempre verifique el manual antes de ejecutar comandos que no comprenda en sus bases de datos. Puede haber consecuencias para el comando que la respuesta no explica. ¿Este comando cambia la forma en que se distribuyen las operaciones de lectura para todas las conexiones al conjunto de réplicas? Mejor descubrirlo Este comando aparece desde v2.2 https://docs.mongodb.com/v2.2/reference/method/rs.slaveOk/ Usted puede (y siempre debe) reemplazar la parte "/ manual /" de un documento .mongodb.com URL a su versión específica para asegurarse de obtener información relevante. –

17

en mongodb2.0

debe escribir

rs.slaveOk() 

en el nodo secundario mongod

+0

Esto es engañoso, la respuesta de dcrosta es correcta. Como es el shell Mongo el que necesita este conjunto ** al consultar los nodos secundarios **, debe ejecutarlo en el shell cuando esté conectado a un nodo secundario antes de ejecutar sus consultas – jonatan

30

Para evitar tener que escribir rs.slaveOk() cada vez, hacer esto:

Crear un archivo llamado replStart.js, que contiene una línea: rs.slaveOk()

Luego incluya --shell replStart.js cuando lance el shell Mongo. Por supuesto, si te estás conectando localmente a una sola instancia, esto no guarda ningún tipeo.

+18

Una forma mejor de ahorrar en la escritura sería agregar 'rs.slaveOk()' a su archivo ['~/.mongorc.js'] (http://docs.mongodb.org/manual/reference/mongo/#mongo-mongorc-file), que se ejecutará automáticamente al iniciar el shell de mongo. – Stennie

+2

Me parece útil poner la configuración predeterminada en '~/.mongorc.js' y las configuraciones personalizadas en' replStart.js' o 'adminStart.js' o lo que sea. –

8

Esto es sólo una nota para cualquiera que trate con este problema utilizando el controlador de RUBY

tenía este mismo problema cuando se utiliza la Gema de rubíes.

Para establecer slaveOk en Ruby, que acaba de pasar como argumento cuando se crea 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) 

en cuenta que 'args' es el tercer opcional argumento.

0

ya solo queda añadir esta respuesta para una situación incómoda del proveedor DB.

lo que ocurrió en nuestro caso es el db primaria y secundaria desplaza en sentido inverso (primaria a secundaria y vice versa) y estamos recibiendo el mismo error.

tan comprueba en los valores de configuración de la base de datos de estado que pueden ayudarle.

Cuestiones relacionadas