首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoReplicationSetClient在pymongo2.6.3中返回一个空集

MongoReplicationSetClient在pymongo2.6.3中返回一个空集
EN

Stack Overflow用户
提问于 2013-11-25 21:37:03
回答 1查看 435关注 0票数 1

在试图连接到远程副本集时,我遇到了MongoReplicaClient的问题。出于某种原因,MongoReplicaSetClient只是为不在本地主机上的任何副本集返回一个空集。奇怪的是,MongoClient工作得很好。我不知道如何进一步调试它,因为它不会在任何情况下出错。网络似乎被排除了,因为通过MongoClient连接很好。有人知道为什么会发生这种事吗?

更新

经过进一步调查,当本地主机无法在不使用远程主机名的情况下解析远程主机名时,该问题似乎会影响Pymongo 2.6.3。问题是,如果在这种情况下向MongoReplicaSetClient提供了FQDN,那么它只返回一个空集。以下是我如何复制这个问题:

环境

代码语言:javascript
复制
python2.7 (2.7.3-0ubuntu3.4)  
DISTRIB_ID=Ubuntu  
DISTRIB_RELEASE=12.04  
DISTRIB_CODENAME=precise  
DISTRIB_DESCRIPTION="Ubuntu 12.04.2 LTS"

操作步骤

1)确认远程主机名无法解析

代码语言:javascript
复制
05:03:48 [js-dev][503]$ ping -c3 hq-sre-mongodb-01
ping: unknown host hq-sre-mongodb-01

05:03:59 [js-dev][504]$ ping -c3 hq-sre-mongodb-01.eng.nutanix.com
PING hq-sre-mongodb-01.eng.nutanix.com (10.1.56.11) 56(84) bytes of data.
64 bytes from hq-sre-mongodb-01.eng.nutanix.com (10.1.56.11): icmp_req=1 ttl=63 time=0.222 ms
64 bytes from hq-sre-mongodb-01.eng.nutanix.com (10.1.56.11): icmp_req=2 ttl=63 time=0.217 ms
64 bytes from hq-sre-mongodb-01.eng.nutanix.com (10.1.56.11): icmp_req=3 ttl=63 time=0.247 ms

芒果2.5的试验

1)使用主机名连接到副本集(按预期中断)

代码语言:javascript
复制
>>> MongoReplicaSetClient('hq-sre-mongodb-01', replicaSet='rs0')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_replica_set_client.py", line 516, in __init__
    raise ConnectionFailure(str(e))
pymongo.errors.ConnectionFailure: hq-sre-mongodb-01:27017: [Errno -2] Name or service not known

2)使用FQDN连接到副本集(Works)

代码语言:javascript
复制
>>> pymongo.version
'2.5'
>>> MongoReplicaSetClient('hq-sre-mongodb-01.eng.nutanix.com', replicaSet='rs0')
MongoReplicaSetClient([u'sv2-sre-mongodb-03:27017', u'hq-sre-mongodb-01:27017', u'sv2-sre-mongodb-01:27017', u'sv2-sre-mongodb-02:27017', u'hq-sre-mongodb-02:27017'])

芒果2.6.3试验

1)使用主机名连接到副本集(按预期中断)

代码语言:javascript
复制
>>> pymongo.version
'2.6.3'
>>> MongoReplicaSetClient('hq-sre-mongodb-01', replicaSet='rs0')
  Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_replica_set_client.py", line 745, in __init__
        raise ConnectionFailure(str(e))
  pymongo.errors.ConnectionFailure: hq-sre-mongodb-01:27017: [Errno -2] Name or service not known

2)使用FQDN连接到副本集(返回一个空集)

代码语言:javascript
复制
>>> pymongo.version
'2.6.3'
>>> MongoReplicaSetClient('hq-sre-mongodb-01.eng.nutanix.com', replicaSet='rs0')
MongoReplicaSetClient([])

确认

您可以看到,一旦本地主机可以通过主机名解决问题,2.6.3中就不再存在这个问题了。就好像MongoReplicaSetClient不知道如何处理FQDN一样。

1)确认远程主机名解析

代码语言:javascript
复制
05:33:32 [js-dev][501]$ ping -c3 hq-sre-mongodb-01
PING hq-sre-mongodb-01.eng.nutanix.com (10.1.56.11) 56(84) bytes of data.
64 bytes from hq-sre-mongodb-01.eng.nutanix.com (10.1.56.11): icmp_req=1 ttl=63 time=0.263 ms
64 bytes from hq-sre-mongodb-01.eng.nutanix.com (10.1.56.11): icmp_req=2 ttl=63 time=0.259 ms
64 bytes from hq-sre-mongodb-01.eng.nutanix.com (10.1.56.11): icmp_req=3 ttl=63 time=0.281 ms

05:33:36 [js-dev][502]$ ping -c3 hq-sre-mongodb-01.eng.nutanix.com
PING hq-sre-mongodb-01.eng.nutanix.com (10.1.56.11) 56(84) bytes of data.
64 bytes from hq-sre-mongodb-01.eng.nutanix.com (10.1.56.11): icmp_req=1 ttl=63 time=0.154 ms
64 bytes from hq-sre-mongodb-01.eng.nutanix.com (10.1.56.11): icmp_req=2 ttl=63 time=0.256 ms
64 bytes from hq-sre-mongodb-01.eng.nutanix.com (10.1.56.11): icmp_req=3 ttl=63 time=0.275 ms

2)使用主机名和FQDN确认MongoReplicaSetClient连接

代码语言:javascript
复制
>>> pymongo.version
'2.6.3'
>>> MongoReplicaSetClient('hq-sre-mongodb-01', replicaSet='rs0')
MongoReplicaSetClient([u'sv2-sre-mongodb-03:27017', 'hq-sre-mongodb-01:27017', u'sv2-sre-mongodb-01:27017', u'sv2-sre-mongodb-02:27017', u'hq-sre-mongodb-02:27017'])
>>> MongoReplicaSetClient('hq-sre-mongodb-01.eng.nutanix.com', replicaSet='rs0')
MongoReplicaSetClient([u'sv2-sre-mongodb-03:27017', u'hq-sre-mongodb-01:27017', u'sv2-sre-mongodb-01:27017', u'sv2-sre-mongodb-02:27017', u'hq-sre-mongodb-02:27017'])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-05 23:09:58

这是一个PyMongo错误。我已经在PYTHON-608中报告了它,并将在大约一个月后发布的下一个版本PyMongo 2.7中修复它。

您在PyMongo 2.5中看到的行为是错误的: MongoReplicaSetClient连接到您提供的成员的FQDN,但实际上无法从复制集配置中使用其主机名联系到该成员。自动重新连接、故障转移和读取首选项无法工作,因此客户端应该引发一个错误,而不是允许您继续操作。

显然,PyMongo 2.6.3的行为也是错误的。在2.6.3中,客户端知道它无法使用它发现的主机名到达任何成员,但它没有引发错误。相反,它允许您创建不可用的客户端。正确的行为是,如果无法从客户端访问复制集配置中的任何主机名,则会引发错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20203863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档