我采用了pymongo的MongoClient类连接到一个复制集,该复制集有三个节点,一个主要的2个辅助节点。代码段如下:
c = MongoClient([secondary1_hostname, secondary2_hostname], replicaSet='rs0')
当检查三个mongod的日志时,我发现始终与主要主机建立了连接,但是其他2个从未接收到来自客户端的连接请求或者连接立即断开连接。似乎客户端首先到达一个二级获得主要地址然后删除连接并创建与主要的长期连接。
但是,当我使用MongoReplicaSetClient类时,使用下面的代码sinppet:
c = MongoReplicaSetClient(secondary1_name, replicaSet='rs0')
每个副本集成员始终创建3个连接,从mongod的日志文件中获取。
那么,为什么MongoClient的行为总是只创建与主要的连接?我阅读了PyMongo的手册,但没有找到答案。任何建议都表示赞赏。
答案 0 :(得分:4)
目前的pymongo(= 3.2):
c = pymongo.MongoClient('mongodb://user:passwd@node1:p1,node2:p2/?replicaSet=rsname')
time.sleep(2)
print c.nodes
frozenset([(u'node1', p1), (u'node2', p2)])
如pymongo high availability documentation中所述:
传递给MongoClient()的地址称为种子。只要至少有一个种子在线,MongoClient就会发现副本集中的所有成员,并确定哪个是当前的主要成员,哪个是次要成员或仲裁者。
答案 1 :(得分:3)
MongoClient
仅用于单个连接,当与MongoD
说话时,它将选择数据库列表中的最后一个。添加replicaSet
pymongo时,它将验证它连接的副本集是否与此名称匹配。意味着指定的主机是种子列表,pymongo应该尝试查找集合的所有成员,然后它将连接到主节点。
MongoClient
接受多个主机的另一个原因是处理Mongos
和高可用性:http://api.mongodb.org/python/current/examples/high_availability.html#high-availability-and-mongos MongoClient
还处理通过Mongos与副本集通话时的复制集配置。
MongoReplicaSetClient
专门针对replicaset连接,它会尝试查找集合的所有成员。它还会启动副本集监视器,以便快速响应副本集配置中的更改。
答案 2 :(得分:1)
MongoClient
类仅连接到单个主机,文档(http://api.mongodb.org/python/current/api/pymongo/mongo_client.html)说:
在host:port。
创建与单个MongoDB实例的新连接
您需要使用已发现的MongoReplicaSetClient
类来处理副本集。