如何从MongoDB Shell连接到副本集?


75

如果我正在编写连接到mongodb的应用程序,则可以提供副本集的种子列表,驱动程序会将我定向到主节点,在该节点上可以运行写命令。

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


2
请考虑将答案之一标记为已接受。
Dmytro Shevchenko

我对这个问题投了赞成票,但是由于作者没有给出答案,所以我投了反对票。
barrypicker19年

@barrypicker好,您删除了您的投票。现在恰好是69
Macindows

对于新手,您可以添加“连接到复制集”的含义。到目前为止,我发现的文档中没有对此进行描述。
Ben Slade

Answers:


105

要连接到主副本集,请使用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。


2
您能否说明一下:“ host1”,“ host2”是否包括主机,从机和仲裁器?还是只有我们写入的主机(主机)?
Daniel W.

我收到一条错误消息,指出所有要设置的节点都已关闭,但是rs.status()显示主要节点和次要节点都正常运行。
SSH

@SSH这确定您没有错字,使用错误的主机名或mongod进程绑定到错误的IP /接口吗?仔细检查第一3/4行蒙戈壳输出的
的Gianfranco P.

@GianPaJ谢谢您,对不起,我没有为我的副本集使用正确的名称,
SSH

3
注意:由于存在错误,因此在MongoDB 3.4.0和3.4.1(jira.mongodb.org/browse/SERVER-27289)中
不起作用

30

上面的答案适用于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"


17

您所要做的就是使用--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节点。

希望能有所帮助。


@Doron,您在mongodb.com上是否有RTFM链接对此进行了讨论?
马修·亚当斯

13

您可以使用“名称/种子1,种子2,...”格式:

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

这应该使您可以连接到当前任何主节点,并可以进行故障转移。您可以指定一个或多个种子,其余的将找到。

请注意,(AFAIK)Shell不允许您将读取内容路由到具有副本集连接的辅助对象。


1
这些连接命令看起来不像Shell脚本-那是什么语言?
理查德·沃伯顿

那是shell JS,但我只是意识到您不能使用connect函数,必须使用新的Mongo()进行编辑……
kristina 2012年

10

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

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


2
贴士mongo --host `mongo --quiet --eval "db.isMaster()['primary']"`
-KCD

8
实际上,它将。mongo --host 1.1.1.1:27017会将您直接连接到节点,而无需将您转发到主节点。mongo --host rsName / 1.1.1.1:20717将发现所有节点并将您转发到主节点。
约书亚·劳伦斯·奥斯蒂尔16-3-8

7

在外壳中,您可以首先使用:

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

4

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

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


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别名中的引用很难,我使用过如何在单引号引起来的字符串中转义单引号?求助 :-)


在我的情况下,我需要在bash脚本中使用它,因此我添加了如下功能:function replica_set_master_host { mongo --quiet -u user -p password --eval "db.isMaster()['primary']" }
tonatiuhnb 2014年

1

我正在使用v3.4。还是mongodb东西的新手...尽管“ man mongo”的帮助信息建议使用“ --host copyerSet / host:port,host:port” URL,但它对我不起作用。但是,我可以根据官方文档连接到我的全书集,如下所示:

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


1
mongodb://< dbuser >:< dbpassword >@example.com:< port >,example2.com:< port >/< dbname >?replicaSet=setname
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.