你如何连接到一个来自MongoDB shell的复制集?

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

如何为命令行mongo shell指定种子列表以便与复制集合相关联。

连接到副本集主要使用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.x开始,在使用–host或–port时,不能指定db。 错误报告: https : //jira.mongodb.org/browse/SERVER-28072

你可以使用“name / seed1,seed2,…”格式:

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

这应该给你一个连接,无论哪个节点是当前主要和处理故障转移没关系。 你可以指定一个或多个种子,它会find其余的。

请注意(AFAIK)shell不允许您将读取路由到具有副本集连接的副本。

上面的答案是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"

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

希望有所帮助。

据我所知,mongo命令行客户端不会接受种子将您转发到主节点,因为您可能经常想要在辅助节点上运行而不是转发。

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

在shell中,你可以先使用:

 mongo --nodb 

在不连接到mongo replicaset的情况下打开一个mongo会话

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

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

连接到一个replicaset。

或者最终放

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

在你的js文件和

 mongo --nodb yourcode.js 

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

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

基于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别名引用是困难的,我用单引号string中如何逃避单引号? 求助 :-)

我正在使用v3.4。 也是新的mongodb的东西…虽然“man mongo”的帮助信息build议使用“ – 主副本集/主机:端口,主机:端口”的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的man page已经过时(我正在使用CentOS 7.3)。