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

时间:2012-12-17 10:55:30

标签: mongodb mongo-shell

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

如何为命令行mongo shell指定种子列表以便连接到复制集。

10 个答案:

答案 0 :(得分:94)

连接到副本集主要使用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之后阻止指定数据库。

答案 1 :(得分:22)

以上答案适用于 Mongo 3.2

根据 Mongo 3.4 documentation,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"

答案 2 :(得分:13)

您可以使用“name / seed1,seed2,...”格式:

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

这应该可以为您提供与当前主节点相关的连接,并可以正常处理故障转移。你可以指定一个或多个种子,它会找到其余的种子。

请注意,(AFAIK)shell不允许您使用副本集连接将读取路由到辅助节点。

答案 3 :(得分:10)

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

例如:

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节点。

希望有所帮助。

答案 4 :(得分:8)

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

但是,一旦连接到RS中的任何节点,您就可以通过rs.config()db.isMaster()发现RS拓扑。然后,您可以使用此信息重新连接到主节点。您可以使用mongo --eval "db.isMaster()['primary']"自动连接到主服务器,具体取决于您的shell。

答案 5 :(得分:7)

在shell中,您可以先使用:

mongo --nodb

打开mongo会话而不连接到mongo replicaset

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

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

答案 6 :(得分:3)

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

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

答案 7 :(得分:1)

基于Chris Heald的答案,这两个bash别名让我用一个命令连接到master(其中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别名中的引用很难,我使用How to escape single-quotes within single-quoted strings?求助: - )

答案 8 :(得分:0)

我正在使用v3.4。也是mongodb的新东西...... 虽然“man mongo”的帮助信息建议使用“--host replicaSet / host:port,host:port”url,但它对我不起作用。 但是,我可以根据official document连接到我的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)。

答案 9 :(得分:0)

mongodb://< dbuser >:< dbpassword >@example.com:< port >,example2.com:< port >/< dbname >?replicaSet=setname