13

我采用了 pymongo 的 MongoClient 类来连接到一个具有三个节点的副本集,1 个主节点,2 个辅助节点。代码片段如下:

c = MongoClient([secondary1_hostname, secondary2_hostname], replicaSet='rs0')

当检查三个mongod的日志时,我发现总是有一个连接到primary主机,但是其他2个secondary没有收到来自客户端的连接请求或立即断开连接。似乎客户端首先到达了一个辅助节点,获得了主地址,然后断开了连接并创建了与主节点的长期连接。

但是,当我使用 MongoReplicaSetClient 类时,代码如下:

c = MongoReplicaSetClient(secondary1_name, replicaSet='rs0')

从 mongod 的日志文件中获取每个副本集成员始终创建 3 个连接。

那么,为什么 MongoClient 的行为总是只创建到主节点的连接呢?我阅读了 PyMongo 的手册,但没有找到答案。任何建议表示赞赏。

4

3 回答 3

7

MongoClient仅用于单个连接,并且在与它交谈MongoD时会选择数据库列表中的最后一个。添加replicaSetpymongo 时,它将验证它连接到的副本集是否与此名称匹配。暗示指定的主机是种子列表,pymongo 应该尝试查找集合的所有成员,然后它将连接到主节点。

接受多个主机的另一个原因MongoClient是为了处理Mongos和高可用性:http MongoClient : //api.mongodb.org/python/current/examples/high_availability.html#high-availability-and-mongos 还处理副本集配置,用于通过以下方式与副本集对话蒙古人。

MongoReplicaSetClient专门用于复制集连接,它尝试查找集合的所有成员。它还启动副本集监视器,这使其能够快速响应副本集配置的更改。

于 2013-07-25T13:22:36.413 回答
7

使用当前的 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 高可用性文档中所述:

传递给 MongoClient() 的地址称为种子。只要至少有一个种子在线,MongoClient 就会发现副本集中的所有成员,并确定哪些是当前主节点,哪些是辅助节点或仲裁节点。

于 2017-03-01T11:31:29.510 回答
0

该类MongoClient仅连接到单个主机,如文档(http://api.mongodb.org/python/current/api/pymongo/mongo_client.html)所述:

在 host:port 创建到单个 MongoDB 实例的新连接。

您需要使用MongoReplicaSetClient您已经发现的类来处理副本集。

于 2013-07-25T12:30:13.370 回答