我在尝试连接到远程副本集时遇到MongoReplicaClient问题。出于某种原因,MongoReplicaSetClient只是为我本地主机上没有的任何副本集返回一个空集。奇怪的是MongoClient工作得很好。我不确定如何进一步调试它,因为它无论如何都没有错误。由于通过MongoClient连接工作正常,因此似乎排除了网络连接。有谁知道为什么会发生这种情况?
经过进一步调查后,当本地主机无法解析远程主机名而不使用它的FQDN时,此问题似乎会影响Pymongo 2.6.3。问题是如果在这种情况下向MongoReplicaSetClient提供FQDN,它将只返回一个空集。以下是我如何重现这个问题:
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)确认远程主机名无法解析
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
1)使用主机名(按预期中断)
连接到副本集>>> 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)
连接到副本集>>> 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'])
1)使用主机名(按预期中断)
连接到副本集>>> 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连接到副本集(返回空集)
>>> pymongo.version
'2.6.3'
>>> MongoReplicaSetClient('hq-sre-mongodb-01.eng.nutanix.com', replicaSet='rs0')
MongoReplicaSetClient([])
您可以看到,一旦localhost可以通过主机名解析,问题就不会再出现在2.6.3中了。它几乎就像MongoReplicaSetClient不知道如何处理FQDN一样。
1)确认远程主机名解析
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)使用hostname和FQDN
确认MongoReplicaSetClient连接>>> 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'])
答案 0 :(得分:2)
这是一个PyMongo错误。我已经在PYTHON-608中报告了这一点,并且我将在下一个版本的PyMongo 2.7版本中修复它,该版本将在一个月左右发布。
您在PyMongo 2.5中看到的行为是错误的:MongoReplicaSetClient连接到您提供的成员的FQDN,但该成员实际上无法使用其副本集配置中的主机名进行访问。自动重新连接,故障转移和阅读首选项不起作用,因此客户端应该提出错误而不是让您继续。
显然,PyMongo 2.6.3的行为也是错误的。在2.6.3中,客户知道它无法使用它发现的主机名到达任何成员,但它没有引发错误。相反,它允许您创建一个不可用的客户端。如果副本集配置中的所有主机名都不能从客户端访问,则正确的行为是引发错误。
答案 1 :(得分:0)
这似乎与mongod节点之间的网络问题有关。如果您的主机遇到DNS问题且星星对齐,您可能会看到此问题。在我的测试中,我看到MongoReplicaSetClient返回一个空列表,如果主机名和FQDN都无法访问所有节点。但是,在运行几个测试场景后,我无法可靠地重现该问题,所以我将关闭它。如果您遇到这种情况,请确保与您的mongod节点的DNS连接功能完全正常,您应该全部设置。