webentwicklung-frage-antwort-db.com.de

Wie verbinde ich mich mit einem Replikatset aus einer MongoDB-Shell?

Wenn ich eine Anwendung schreibe, die eine Verbindung zu Mongodb herstellt, kann ich eine Seed-Liste für ein Replicaset bereitstellen, und der Treiber leitet mich zum Masterknoten weiter, wo ich Schreibbefehle ausführen kann.

Wie gebe ich die Seed-Liste für eine mongo Kommandozeilen-Shell an, um eine Verbindung zu einem Replicaset herzustellen?.

67

Verwenden Sie zum Herstellen einer Verbindung zu einem primären Replikatsatz die Mongo-Shell --Host Möglichkeit:

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

Beispielsweise:

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

Hinweis: In den Versionen 3.4.2 bis 3.4.10 gab es einen Fehler ( SERVER-28072 ), der die Angabe der Datenbank verhinderte nachher bei Verwendung von --Host oder --port.

95
Gianfranco P.

Die obigen Antworten gelten für Mongo 3.2 .

Gemäß Mongo 3.4 Dokumentation wurde die Shell ein wenig geändert:

In 3.2:
mongo --Host host1,Host2,Host3/myRS myDB
oder,
mongo --Host host1:27017,Host2:27017,Host3:27017/myRS myDB

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

24
Shemeshey

Sie können das Format "name/seed1, seed2, ..." verwenden:

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

Dies sollte Ihnen eine Verbindung zu dem aktuell primären Knoten ermöglichen und das Failover in Ordnung bringen. Sie können einen oder mehrere Samen angeben und der Rest wird gefunden.

Beachten Sie, dass Sie mit der Shell (AFAIK) keine Reads an Secondaries mit einer Replikat-Set-Verbindung weiterleiten können.

13
kristina

Alles, was Sie tun müssen, ist --Host zu verwenden und ihm einen Ihrer Hosts im Replikatsatz zuzuweisen, jedoch mit dem Namen des Replikatsatzes als Präfix.

Beispielsweise:

mongo --Host my_mongo_server1

wird eine Verbindung zu my_mongo_server1 hergestellt, ist dies möglicherweise nur ein weiterer SECONDARY-Knoten.

Aber:

mongo --Host my_repl_set_name/my_mongo_server1

stellt immer eine Verbindung zum PRIMARY-Knoten im Replikatssatz her, auch wenn es sich nicht um my_mongo_server1 handelt.

Warum? Die Antwort lautet "Replica Set Monitor". Im obigen Beispiel stellt die Mongo-Shell eine Verbindung zum angegebenen Knoten her, startet einen neuen Replikatsatz-Monitor für den Replikatsatz und verwendet den angegebenen Knoten nur zum Seeding. Von dort aus ermittelt der Monitor alle Knoten im Replikatsatz und stellt die Verbindung zum PRIMARY-Knoten her.

Hoffe das hat geholfen.

12
Doron Levari

Meines Wissens akzeptiert der Mongo-Befehlszeilenclient keine Seeds, um Sie an den Masterknoten weiterzuleiten, da Sie möglicherweise häufig auf dem sekundären Knoten arbeiten möchten, anstatt weitergeleitet zu werden.

Sobald Sie jedoch mit einem beliebigen Knoten in der RS ​​verbunden sind, können Sie die RS-Topologie über rs.config() oder db.isMaster() ermitteln. Sie können diese Informationen dann verwenden, um die Verbindung zum primären Knoten wiederherzustellen. Abhängig von Ihrer Shell können Sie möglicherweise mongo --eval "db.isMaster()['primary']" verwenden, um automatisch eine Verbindung zum Master herzustellen.

8
Chris Heald

In der Shell können Sie zuerst Folgendes verwenden:

mongo --nodb

um eine mongo-sitzung zu eröffnen, ohne eine verbindung zum mongo replicaset herzustellen

Dann, wie Kristina sagte, sollten Sie in der Lage sein, zu verwenden

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

eine Verbindung zu einem Replicaset herstellen.

Oder irgendwann setzen

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

in deiner js datei und

mongo --nodb yourcode.js
7
geekysteven

Du kannst den ... benutzen --Host param, um den ReplSet-Namen und die Seed-Liste anzugeben, dann stellt mongo automatisch eine Verbindung zum aktuellen primären Host her.

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

3
Sam Hiatt

Aufbauend auf der Antwort von Chris Heald lassen mich diese beiden Bash-Aliase mit einem Befehl eine Verbindung zum Master herstellen (wobei db1.test.test ein Mitglied des Replikatsatzes ist, acme der Datenbankname ist, mreppy mein Konto ist usw.) natürlich, wenn db1 down ist, aber es ist immer noch praktisch.

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'

Das Zitieren im Alias ​​"eval" ist schwierig. Ich habe Wie kann man einfache Anführungszeichen innerhalb einfach zitierter Zeichenfolgen umgehen? um Hilfe gebeten :-)

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

Ich benutze v3.4. Ebenfalls neu bei Mongodb ... Obwohl die Hilfeinformation von "man mongo" die Verwendung der URL "--Host replicaSet/Host: port, Host: port" vorschlägt, funktioniert sie bei mir nicht. Ich kann mich jedoch gemäß offizielles Dokument wie folgt mit meinem replicaSet verbinden:

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

Ich denke, die Manpage meines Mongos ist veraltet (ich benutze CentOS 7.3).

0
bruin