Почему PyMongo 3 дает ServerSelectionTimeoutError?
Я использую:
- Python 3.4.2
- PyMongo 3.0.2
- mongolab running mongod 2.6.9
- uWSGI 2.0.10
- CherryPy 3.7.0
- nginx 1.6.2
Начальные параметры uWSGI:
--socket 127.0.0.1:8081 --daemonize --enable-threads --threads 2 --processes 2
Я устанавливаю свой MongoClient ONE:
self.mongo_client = MongoClient('mongodb://user:[email protected]:port/mydb')
self.db = self.mongo_client['mydb']
Я пытаюсь сохранить JSON-dict в MongoDB:
result = self.db.jobs.insert_one(job_dict)
Он работает через unit test, который выполняет тот же путь кода к mongodb. Однако, когда я выполняю через CherryPy и uWSGI с помощью HTTP POST, я получаю следующее:
pymongo.errors.ServerSelectionTimeoutError: No servers found yet
Почему я вижу это поведение при запуске через CherryPy и uWSGI? Возможно, это новая модель потока в PyMongo 3?
Update:
Если я запускаю без uWSGI и nginx с помощью встроенного сервера CherryPy, работает insert_one()
.
Обновление 1/25 4:53 вечера 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
Ответы
Ответ 1
Мы исследуем эту проблему, отслеживаем ее в PYTHON-961. Вы можете обойти проблему, передав connect = False при создании экземпляров MongoClient. Это предотвращает фоновое соединение до тех пор, пока не будет предпринята попытка первой операции с базой данных, избегая того, что, как я подозреваю, является условием гонки между раскручиванием потока монитора MongoClient и многопроцессорным форсированием.
Ответ 2
Я исправил это для себя, понизив с pymongo 3.0 до 2.8. Не знаю, что происходит.
flask/bin/pip uninstall pymongo
flask/bin/pip install pymongo==2.8
Ответ 3
У меня была такая же проблема с Pymongo 3.5
Оказывается, замена localhost на 127.0.0.1 или соответствующий ip-адрес вашего экземпляра mongodb решает проблему.
Ответ 4
Я не уверен, что вы используете MongoDB в паре с облачным сервисом AWS. Но если это так, я обнаружил, что вам нужно указать, к какому IP-адресу вы хотите иметь доступ MongoDB.
Итак, что вам нужно сделать, это добавить IP-адрес вашего хост-сервера, чтобы разрешить вход.
В MongoAtlas это можно сделать на этой странице ![enter image description here]()
Я знаю, что уже было решение той же проблемы, но я не нашел решения, которое помогло бы моей ситуации, поэтому хотел опубликовать это, чтобы другие могли извлечь выгоду, если они когда-либо столкнутся с той же проблемой, что и я.
Ответ 5
Я столкнулся с той же проблемой, и, наконец, я обнаружил, что IP-адрес клиента блокируется брандмауэром сервера mongo.
Ответ 6
Я тоже это обнаружил.
Это может быть связано с pymongo3 не является безопасным для вилки.
Я исправлю это, добавив параметр --lazy-apps
в uwsgi, это может избежать проблемы с "fork safe".
просмотр uwsgi doc preforking-vs-lazy-apps-vs-lazy.
Обратите внимание: нет уверенности в том, что у этих двух есть положительное соединение.
Ответ 7
Может быть, вы можете попробовать добавить IP-адрес вашего сервера в файл mongod.conf. Если вы используете Linux (Ubuntu) OS, вы можете попробовать мое решение:
-
изменить файл 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.
Ответ 8
Эта ошибка произошла из-за того, что в фоновом режиме не работает сервер MongoDB. Чтобы запустить сервер MongoDB, откройте командную строку cmd или anaconda и введите:
"C:\Program Files\MongoDB\Server\3.6\bin\mongod.exe"
затем беги
import pymongo
myclient = pymongo.MongoClient()
mydb = myclient["mydatabase"]
myclient.list_database_names()
Ответ 9
Я использую Pymongo 3.2, и я сталкиваюсь с той же ошибкой, однако в моем случае это была неправильная конфигурация. После включения авторизации я забыл обновить порт в URL, который закончился тайм-аутом соединения. Вероятно, стоит упомянуть, что? AuthSource может потребоваться, поскольку он обычно отличается от базы данных, хранящей данные приложения.
Ответ 10
Я решил это, установив dnspython (pip install dnspython). Проблема в том, что: "Для использования mongodb + srv://URI необходимо установить модуль" dnspython ""
Ответ 11
Как упомянуто здесь: fooobar.com/questions/16914928/...
Я добавил ?ssl=true&ssl_cert_reqs=CERT_NONE
в строку подключения, и это устранило проблему.
так что вместо:
connection_string = "mongodb+srv://<USER>:<PASSWORD>@<CLUSTER>/<COLLECTION>"
я написал:
connection_string = "mongodb+srv://<USER>:<PASSWORD>@<CLUSTER>/<COLLECTION>?ssl=true&ssl_cert_reqs=CERT_NONE"
(обратите внимание, что если в строке подключения есть другие параметры, вам нужно изменить ?
на &
)
Ответ 12
Это было исправлено в PyMongo
с this pull_request.
Ответ 13
И тогда вы можете использовать пимонго [анаконда подсказка]
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/.
Ответ 14
Если это может помочь, я решил заменить:
from flask.ext.mongoengine import MongoEngine
от:
from flask_mongoengine import MongoEngine