【问题标题】:MongoReplicationSetClient returns an empty set in pymongo 2.6.3MongoReplicationSetClient 在 pymongo 2.6.3 中返回一个空集
【发布时间】:2013-11-25 21:37:03
【问题描述】:

我在尝试连接到远程副本集时遇到了 MongoReplicaClient 的问题。出于某种原因,MongoReplicaSetClient 只是为不在我的本地主机上的任何副本集返回一个空集。奇怪的是 MongoClient 工作正常。我不确定如何进一步调试它,因为它无论如何都不会出错。由于通过 MongoClient 连接工作正常,因此似乎排除了网络连接。有谁知道为什么会发生这种情况?

[更新]

经过进一步调查,当本地主机在不使用其 FQDN 的情况下无法解析远程主机名时,此问题似乎会影响 Pymongo 2.6.3。问题是,如果在这种情况下将 FQDN 提供给 MongoReplicaSetClient,它只会返回一个空集。以下是我重现问题的方式:

环境

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

在 pymongo 2.5 上测试

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'])

在 pymongo 2.6.3 上测试

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) 使用主机名和 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'])

【问题讨论】:

  • 请提供可重现的示例,包括 rs 成员配置。
  • @zero323 看起来这只是 2.6.3 中的问题。我用我的发现更新了问题
  • 我试过了,但我无法用 2.6.3 重现它
  • 奇怪。也许它是一个与环境相关的问题。 @zero323 您尝试在哪种盒子上进行复制?我用我的设置的一些细节更新了这个问题。
  • db.serverBuildInfo() { "version" : "2.4.5", "gitVersion" : "nogitversion", "sysInfo" : "Linux bob 3.9-1-amd64 #1 SMP Debian 3.9.8-1 x86_64 BOOST_LIB_VERSION=1_49", "loaderFlags" : "-fPIC -pthread -rdynamic", "compilerFlags" : "-Wnon-virtual-dtor -Woverloaded-virtual -fPIC -fno-strict-aliasing -ggdb -pthread -Wall -Wsign-compare -Wno-unknown-pragmas -Winvalid-pch -Werror -pipe -fno-builtin-memcmp -O3", "allocator" : "tcmalloc", "versionArray" : [ 2, 4, 5, 0 ], "javascriptEngine" : "V8", "bits" : 64, "debug" : false, "maxBsonObjectSize" : 16777216, "ok" : 1 }

标签: mongodb pymongo replicaset


【解决方案1】:

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

您在 PyMongo 2.5 中看到的行为是错误的:MongoReplicaSetClient 连接到您提供的成员的 FQDN,但使用副本集配置中的主机名实际上无法访问该成员。自动重新连接、故障转移和读取首选项不起作用,因此客户端应该提出错误而不是允许您继续。

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

【讨论】:

    【解决方案2】:

    这似乎与 mongod 节点之间的网络问题有关。如果您的主机有 DNS 问题并且星号对齐,您可能会看到此问题。在我的测试中,如果主机名和 FQDN 都无法访问所有节点,我已经看到 MongoReplicaSetClient 返回一个空列表。但是,在运行了一些测试场景后,我无法可靠地重现该问题,因此我将关闭它。如果您遇到这种情况,请确保与您的 mongod 节点的 DNS 连接功能完全正常,您应该已准备就绪。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 2023-04-01
      • 1970-01-01
      • 2011-04-24
      相关资源
      最近更新 更多