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.
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.
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"
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.
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é.
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.
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
Vous pouvez utiliser le --Host
param 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]
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 :-)
mongodb://< dbuser >:< dbpassword >@example.com:< port >,example2.com:< port >/< dbname >?replicaSet=setname
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).