pymongo MongoClient连接到ReplicaSet

时间:2013-07-25 08:18:52

标签: mongodb replication pymongo

我采用了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的手册,但没有找到答案。任何建议都表示赞赏。

3 个答案:

答案 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类来处理副本集。