web-dev-qa-db-ja.com

PyMongo 3でServerSelectionTimeoutErrorが発生するのはなぜですか?

私は使用しています:

  • Python 3.4.2
  • PyMongo 3.0.2
  • mongodlab 2.6.9を実行しているmongolab
  • uWSGI 2.0.10
  • CherryPy 3.7.0
  • nginx 1.6.2

uWSGI開始パラメーター:

_--socket 127.0.0.1:8081 --daemonize --enable-threads --threads 2 --processes 2
_

MongoClientを1回セットアップしました。

_self.mongo_client = MongoClient('mongodb://user:[email protected]:port/mydb')
self.db = self.mongo_client['mydb']
_

JSON dictをMongoDBに保存してみます:

_result = self.db.jobs.insert_one(job_dict)
_

Mongodbへの同じコードパスを実行する単体テストを介して動作します。ただし、HTTP POSTを使用してCherryPyおよびuWSGIで実行すると、次のようになります。

_pymongo.errors.ServerSelectionTimeoutError: No servers found yet
_

CherryPyおよびuWSGIを介して実行すると、なぜこの動作が見られますか?これはおそらくPyMongo 3の新しいスレッドモデルですか?

更新:

CherryPy組み込みサーバーを使用してuWSGIとnginxなしで実行すると、insert_one()が機能します。

更新1/25 EST 4:53 pm:

PyMongoにデバッグを追加した後、topology._update_servers()は、サーバー 'myserver-a.mongolab.com'のserver_type = 2を知っているようです。ただし、server_description.known_servers()のサーバー 'myserver.mongolab.com'のserver_type = 0があります

これにより、次のスタックトレースが発生します。

_result = self.db.jobs.insert_one(job_dict)
File "/usr/local/lib/python3.4/site-packages/pymongo/collection.py", line 466, in insert_one
with self._socket_for_writes() as sock_info:
File "/usr/local/lib/python3.4/contextlib.py", line 59, in __enter__
return next(self.gen)
File "/usr/local/lib/python3.4/site-packages/pymongo/mongo_client.py", line 663, in _get_socket
server = self._get_topology().select_server(selector)
File "/usr/local/lib/python3.4/site-packages/pymongo/topology.py", line 121, in select_server
address))
File "/usr/local/lib/python3.4/site-packages/pymongo/topology.py", line 97, in select_servers
self._error_message(selector))
pymongo.errors.ServerSelectionTimeoutError: No servers found yet
_
33
drfence

PYTHON-961 で追跡されているこの問題を調査しています。 MongoClientのインスタンスを作成するときにconnect = Falseを渡すことで、この問題を回避できる場合があります。これは、最初のデータベース操作が試行されるまでバックグラウンド接続を延期し、MongoClientのモニタースレッドのスピンアップとマルチプロセスフォークとの間の競合状態を回避します。

40
Bernie Hackett

Pymongo 3.0から2.8にダウングレードして、自分で修正しました。何が起こっているのか分かりません。

   flask/bin/pip uninstall pymongo
   flask/bin/pip install pymongo==2.8
9
Greg

Pymongo 3.5でも同じ問題がありました。localhostを127.0.0.1に置き換えるか、mongodbインスタンスの対応するIPアドレスで問題が解決します。

4
Raj

AWS Cloudサービスと組み合わせたMongoDBを使用しているかどうかはわかりません。しかし、そうであれば、MongoDBにアクセスさせるIPアドレスを指定する必要があることがわかりました。

そのため、ホストサーバーのIPアドレスを追加してエントリを許可する必要があります。

MongoAtlasでは、このページでこれを行うことができます enter image description here

同じ問題の解決策がすでにあったことは知っていますが、自分の状況に役立つ解決策が見つからなかったので、これを投稿したいと思いました。

3
cruise_lab

私もこれに遭遇しました。

これは、 pymongo3はフォークセーフではない が原因である可能性があります。

これを修正するには、--lazy-apps paramをuwsgiに追加します。これにより、「フォークセーフ」問題を回避できます。

uwsgi doc preforking-vs-lazy-apps-vs-lazy を参照してください。

この2つが確実に接続されているかどうかはわかりません。

0
zephor

私は同じ問題に遭遇し、最終的にクライアントIPがmongoサーバーのファイアウォールによってブロックされていることを発見しました。

0
Joe Cheng

私はpymongo 3.2を使用していますが、同じエラーに遭遇しましたが、私の場合は設定ミスでした。許可を有効にした後、接続のタイムアウトになるURLのポートを更新するのを忘れました。通常、アプリケーションデータを格納するデータベースとは異なるため、?authSourceが必要になる可能性があることに言及する価値があります。

0
user2944582

Dnspythonをインストールしてこれを解決しました(pip install dnspython)。問題は、「mongodb + srv:// URIを使用するには「dnspython」モジュールをインストールする必要がある」ということです。

0
ttfreeman

サーバーのIPアドレスをmongod.confファイルに追加してみてください。 linux(ubuntu)osを使用している場合、私の解決策を試すことができます:

  1. mongod.confファイルを変更します。

    vi /etc/mongod.conf
    

    127.0.0.1の後ろにmongodbサーバーのIPアドレスを追加して保存できます。

    net:
      port:27017
      bindIp:127.0.0.1,mongodb server ip
    
  2. 最終的に:

    Sudo service mongod restart

これで、pymongo MongoClientを使用してmongodbの接続を試みることができます。

0
Patrick Chen

バックグラウンドで実行されているMongoDBサーバーがないため、このエラーが発生しました。 MongoDBサーバーを実行するには、cmdまたはanacondaプロンプトを開き、次のように入力します-

"C:\Program Files\MongoDB\Server\3.6\bin\mongod.exe"

その後、実行します

import pymongo
myclient = pymongo.MongoClient()    
mydb = myclient["mydatabase"]
myclient.list_database_names()
0
Adil