78

如果我正在编写一个连接到 mongodb 的应用程序,那么我可以为副本集提供一个种子列表,驱动程序会将我引导到主节点,我可以在其中运行写入命令。

如何为命令行mongoshell 指定种子列表以连接到副本集。

4

10 回答 10

112

要连接到副本集 Primary,请使用 mongo shell--host选项:

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

例如:

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

注意:从版本 3.4.2 到 3.4.10 存在一个错误 ( SERVER-28072 ),它阻止在使用 --host 或 --port 之后指定 db。

于 2015-02-23T14:04:48.393 回答
33

以上答案适用于Mongo 3.2

根据Mongo 3.4 文档,shell 做了一些改动:

在 3.2 中:
mongo --host host1,host2,host3/myRS myDB
或者,
mongo --host host1:27017,host2:27017,host3:27017/myRS myDB

在 3.4 中:
mongo "mongodb://host1,host2,host3/myDB?replicaSet=myRS"
或者,
mongo "mongodb://host1:27017,host2:27017,host3:27017/myDB?replicaSet=myRS"

于 2017-03-08T12:00:07.720 回答
19

您所要做的就是使用 --host 并为其提供副本集中的主机之一,但将副本集的名称作为前缀。

例如:

mongo --host my_mongo_server1

将连接到 my_mongo_server1,它可能只是另一个 SECONDARY 节点。

但:

mongo --host my_repl_set_name/my_mongo_server1

将始终连接到副本集中的 PRIMARY 节点,即使它不是 my_mongo_server1。

为什么?答案是“副本集监视器”。在上面的示例中,mongo shell 将连接到指定的节点,为副本集启动一个新的副本集监视器,并将使用指定的节点来播种它。从那里,监视器将找出副本集中的所有节点,并将连接切换到 PRIMARY 节点。

希望有帮助。

于 2015-09-15T01:31:33.840 回答
15

You can use the "name/seed1,seed2,..." format:

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

This should give you a connection to whichever node is currently primary and handle failover okay. You can specify one or more seeds and it'll find the rest.

Note that (AFAIK) the shell does not allow you to route reads to secondaries with a replica set connection.

于 2012-12-17T18:57:25.513 回答
11

据我所知,mongo 命令行客户端不会接受种子将您转发到主节点,因为您可能经常希望在辅助节点上实际操作而不是被转发。

但是,一旦连接到 RS 中的任何节点,您可以通过rs.config()或发现 RS 拓扑db.isMaster()。然后,您可以使用此信息重新连接到主节点。根据您的外壳,您可能能够使用mongo --eval "db.isMaster()['primary']"自动连接到主服务器。

于 2012-12-17T11:21:47.407 回答
7

在shell中,你可以先使用:

mongo --nodb

在不连接到 mongo 副本集的情况下打开 mongo 会话

然后,就像克里斯蒂娜说的,那么你应该可以使用

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

连接到副本集。

或者最终放

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

在你的 js 文件和

mongo --nodb yourcode.js
于 2014-05-23T11:09:27.280 回答
5

您可以使用--host参数指定 replSet 名称和种子列表,然后mongo将自动连接到当前的主主机。

例子:
mongo --host rs0/1.example.com:27017,2.example.com:27017,3.example.com:27017 [dbname]

于 2015-03-17T20:51:43.717 回答
1

基于 Chris Heald 的回答,这两个 bash 别名让我可以使用一个命令连接到主服务器(其中 db1.test.test 是副本集的一个成员,acme 是数据库名称,mreppy 是我的帐户等)它将失败当然,如果 db1 已关闭,但它仍然很方便。

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'

eval 别名中的引用很难,我使用了如何在单引号字符串中转义单引号?求助 :-)

于 2013-10-30T14:14:38.280 回答
1

我正在使用 v3.4。对 mongodb 的东西也是新的......虽然“man mongo”的帮助信息建议使用“--host replicaSet/host:port,host:port” url,但它对我不起作用。但是,我可以按照官方文档连接到我的replicaSet ,如下:

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

所以我猜我的 mongo 的手册页已经过时了(我使用的是 CentOS 7.3)。

于 2017-02-08T06:55:43.577 回答
1
mongodb://< dbuser >:< dbpassword >@example.com:< port >,example2.com:< port >/< dbname >?replicaSet=setname
于 2019-05-13T11:35:52.527 回答