1

リモート レプリカ セットに接続しようとしているときに、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'])
4

2 に答える 2

2

これは PyMongo のバグです。PYTHON-608で報告しましたが、約 1 か月後にリリースされる PyMongo の次のリリースであるバージョン 2.7 で修正します。

PyMongo 2.5 で見られた動作にはバグがありました。MongoReplicaSetClient は、指定したメンバーの FQDN に接続しましたが、レプリカ セット構成からのホスト名を使用してメンバーに実際に到達することはできませんでした。自動再接続、フェイルオーバー、および読み取り設定は機能しないため、クライアントは続行を許可する代わりにエラーを発生させる必要がありました。

PyMongo 2.6.3 の動作にも明らかにバグがあります。2.6.3 では、クライアントは発見したホスト名を使用してどのメンバーにも到達できないことを認識していましたが、エラーは発生しませんでした。代わりに、使用できないクライアントを作成することができました。正しい動作は、レプリカ セット構成内のどのホスト名にもクライアントから到達できない場合にエラーを発生させることです。

于 2013-12-05T23:09:58.513 に答える