web-dev-qa-db-fra.com

Pourquoi PyMongo 3 donne-t-il ServerSelectionTimeoutError?

J'utilise:

  • Python 3.4.2
  • PyMongo 3.0.2
  • mongolab en cours d'exécution Mongod 2.6.9
  • uWSGI 2.0.10
  • CherryPy 3.7.0
  • nginx 1.6.2

paramètres de démarrage uWSGI:

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

J'ai configuré mon temps MongoClient ONE:

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

J'essaie de sauvegarder un dict JSON sur MongoDB:

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

Cela fonctionne via un test unitaire qui exécute le même chemin de code que mongodb. Cependant, lorsque j'exécute via CherryPy et uWSGI à l'aide d'un HTTP POST, je reçois ceci:

pymongo.errors.ServerSelectionTimeoutError: No servers found yet

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

Mettre à jour:

Si je cours sans uWSGI et nginx en utilisant le serveur intégré CherryPy, la fonction insert_one() fonctionne.

Mise à jour 1/25 16h53 HNE:

Après avoir ajouté un débogage dans PyMongo, il apparaît que topology._update_servers() sait que le type de serveur = 2 pour le serveur 'myserver-a.mongolab.com'. Cependant server_description.known_servers() a le type_serveur = 0 pour le serveur 'myserver.mongolab.com'

Cela conduit à 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
32
drfence

Nous étudions ce problème, suivi dans PYTHON-961 . Vous pourrez peut-être contourner le problème en passant connect = False lors de la création d'instances de MongoClient. Cela retarde la connexion en arrière-plan jusqu'à la tentative de la première opération de base de données, évitant ainsi ce que je soupçonne être une condition de concurrence critique entre la rotation du thread de moniteur de MongoClient et le forking multiprocess. 

37
Bernie Hackett

Je l'ai corrigé pour moi-même en rétrogradant 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
Greg

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
Raj

J'ai rencontré cela aussi.

Cela pourrait être dû à pymongo3 n'est pas sûr pour la fourche .

Je résous ce problème en ajoutant --lazy-apps param à uwsgi, ce qui peut éviter le problème du "fork safe".

voir uwsgi doc preforking-vs-lazy-apps-vs-lazy .

Remarquez, pas sûr que ces deux-là aient une connexion positive.

0
zephor

Je ne sais pas si vous utilisez MongoDB associé au service AWS Cloud. Mais si vous l’êtes, j’ai constaté que vous deviez spécifier l’adresse IP à laquelle vous souhaitez que MongoDB ait accès. 

Vous devez donc ajouter l'adresse IP de votre serveur hôte pour permettre la saisie.

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

Je sais qu'il existe déjà une solution au même problème, mais je n'ai pas trouvé de solution qui aurait aidé ma situation. Je voulais donc l'afficher pour que les autres puissent en bénéficier s'ils rencontraient le même problème que moi. 

0
cruise_lab
  • Commencez par configurer l'environnement MongoDB.

  • Exécuter ceci sur CMD - "C:\Program Files\MongoDB\Serveur\3.6\bin\mongod.exe"

  • Ouvrez un autre CMD et lancez ceci - "C:\Program Files\MongoDB\Server\3.6\bin\mongo.exe"

Et ensuite, vous pouvez utiliser pymongo [Invite anaconda]

import pymongo
from pymongo import MongoClient

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

Référez-vous - https://docs.mongodb.com/tutorials/install-mongodb-on-windows/

0
Vaishnavi Bala

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

0
Joe Cheng

J'utilise pymongo 3.2 et je rencontre la même erreur, mais il s'agissait d'une configuration erronée dans mon cas. Après avoir activé l'autorisation, j'ai oublié de mettre à jour le port dans l'URL qui s'est retrouvée dans un délai d'attente de connexion. Il est probablement utile de mentionner que? AuthSource peut être requis car il est généralement différent de la base de données stockant les données de l’application.

0
user2944582

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

  1. modifier le fichier mongod.conf:

    vi /etc/mongod.conf
    

    et vous pouvez ajouter l'adresse IP du serveur mongodb après 127.0.0.1 et enregistrer:

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

    Sudo service mongod restart

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

0
Patrick Chen

Cette erreur s'est produite car aucun serveur MongoDB ne s'exécute en arrière-plan. Pour exécuter le serveur MongoDB, ouvrez l'invite cmd ou anaconda et tapez ceci: -

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

puis courir

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