2015-06-24 4 views
26

Я использую:Почему PyMongo 3 дает ServerSelectionTimeoutError?

  • Python 3.4.2
  • PyMongo 3.0.2
  • mongolab работает 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 ОДИН раз:

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) 

Он работает с помощью теста блока, который выполняет тот же самый код путь к MongoDB. Однако, когда я выполняю через CherryPy и uWSGI с помощью POST HTTP, я получаю это:

pymongo.errors.ServerSelectionTimeoutError: No servers found yet 

Почему я вижу это поведение при запуске через CherryPy и uWSGI? Возможно, это новая модель потока в PyMongo 3?

Update:

Если я бегу без uWSGI и Nginx с помощью CherryPy встроенный сервер, на insert_one() работ.

Update 1/25 4:53 вечера EST:

После добавления некоторых отладки в PyMongo, оказывается, что topology._update_servers() знает, что тип_сервера = 2 для сервера 'myserver-a.mongolab.com. Однако server_description.known_servers() имеет тип_сервера = 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 
+0

Я тоже нахожусь на подобной установке. Вы когда-нибудь находили ответ? – Greg

+0

Ничего еще ... не вернулись к отладке. – drfence

+1

Хотите, чтобы я начал щедрость? Будете ли вы отвечать на последующие вопросы? Я полностью застрял на этом. – Greg

ответ

25

Мы изучаем эту проблему, отслеживаем ее в PYTHON-961. Вы можете решить проблему, пройдя connect = False при создании экземпляров MongoClient. Это предотвращает фоновое соединение до тех пор, пока не будет предпринята попытка первой операции с базой данных, избегая того, что, как я подозреваю, является условием гонки между разворотным потоком монитора MongoClient и многопроцессорным форсированием.

+2

Возможно, это глупый вопрос, но как это делается? – SARose

+2

Это решение терпит неудачу, если мы используем аутентификацию в mongodb.Есть ли какое-либо другое решение для этого –

9

Я зафиксировал его для себя путем понижения от PyMongo 3,0 до 2,8. Не знаю, что происходит.

flask/bin/pip uninstall pymongo 
    flask/bin/pip install pymongo==2.8 
+0

Справа, предыдущие версии работали и на меня. – drfence

+6

'pip install pymongo == 2.8 --upgrade' – drgarcia1986

+0

Получил ошибку, работает и для меня. – realhu

-1

Это было исправлено в PyMongo с this pull_request.

+2

Я только что обновил с pymongo '2.6.2' до' 3.2.2', и я получаю эту ошибку: 'ServerSelectionTimeoutError: сервер еще не найден '. Запуск MongoDB '3.2.5', Python' 2.7', Bottle '0.12.9' на Ubuntu' 16.04'. Является ли исправление в версии, отличной от '3.2.2'? – user1063287

+1

Это не исправление, этот PR просто _enables_ _workaround_ указан в принятом ответе: http://stackoverflow.com/a/31194981/1446048 – OJFord

0

Я столкнулся с той же проблемой, и, наконец, я обнаружил, что IP-адрес клиента блокируется брандмауэром сервера mongo.

0

Я тоже столкнулся с этим.

Возможно, это связано с pymongo3 isn't fork safe.

Я исправлю это, добавивparam в uwsgi, это может избежать проблемы с «fork safe».

смотри uwsgi doc preforking-vs-lazy-apps-vs-lazy.

Извините, но для этого нет уверенности.

2

У меня была такая же проблема с Pymongo 3.5 Выключает замену localhost на 127.0.0.1 или соответствующий ip-адрес вашего экземпляра mongodb решает проблему.