你如何连接到一个来自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)。