Почему PyMongo 3 дает ServerSelectionTimeoutError?
я использую:
uwsgi start params:
--socket 127.0.0.1:8081 --daemonize --enable-threads --threads 2 --processes 2
я настраиваю свой MongoClient один раз:
self.mongo_client = MongoClient('mongodb://user:pw@host.mongolab.com:port/mydb')
self.db = self.mongo_client['mydb']
Я пытаюсь сохранить JSON dict в MongoDB:
result = self.db.jobs.insert_one(job_dict)
он работает через модульный тест, который выполняет тот же путь кода к в MongoDB. Однако, когда я выполняю через CherryPy и uWSGI, используя HTTP-сообщение, я получаю следующее:
pymongo.errors.ServerSelectionTimeoutError: No servers found yet
почему я вижу это поведение при запуске через CherryPy и uWSGI? Возможно, это новая модель потока в PyMongo 3?
обновление:
если я запускаю без uWSGI и nginx с помощью встроенного сервера CherryPy,insert_one()
строительство.
обновление 1/25 4: 53pm EST:
после добавления некоторой отладки в PyMongo, это оказывается, что topology._update_servers()
знает, что server_type = 2 для сервера myserver-a.mongolab.com'. Однако server_description.known_servers()
имеет server_type = 0 для сервера 'myserver.mongolab.com'
это приводит к следующей трассировке стека:
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 ответов
мы расследуем эту проблему, отслеживается в PYTHON-961. Возможно, вы сможете обойти проблему, передав connect=False при создании экземпляров MongoClient. Это откладывает фоновое соединение, пока не будет предпринята первая операция базы данных, избегая того, что я подозреваю, является условием гонки между вращением потока монитора MongoClient и многопроцессорным разветвлением.
я исправил это для себя, понизив рейтинг с pymongo 3.0 до 2.8. Понятия не имею, что происходит.
flask/bin/pip uninstall pymongo
flask/bin/pip install pymongo==2.8
У меня была такая же проблема с Pymongo 3.5 Оказывается, замена localhost на 127.0.0.1 или соответствующий ip-адрес вашего экземпляра mongodb решает проблему.
Я столкнулся с той же проблемой, и, наконец, я обнаружил, что IP-адрес клиента заблокирован брандмауэром сервера mongo.
Я тоже столкнулся с этим.
Это может быть из-за pymongo3 не вилка безопасной.
я исправляю это, добавляя --lazy-apps
param к uwsgi, это может избежать проблемы "вилки безопасной".
видеть uwsgi doc preforking-против-ленивый-приложения-против-лень.
обратите внимание, не уверен, что эти два имеют положительную связь.
сначала настройте среду MongoDB.
запустите это на CMD - "C:\Program файлы\MongoDB\Server\3.6\bin\mongod.EXE-файл"
- откройте другой CMD и запустите это ... "C:\Program файлы\MongoDB\Server\3.6\bin\mongo.EXE-файл"
и тогда вы можете использовать pymongo [анаконда подсказка]
import pymongo
from pymongo import MongoClient
client = MongoClient()
db = client.test_db
collection = db['test_coll']
см - https://docs.mongodb.com/tutorials/install-mongodb-on-windows/
Я не уверен, что вы используете MongoDB в паре с облачным сервисом AWS. Но если это так, я обнаружил, что вы должны указать, к какому IP-адресу вы хотите, чтобы MongoDB имел доступ.
поэтому вам нужно добавить IP-адрес вашего хост-сервера, чтобы разрешить вход.
в MongoAtlas это можно сделать на этой странице
Я знаю, что уже было решение той же проблемы, но я не нашел решения, которое помогло моей ситуации, так хотел опубликовать это, чтобы другие могли извлечь выгоду, если они когда-нибудь столкнутся с той же проблемой, что и я.
возможно, вы можете попробовать добавить свой ip-адрес сервера в mongod.файл conf. если вы используете ОС linux(ubuntu), вы можете попробовать мое решение:
-
изменить команду mongod.файл conf:
vi /etc/mongod.conf
и вы можете добавить IP-адрес сервера mongodb за 127.0.0.1 и сохранить:
net: port:27017 bindIp:127.0.0.1,mongodb server ip
-
в теминал:
sudo service mongod restart
Теперь вы можете попробовать подключить mongodb с помощью Pymongo MongoClient.
Если это может помочь, я решил заменить:
from flask.ext.mongoengine import MongoEngine
by:
from flask_mongoengine import MongoEngine