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- mongo
Shell an, um eine Verbindung zu einem Replikatsatz herzustellen?
mongodb
mongo-shell
Richard Warburton
quelle
quelle
Antworten:
Verwenden Sie die Mongo-Shell-
--host
Option , um eine Verbindung zu einem Replikatsatz Primary herzustellen :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.
quelle
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"
quelle
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:
Wenn eine Verbindung zu my_mongo_server1 hergestellt wird, handelt es sich möglicherweise nur um einen weiteren SECONDARY-Knoten.
Aber:
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.
quelle
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.
quelle
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 ermittelndb.isMaster()
. Sie können diese Informationen dann verwenden, um die Verbindung zum Primärknoten wiederherzustellen. Abhängig von Ihrer Shell können Sie möglicherweisemongo --eval "db.isMaster()['primary']"
automatisch eine Verbindung zum Master herstellen.quelle
mongo --host `mongo --quiet --eval "db.isMaster()['primary']"`
In der Shell können Sie zunächst Folgendes verwenden:
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
quelle
Mit dem
--host
Parameter können Sie den replSet-Namen und die Seed-Liste angeben und stellen dannmongo
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]
quelle
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 :-)
quelle
function replica_set_master_host { mongo --quiet -u user -p password --eval "db.isMaster()['primary']" }
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).
quelle
mongodb://< dbuser >:< dbpassword >@example.com:< port >,example2.com:< port >/< dbname >?replicaSet=setname
quelle