webentwicklung-frage-antwort-db.com.de

Warum gibt PyMongo 3 ServerSelectionTimeoutError an?

Ich benutze:

  • Python 3.4.2
  • PyMongo 3.0.2
  • mongolab laufender mongod 2.6.9
  • uWSGI 2.0.10
  • CherryPy 3.7.0
  • nginx 1.6.2

uWSGI-Startparameter:

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

Ich habe meinen MongoClient EINE Zeit eingerichtet:

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

Ich versuche, ein JSON-Diktat in MongoDB zu speichern:

result = self.db.jobs.insert_one(job_dict)

Es funktioniert über einen Komponententest, der denselben Codepfad wie Mongodb ausführt. Wenn ich jedoch über CherryPy und uWSGI mit einem HTTP-POST ausführe, erhalte ich Folgendes:

pymongo.errors.ServerSelectionTimeoutError: No servers found yet

Warum sehe ich dieses Verhalten, wenn es über CherryPy und uWSGI läuft? Ist das vielleicht das neue Thread-Modell in PyMongo 3?

Update:

Wenn ich ohne uWSGI und nginx mit dem integrierten CherryPy-Server laufe, funktioniert insert_one().

Update 1/25 16:53 Uhr EST:

Nachdem Sie in PyMongo Debuggen hinzugefügt haben, scheint topology._update_servers() zu wissen, dass server_type = 2 für Server 'myserver-a.mongolab.com' ist. server_description.known_servers() hat jedoch den server_type = 0 für den Server 'myserver.mongolab.com'

Dies führt zu der folgenden Stapelverfolgung:

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
32
drfence

Wir untersuchen dieses Problem in PYTHON-961 . Möglicherweise können Sie das Problem umgehen, indem Sie connect = False übergeben, wenn Sie MongoClient-Instanzen erstellen. Dies verzögert die Hintergrundverbindung, bis die erste Datenbankoperation versucht wird, und vermeidet, was ich vermute, eine Race-Bedingung zwischen dem Einschalten des Monitor-Threads von MongoClient und der Multiprozess-Gabelung. 

37
Bernie Hackett

Ich habe das Problem behoben, indem ich von Pymongo 3.0 auf 2.8 heruntergestuft wurde. Keine Ahnung was los ist.

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

Ich hatte das gleiche Problem mit Pymongo 3.5 Erweist sich, das Ersetzen von localhost durch 127.0.0.1 oder die entsprechende IP-Adresse Ihrer mongodb-Instanz löst das Problem.

4
Raj

Ich bin auch dem begegnet.

Das könnte daran liegen, dass pymongo3 nicht gabelsicher ist .

Ich behebe das, indem ich --lazy-apps param zu uwsgi hinzufüge. Dadurch kann das Problem "Fork Safe" vermieden werden.

sehen Sie sich uwsgi doc preforking-vs-lazy-apps-vs-lazy an.

Beachten Sie, dass diese beiden Verbindungen nicht sicher sind.

0
zephor

Ich bin nicht sicher, ob Sie die MongoDB mit dem AWS Cloud-Dienst verwenden. Wenn ja, habe ich festgestellt, dass Sie angeben müssen, auf welche IP-Adresse MongoDB Zugriff haben soll. 

Sie müssen also die IP-Adresse Ihres Host-Servers hinzufügen, um die Eingabe zu ermöglichen.

In MongoAtlas kann dies auf dieser Seite erfolgen  enter image description here

Ich weiß, dass es bereits eine Lösung für dasselbe Problem gab, aber ich habe keine Lösung gefunden, die meiner Situation geholfen hat. Deshalb wollte ich dies hier posten, sodass andere davon profitieren könnten, wenn sie das gleiche Problem wie ich haben. 

0
cruise_lab
  • Richten Sie zuerst die MongoDB-Umgebung ein.

  • Führen Sie dies auf CMD aus - "C:\Programme\MongoDB\Server\3.6\bin\mongod.exe"

  • Öffnen Sie eine andere CMD und führen Sie diese aus: "C:\Programme\MongoDB\Server\3.6\bin\mongo.exe".

Und dann können Sie pymongo [Anaconda Prompt] verwenden

import pymongo
from pymongo import MongoClient

client = MongoClient()
db = client.test_db
collection = db['test_coll']

Siehe - https://docs.mongodb.com/tutorials/install-mongodb-on-windows/

0
Vaishnavi Bala

Ich bin auf das gleiche Problem gestoßen und habe schließlich festgestellt, dass die Client-IP von der Firewall des Mongo-Servers blockiert wird.

0
Joe Cheng

Ich verwende Pymongo 3.2 und stolperte in denselben Fehler. In meinem Fall war dies jedoch eine Fehlkonfiguration. Nach der Aktivierung der Autorisierung habe ich vergessen, den Port in der URL zu aktualisieren, was zu einem Verbindungs-Timeout führte. Wahrscheinlich ist es erwähnenswert, dass authSource erforderlich ist, da es sich normalerweise von der Datenbank unterscheidet, in der die Anwendungsdaten gespeichert sind.

0
user2944582

Ich habe dies durch die Installation von dnspython (pip install dnspython) gelöst. Das Problem ist, dass: "Das" dnspython "-Modul muss installiert sein, um mongodb + srv: // URIs zu verwenden."

0
ttfreeman

vielleicht können Sie versuchen, Ihre Server-IP-Adresse in die Datei mongod.conf aufzunehmen. Wenn Sie linux (ubuntu) os verwenden, können Sie meine Lösung ausprobieren:

  1. mongod.conf Datei ändern:

    vi /etc/mongod.conf
    

    und Sie können die mongodb-Server-IP-Adresse hinter 127.0.0.1 hinzufügen und speichern:

    net:
      port:27017
      bindIp:127.0.0.1,mongodb server ip
    
  2. im teminal:

    Sudo service mongod restart

Jetzt können Sie versuchen, Mongodb mit Pymongo MongoClient zu verbinden.

0
Patrick Chen

Dieser Fehler ist aufgetreten, weil im Hintergrund kein MongoDB-Server ausgeführt wird. Um den MongoDB-Server auszuführen, öffnen Sie cmd oder anaconda Prompt und geben Sie Folgendes ein: -

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

dann renne

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