web-dev-qa-db-fra.com

Comment vous connecter à un jeu de répliques à partir d'un shell MongoDB?

Si j'écris une application qui se connecte à mongodb, je peux fournir une liste de départ pour un jeu de réplicas et le pilote me dirigera vers le nœud maître, où je peux exécuter des commandes d'écriture.

Comment spécifier la liste de départ pour une ligne de commande mongo Shell afin de se connecter à un jeu de réplicas.

67
Richard Warburton

Pour vous connecter à un jeu de réplicas primaire, utilisez le shell mongo --Host option:

mongo --Host replicaSetName/Host1[:porthost1],Host2[:porthost1],Host3[:porthost3],etc

Par exemple:

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

Remarque: Des versions 3.4.2 à 3.4.10, un bogue ( SERVER-28072 ) empêchait de spécifier la base de données. après l'utilisation de --Host ou --port.

95
Gianfranco P.

Les réponses ci-dessus sont pour Mongo 3.2 .

Selon Mongo 3.4 documentation , le shell a été légèrement modifié:

En 3.2:
mongo --Host host1,Host2,Host3/myRS myDB
ou,
mongo --Host host1:27017,Host2:27017,Host3:27017/myRS myDB

En 3.4:
mongo "mongodb://Host1,Host2,Host3/myDB?replicaSet=myRS"
ou,
mongo "mongodb://Host1:27017,Host2:27017,Host3:27017/myDB?replicaSet=myRS"

24
Shemeshey

Vous pouvez utiliser le format "nom/seed1, seed2, ...":

> conn = new Mongo("myReplicaSet/A:27017,B:27017,C:27017")
> db = conn.getDB("test")

Cela devrait vous donner une connexion au nœud actuellement primaire et gérer correctement le basculement. Vous pouvez spécifier une ou plusieurs graines et le reste sera trouvé.

Notez que (autant que je sache), le shell ne vous permet pas de router les lectures vers des secondaires avec une connexion de jeu de réplicas.

13
kristina

Tout ce que vous avez à faire est d’utiliser --Host et de lui attribuer l’un de vos hôtes dans le jeu de réplicas, mais avec le nom du réplicas comme préfixe.

Par exemple:

mongo --Host my_mongo_server1

se connectera à my_mongo_server1, il se peut qu’il s’agisse d’un autre nœud SECONDARY.

Mais:

mongo --Host my_repl_set_name/my_mongo_server1

toujours se connecter au noeud PRIMARY dans le jeu de réplicas, même s'il ne s'agit pas de my_mongo_server1.

Pourquoi? La réponse est "moniteur de jeu de réplicas". Dans l'exemple ci-dessus, mongo Shell se connecte au nœud spécifié, démarre un nouveau moniteur de jeu de réplicas pour le jeu de réplicas et utilise le nœud spécifié uniquement pour initialiser ce dernier. À partir de là, le moniteur déterminera tous les nœuds du jeu de réplicas et basculera la connexion vers le nœud PRIMARY.

J'espère que ça a aidé.

12
Doron Levari

Autant que je sache, le client de ligne de commande mongo n'acceptera pas les graines pour vous transférer au noeud maître, car vous souhaiterez souvent opérer sur le noeud secondaire plutôt que d'être transféré.

Cependant, une fois connecté à un nœud de la RS, vous pouvez découvrir la topologie de la RS via rs.config() ou db.isMaster(). Vous pouvez ensuite utiliser ces informations pour vous reconnecter au nœud principal. En fonction de votre shell, vous pourrez peut-être utiliser mongo --eval "db.isMaster()['primary']" pour vous connecter automatiquement au maître.

8
Chris Heald

Dans le shell, vous pouvez d’abord utiliser:

mongo --nodb

ouvrir une session de mongo sans se connecter à mongo replicaset

Ensuite, comme l’a dit Kristina, vous devriez pouvoir utiliser

conn = new Mongo("myReplicaSet/A:27017,B:27017,C:27017")

se connecter à un réplicaset.

Ou éventuellement mis

conn = new Mongo("myReplicaSet/A:27017,B:27017,C:27017")

dans votre fichier js et

mongo --nodb yourcode.js
7
geekysteven

Vous pouvez utiliser le --Hostparam pour spécifier le nom replSet et la liste d'origine, puis mongo se connectera automatiquement à l'hôte principal actuel.

exemple:
mongo --Host rs0/1.example.com:27017,2.example.com:27017,3.example.com:27017 [dbname]

3
Sam Hiatt

S'appuyant sur la réponse de Chris Heald, ces deux alias bash me permettent de me connecter au maître avec une seule commande (où db1.test.test est l'un des membres du jeu de réplicas, acme est le nom de la base de données, mreppy est mon compte, etc.). Il échouera. Bien sûr, si db1 est en panne, mais c'est toujours pratique.

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 citation dans l'alias eval est difficile, j'ai utilisé Comment échapper à des guillemets simples dans des chaînes entre guillemets simples? for help :-)

1
mreppy
mongodb://< dbuser >:< dbpassword >@example.com:< port >,example2.com:< port >/< dbname >?replicaSet=setname
0
deep cool

J'utilise v3.4. Aussi nouveau pour mongodb ... Bien que les informations d'aide de "man mongo" suggèrent d'utiliser "--Host replicaSet/Host: port, Host: port" url, cela ne fonctionne pas pour moi. Cependant, je peux me connecter à mon réplicaSet selon document officiel , comme ci-dessous:

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

Je suppose donc que la page de manuel de mon mongo est obsolète (j'utilise CentOS 7.3).

0
bruin