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
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.
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
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.
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.
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.
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/
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
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.
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:
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
dans le teminal:
sudo service mongod restart
Maintenant, vous pouvez essayer de connecter mongodb en utilisant pymongo MongoClient.
Si cela peut aider, j'ai résolu remplacer par :
from flask.ext.mongoengine import MongoEngine
par :
from flask_mongoengine import MongoEngine