所以我有一组3个mongo副本集。主要(主)位于rs1,而rs2和rs3是次级。
但是,主要可能会发生变化,例如,由于某些配置问题,rs2可能在任何给定时间都是主要的。因此,我需要能够连接到适当的副本集。
假设它们位于rs1=10.1.1.1
,rs2=10.1.1.2
和rs3=10.1.1.3
。以下是我连接到Mongo的方式:
mongoserver_uri = "mongodb://{0}:{1}@{2}:{3}/admin".format(
username, password, host, port)
self.log.info("------- Mongo Server URI: %s --------" % mongoserver_uri)
self.client = pymongo.MongoClient(host=mongoserver_uri, ssl=True,
ssl_cert_reqs=ssl.CERT_NONE)
但是,如果像解释的那样,副本集主要更改为让我们说rs3
,那么我将无法连接到Mongo:
File "/home/ubuntu/myproject/mongodb.py", line 165, in clear_collections
collection.remove()
File "/usr/local/lib/python2.7/site-packages/pymongo/collection.py", line 2258, in remove
return self._delete(sock_info, spec_or_id, multi, write_concern)
File "/usr/local/lib/python2.7/site-packages/pymongo/collection.py", line 916, in _delete
codec_options=self.codec_options)
File "/usr/local/lib/python2.7/site-packages/pymongo/pool.py", line 218, in command
self._raise_connection_failure(error)
File "/usr/local/lib/python2.7/site-packages/pymongo/pool.py", line 346, in _raise_connection_failure
raise error
pymongo.errors.NotMasterError: not master
如何将其他副本集指定为MongoClient
?
答案 0 :(得分:2)
可以使用MongoClient()建立与副本集的连接 构造函数,指定集合的一个或多个成员,以及 副本集名称。
mongoserver_uri = "mongodb://{0}:{1}@{2}:{3}/admin".format(
username, password, host, port)
self.log.info("------- Mongo Server URI: %s --------" % mongoserver_uri)
self.client = pymongo.MongoClient(host=mongoserver_uri, ssl=True,
ssl_cert_reqs=ssl.CERT_NONE,
replicaset='name_of_set')
只要您连接的服务器最初处于联机状态,MongoClient将找到replicaSet的所有成员并自动尝试在故障转移时查找新的主服务器。
答案 1 :(得分:1)
在您的MongoClient中,您需要告诉pymongo您正在连接到副本集,以便它可以发现集合中的所有成员https://api.mongodb.com/python/current/examples/high_availability.html#id1
答案 2 :(得分:0)
dbconnect = MongoClient('mongodb:// mongos01:27017,mongos02:27017,mongos03:27017 /?replicaSet = seplicaSetName',username ='username',password ='password',authSource ='dbname',authMechanism = 'SCRAM-SHA1')