如果我正在编写连接到mongodb的应用程序,则可以提供副本集的种子列表,驱动程序会将我定向到主节点,在该节点上可以运行写命令。
如何为命令行mongo
外壳指定种子列表以连接到副本集。
如果我正在编写连接到mongodb的应用程序,则可以提供副本集的种子列表,驱动程序会将我定向到主节点,在该节点上可以运行写命令。
如何为命令行mongo
外壳指定种子列表以连接到副本集。
Answers:
要连接到主副本集,请使用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。
上面的答案适用于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节点。
希望能有所帮助。
您可以使用“名称/种子1,种子2,...”格式:
> conn = new Mongo("myReplicaSet/A:27017,B:27017,C:27017")
> db = conn.getDB("test")
这应该使您可以连接到当前任何主节点,并可以进行故障转移。您可以指定一个或多个种子,其余的将找到。
请注意,(AFAIK)Shell不允许您将读取内容路由到具有副本集连接的辅助对象。
据我所知,mongo命令行客户端不会接受将您转发到主节点的种子,因为您可能经常希望实际在辅助节点上进行操作而不是被转发。
但是,一旦连接到RS中的任何节点,就可以通过rs.config()
或查找RS拓扑db.isMaster()
。然后,您可以使用此信息重新连接到主节点。根据您的外壳,您也许可以使用mongo --eval "db.isMaster()['primary']"
自动连接到主服务器。
mongo --host `mongo --quiet --eval "db.isMaster()['primary']"`
基于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别名中的引用很难,我使用过如何在单引号引起来的字符串中转义单引号?求助 :-)
function replica_set_master_host { mongo --quiet -u user -p password --eval "db.isMaster()['primary']" }
我正在使用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)。