Pourquoi PyMongo 3 donne Serverselection Timeouterror?

j'utilise:

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

uWSGI start params:

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

j'ai paramétré mon MongoClient:

self.mongo_client = MongoClient('mongodb://user:pw@host.mongolab.com:port/mydb')
self.db = self.mongo_client['mydb']

j'essaie de l'enregistrer au format JSON dict pour MongoDB:

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

il fonctionne via un test unitaire qui exécute le même chemin de code vers mongodb. Cependant, lorsque J'exécute via CherryPy et uWSGI en utilisant un post HTTP, j'obtiens ceci:

pymongo.errors.ServerSelectionTimeoutError: No servers found yet

Pourquoi est-ce que je vois ce comportement quand il est exécuté via CherryPy et uWSGI? Est-ce peut-être le nouveau modèle de fil dans PyMongo 3?

mise à Jour:

si j'exécute sans uWSGI et nginx en utilisant le serveur intégré CherryPy, le insert_one() fonctionne.

Update 1/25 4: 53pm EST:

après avoir ajouté un peu de debug dans PyMongo, il semble que topology._update_servers() sait que le server_type = 2 pour le serveur 'myserver-a.mongolab.com". However server_description.known_servers() a la type_serveur = 0 pour le serveur "myserver.mongolab.com'

ceci mène à la trace de pile suivante:

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
28
demandé sur drfence 2015-06-24 18:11:20

10 réponses

nous enquêtons sur ce problème, traqué en PYTHON-961. Vous pouvez peut-être contourner le problème en passant connexion=False lors de la création d'instances de MongoClient. Cela reporte la connexion de fond jusqu'à ce que la première opération de la base de données soit tentée, en évitant ce que je soupçonne être une condition de course entre le spin up du moniteur de MongoClient et la fourche multiprocess.

29
répondu Bernie Hackett 2015-07-02 21:31:45

je me suis arrangé en déclassant de pymongo 3.0 à 2.8. Aucune idée de ce qui se passe.

   flask/bin/pip uninstall pymongo
   flask/bin/pip install pymongo==2.8
10
répondu Greg 2015-07-01 14:47:11

j'ai eu le même problème avec Pymongo 3.5 Il s'avère que remplacer localhost par 127.0.0.1 ou l'adresse ip correspondante de votre instance mongodb résout le problème.

4
répondu Raj 2017-09-17 15:15:25

j'ai rencontré le même problème et finalement j'ai trouvé que l'adresse IP du client est bloquée par le pare-feu du serveur mongo.

0
répondu Joe Cheng 2016-07-27 07:11:14

I found this too.

Cela pourrait être dû à pymongo3 n'est pas de la fourche de sécurité.

je corrige cela en ajoutant --lazy-apps param à uwsgi, cela peut éviter le problème de "sécurité à la fourche".

voir uWSGI doc préforking-vs-lazy-apps-vs-lazy.

Avis, aucune de ces deux positives de connexion.

0
répondu zephor 2016-12-28 10:02:26
  • première installation de L'environnement MongoDB.

  • Run this on CMD - "C:\Program fichiers\MongoDB\Server\3.6\bin\mongod.exe"!--4-->

  • ouvrez un autre CMD et lancez ceci - "C:\Program fichiers\MongoDB\Server\3.6\bin\mongo.exe"!--5-->

Et puis vous pouvez utiliser pymongo [anaconda invite]

import pymongo
from pymongo import MongoClient

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

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

0
répondu Vaishnavi Bala 2018-05-29 05:34:21

Je ne suis pas sûr que vous utilisiez le MongoDB jumelé avec AWS Cloud service. Mais si vous l'êtes, j'ai trouvé que vous devez spécifier l'Adresse IP que vous souhaitez MongoDB avoir accès.

Donc ce que vous devez faire est d'ajouter l'Adresse IP de votre serveur hôte pour permettre l'entrée.

en MongoAtlas, cela peut être fait à cette page enter image description here

je sais qu'il y avait déjà une solution au même problème, mais je n'ai pas trouvé de solution qui a aidé mon situation, donc je voulais poster ceci, pour que d'autres puissent en profiter s'ils font face au même problème que moi.

0
répondu cruise_lab 2018-05-30 01:59:39

peut-être que vous pouvez essayer d'ajouter votre adresse ip de serveur dans le mongod.fichier conf. si vous utilisez linux(ubuntu) os,vous pouvez essayer ma solution:

  1. modifier mongod.fichier conf:

    vi /etc/mongod.conf
    

    et vous pouvez ajouter mongodb adresse ip du serveur derrière 127.0.0.1,et enregistrer:

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

    sudo service mongod restart

Maintenant, vous pouvez essayer de connecter mongodb en utilisant pymongo MongoClient.

0
répondu Patrick Chen 2018-07-24 03:42:20

Ce problème a été corrigé dans PyMongo pull_request.

-1
répondu thylong 2016-03-16 17:16:23

Si cela peut aider, j'ai résolu remplacer par :

from flask.ext.mongoengine import MongoEngine

par :

from flask_mongoengine import MongoEngine
-1
répondu Thxer 2018-06-29 09:00:56