Wie stellen Sie über eine MongoDB-Shell eine Verbindung zu einem Replikatsatz her?

73

Wenn ich eine Anwendung schreibe, die eine Verbindung zu mongodb herstellt, kann ich eine Startliste für ein Replikatset bereitstellen, und der Treiber leitet mich zum Masterknoten weiter, auf dem ich Schreibbefehle ausführen kann.

Wie gebe ich die Startliste für eine Befehlszeilen- mongoShell an, um eine Verbindung zu einem Replikatsatz herzustellen?

Richard Warburton
quelle
2
Bitte markieren Sie eine der Antworten als akzeptiert.
Dmytro Shevchenko
Ich habe für diese Frage gestimmt, aber da der Autor keine Antwort vergeben hat, habe ich meine Stimme weggenommen.
Barrypicker
@barrypicker Gut, dass du deine Gegenstimme entfernt hast. Jetzt ist es genau 69
Macindows
Für Neulinge können Sie hinzufügen, was es bedeutet, "eine Verbindung zu einem Replikationssatz herzustellen". Es ist nicht in der Dokumentation beschrieben, die ich bisher gefunden habe.
Ben Slade

Antworten:

104

Verwenden Sie die Mongo-Shell- --hostOption , um eine Verbindung zu einem Replikatsatz Primary herzustellen :

mongo --host replicaSetName/host1[:porthost1],host2[:porthost1],host3[:porthost3],etc

Zum Beispiel:

$ 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 nach der Verwendung von --host oder --port verhinderte.

Gianfranco P.
quelle
2
Können Sie bitte klarstellen: Umfasst "Host1", "Host2" Master, Slaves und Arbiters? Oder nur Hosts, an die wir schreiben (Master)?
Daniel W.
Ich erhalte eine Fehlermeldung, dass alle Knoten für das Set ausgefallen sind, aber rs.status () zeigt an, dass primär und sekundär aktiv und fehlerfrei sind.
SSH Dies ist der
@SSHTIst du sicher, dass du keinen Tippfehler hast, den falschen Hostnamen verwendest oder die Mongod-Prozesse an die falsche IP / Schnittstelle gebunden sind? Überprüfen Sie die ersten 3/4 Zeilen der Mongo-Shell-Ausgabe
Gianfranco P.
@ GianPaJ Vielen Dank, Entschuldigung, Sie hatten Recht, ich habe nicht den richtigen Namen für mein Replikat verwendet,
SSH Dies
3
Hinweis: Aufgrund eines Fehlers funktioniert dies nicht in MongoDB 3.4.0 und 3.4.1 ( jira.mongodb.org/browse/SERVER-27289 )
qff
30

Die obigen Antworten beziehen sich auf Mongo 3.2 .

Laut 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"

Shemeshey
quelle
17

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

Zum Beispiel:

mongo --host my_mongo_server1

Wenn eine Verbindung zu my_mongo_server1 hergestellt wird, handelt es sich möglicherweise nur um einen weiteren SECONDARY-Knoten.

Aber:

mongo --host my_repl_set_name/my_mongo_server1

stellt immer eine Verbindung zum PRIMARY-Knoten im Replikatsatz her, auch wenn es nicht my_mongo_server1 ist.

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

Hoffe das hat geholfen.

Doron Levari
quelle
@Doron, haben Sie einen RTFM-Link auf mongodb.com, der dies bespricht?
Matthew Adams
13

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 Knoten geben, der gerade primär ist, und das Failover in Ordnung behandeln. Sie können einen oder mehrere Samen angeben und der Rest wird gefunden.

Beachten Sie, dass Sie mit der Shell (AFAIK) keine Lesevorgänge an Secondaries mit einer Replikatsatzverbindung weiterleiten können.

kristina
quelle
1
Diese Verbindungsbefehle sehen nicht wie ein Shell-Skript aus - welche Sprache ist das?
Richard Warburton
Das ist Shell JS, aber ich habe gerade festgestellt, dass Sie die Connect-Funktion nicht verwenden können. Sie müssen das neue Mongo () verwenden, um ...
kristina
9

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

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

Chris Heald
quelle
2
Netter Tipp,mongo --host `mongo --quiet --eval "db.isMaster()['primary']"`
KCD
8
Eigentlich wird es. mongo --host 1.1.1.1:27017 verbindet Sie direkt mit einem Knoten, ohne Sie an den primären Knoten weiterzuleiten. mongo --host rsName / 1.1.1.1: 20717 erkennt alle Knoten und leitet Sie an die primäre weiter.
Joshua Lawrence Austill
7

In der Shell können Sie zunächst Folgendes verwenden:

mongo --nodb

um eine Mongo-Sitzung zu öffnen, ohne eine Verbindung zum Mongo-Replikat herzustellen

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

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

um eine Verbindung zu einem Replikatsatz herzustellen.

Oder irgendwann gesagt

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

in Ihrer js-Datei und

mongo --nodb yourcode.js
geekysteven
quelle
4

Mit dem --hostParameter können Sie den replSet-Namen und die Seed-Liste angeben und stellen dann mongoautomatisch 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]

Sam Hiatt
quelle
1

Aufbauend auf der Antwort von Chris Heald kann ich mit diesen beiden Bash-Aliasen 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 nicht verfügbar 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 verwendet , um einfache Anführungszeichen in Zeichenfolgen mit einfachen Anführungszeichen zu umgehen. für Hilfe :-)

mreppy
quelle
In meinem Fall brauchte ich dies in einem Bash-Skript, also fügte ich eine Funktion wie diese hinzu:function replica_set_master_host { mongo --quiet -u user -p password --eval "db.isMaster()['primary']" }
Tonatiuhnb
1

Ich benutze v3.4. Auch neu in Mongodb-Sachen ... Obwohl die Hilfeinformationen von "man mongo" vorschlagen, die URL "--host replicaSet / host: port, host: port" zu verwenden, funktioniert sie bei mir nicht. Ich kann mich jedoch gemäß dem offiziellen 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 also, die Manpage meines Mongos ist veraltet (ich benutze CentOS 7.3).

Bruin
quelle
1
mongodb://< dbuser >:< dbpassword >@example.com:< port >,example2.com:< port >/< dbname >?replicaSet=setname
tief kühl
quelle