如何从MongoDB shell连接到复制集?

Ric*_*ton 68 mongodb mongo-shell

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

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

Gia*_* P. 96

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

mongo --host replicaSetName/host1[:porthost1],host2[:porthost1],host3[:porthost3],etc
Run Code Online (Sandbox Code Playgroud)

例如:

$ 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>
Run Code Online (Sandbox Code Playgroud)

注意:从3.4.x开始,当使用--host或--port时,不能指定db.错误报告:https://jira.mongodb.org/browse/SERVER-28072

  • 注意:由于一个错误,这在MongoDB 3.4.0和3.4.1中不起作用(https://jira.mongodb.org/browse/SERVER-27289) (3认同)
  • 能否请你澄清一下:"host1","host2"是否包括主人,奴隶和仲裁者?或者只有我们写的主人(主人)? (2认同)

小智 25

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


小智 14

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

例如:

mongo --host my_mongo_server1
Run Code Online (Sandbox Code Playgroud)

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

但:

mongo --host my_repl_set_name/my_mongo_server1
Run Code Online (Sandbox Code Playgroud)

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

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

希望有所帮助.


kri*_*ina 13

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

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

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

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


Chr*_*ald 8

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

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

  • 实际上,它会.mongo --host 1.1.1.1:27017会将您直接连接到节点,而不会将您转发到主节点.mongo --host rsName/1.1.1.1:20717将发现所有节点并转发到主节点. (7认同)
  • 不错的提示,``mongo --host`mongo --quiet --eval"db.isMaster()['primary']"``` (2认同)

小智 7

在shell中,您可以先使用:

mongo --nodb
Run Code Online (Sandbox Code Playgroud)

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

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

conn = new Mongo("myReplicaSet/A:27017,B:27017,C:27017")
Run Code Online (Sandbox Code Playgroud)

连接到复制集.

或最终放

conn = new Mongo("myReplicaSet/A:27017,B:27017,C:27017")
Run Code Online (Sandbox Code Playgroud)

在你的js文件和

mongo --nodb yourcode.js
Run Code Online (Sandbox Code Playgroud)


Sam*_*att 5

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

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