start - ¿Cómo se conecta a un replicateado desde un shell MongoDB?
connect to mongodb command line (9)
Si estoy escribiendo una aplicación que se conecta a mongodb, entonces puedo proporcionar una lista de semillas para un conjunto de réplicas, y el controlador me dirigirá al nodo maestro, donde puedo ejecutar comandos de escritura.
¿Cómo especifico la lista de semillas para una línea de comando mongo
shell para conectar a un replicaset?
Basándose en la respuesta de Chris Heald, estos dos alias de bash me permiten conectarme al maestro con un comando (donde db1.test.test es un miembro del conjunto de réplicas, acme es el nombre de la base de datos, mreppy es mi cuenta, etc.) Fallará por supuesto, si db1 está caído, pero sigue siendo útil.
alias whichprimary=''mongo db1.test.test/acme --username mreppy --password testtest --quiet --eval "db.isMaster()[''"''primary''"'']"''
alias connectprimary=''mongo -u mreppy -p testtest `whichprimary`/acme''
La cita en el alias de evaluación es difícil, utilicé ¿Cómo escapar de las comillas simples dentro de cadenas de una sola cita? para ayuda :-)
En el shell, puede usar primero:
mongo --nodb
para abrir una sesión de mongo sin conectarse a mongo replicaset
Entonces, como dijo kristina, entonces deberías poder usar
conn = new Mongo("myReplicaSet/A:27017,B:27017,C:27017")
para conectarse a un replicaset.
O eventualmente poner
conn = new Mongo("myReplicaSet/A:27017,B:27017,C:27017")
en su archivo js y
mongo --nodb yourcode.js
Estoy usando v3.4. También es nuevo para mongodb ... Aunque la información de ayuda de "man mongo" sugiere usar la URL "--host réplicaset / host: port, host: port", no funciona para mí. Sin embargo, puedo conectarme a mi replicaSet de acuerdo con el documentation , como se muestra a continuación:
$ mongo "mongodb://c1m,c2m,c3m/?replicaSet=rs0"
MongoDB shell version v3.4.1
connecting to: mongodb://c1m,c2m,c3m/?replicaSet=rs0
2017-02-08T14:46:43.818+0800 I NETWORK [main] Starting new replica set monitor for rs0/c1m:27017,c2m:27017,c3m:27017
MongoDB server version: 3.4.1
Server has startup warnings:
2017-02-08T13:31:14.672+0800 I CONTROL [initandlisten]
2017-02-08T13:31:14.672+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-02-08T13:31:14.672+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2017-02-08T13:31:14.672+0800 I CONTROL [initandlisten]
rs0:PRIMARY>
Así que supongo que la página man de mi mongo está desactualizada (estoy usando CentOS 7.3).
Las respuestas anteriores son para Mongo 3.2 .
Según la documentation Mongo 3.4 , el shell se modificó un poco:
En 3.2:
mongo --host host1,host2,host3/myRS myDB
o,
mongo --host host1:27017,host2:27017,host3:27017/myRS myDB
En 3.4:
mongo "mongodb://host1,host2,host3/myDB?replicaSet=myRS"
o,
mongo "mongodb://host1:27017,host2:27017,host3:27017/myDB?replicaSet=myRS"
Para conectarse a un conjunto de réplicas principales, use el --host
mongo shell --host
:
mongo --host replicaSetName/host1[:porthost1],host2[:porthost1],host3[:porthost3],etc
Por ejemplo:
$ mongo --host rs1/john.local:27019,john.local:27018
MongoDB shell version: v3.4.9
connecting to: mongodb://john.local:27019,john.local:27018/?replicaSet=rs1
2017-10-12T14:13:03.094+0000 I NETWORK [thread1] Starting new replica set monitor for rs1/john.local:27019,john.local:27018
2017-10-12T14:13:03.096+0000 I NETWORK [thread1] Successfully connected to john.local:27019 (1 connections now open to john.local:27019 with a 5 second timeout)
2017-10-12T14:13:03.096+0000 I NETWORK [thread1] Successfully connected to john.local:27018 (1 connections now open to john.local:27018 with a 5 second timeout)
rs1:PRIMARY> db
test
rs1:PRIMARY>
Nota: Desde 3.4.x, no puede especificar el db después, cuando usa --host o --port. Informe de error: https://jira.mongodb.org/browse/SERVER-28072
Puede usar --host
param para especificar el nombre de replSet y la lista de semillas, luego mongo
se conectará automáticamente al host primario actual.
ejemplo:
mongo --host rs0/1.example.com:27017,2.example.com:27017,3.example.com:27017 [dbname]
Puede usar el formato "name / seed1, seed2, ...":
> conn = new Mongo("myReplicaSet/A:27017,B:27017,C:27017")
> db = conn.getDB("test")
Esto debería darle una conexión a cualquier nodo que sea actualmente primario y manejar la failover de manera correcta. Puede especificar una o más semillas y encontrará el resto.
Tenga en cuenta que (AFAIK) el shell no le permite enrutar las lecturas a los secundarios con una conexión de conjunto de réplicas.
Según mi leal saber y entender, el cliente de la línea de comandos de mongo no aceptará semillas para reenviarlo al nodo maestro, porque a menudo puede querer operar el nodo secundario en lugar de ser reenviado.
Sin embargo, una vez conectado a cualquier nodo en el RS, puede descubrir la topología de RS a través de rs.config()
o db.isMaster()
. A continuación, puede utilizar esta información para volver a conectarse al nodo primario. Dependiendo de su shell, es posible que pueda usar mongo --eval "db.isMaster()[''primary'']"
para conectarse automáticamente al maestro.
Todo lo que tienes que hacer es usar --host y darle uno de tus hosts en el replicaset pero con el nombre del replicaset como prefijo.
Por ejemplo:
mongo --host my_mongo_server1
se conectará a my_mongo_server1, puede ser otro nodo SECUNDARIO.
Pero:
mongo --host my_repl_set_name/my_mongo_server1
siempre se conectará al nodo PRIMARY en el conjunto de réplicas, incluso si no es my_mongo_server1.
¿Por qué? La respuesta es "monitor de conjunto de réplicas". En el ejemplo anterior, mongo shell se conectaría al nodo especificado, iniciará un nuevo monitor de conjunto de réplicas para el conjunto de réplicas y utilizará el nodo especificado solo para sembrarlo. A partir de ahí, el monitor averiguará todos los nodos en el conjunto de réplicas y cambiará la conexión al nodo PRIMARIO.
Espero que haya ayudado.