Почему 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 с помощью HTTP POST, я получаю следующее:

pymongo.errors.ServerSelectionTimeoutError: No servers found yet

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

Обновление:

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

Обновление 25 января, 16: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

person drfence    schedule 24.06.2015    source источник
comment
Я тоже попадаю в это на аналогичной настройке. Вы когда-нибудь находили ответ?   -  person Greg    schedule 30.06.2015
comment
Пока ничего ... не вернулся к отладке.   -  person drfence    schedule 01.07.2015
comment
Хотите, чтобы я устроил награду? Сможете ли вы ответить на последующие вопросы? Я сам полностью зациклился на этом.   -  person Greg    schedule 01.07.2015
comment
Это полезно? blog.fejes.ca/?p=2496 Я не уверен, как это применимо в uwsgi?   -  person Greg    schedule 01.07.2015
comment
Баунти было бы здорово. Я попытался опубликовать сообщение в группе mongodb google, но мой вопрос так и не был опубликован.   -  person drfence    schedule 01.07.2015
comment
Я вижу, что ваш комментарий теперь размещен в группе Google, @drfence, и сопровождающий PyMongo Берни Хакетт пытается диагностировать там: groups.google.com/forum / #! topic / mongodb-user / 7qX03P3_zKM   -  person A. Jesse Jiryu Davis    schedule 02.07.2015
comment
В общем, если вы видите что-то похожее на ошибку PyMongo, самый прямой способ связаться со мной, Берни, Анной и Люком - это отправить заявку в проект PYTHON на jira.mongodb.org. Мы стараемся отвечать немедленно.   -  person A. Jesse Jiryu Davis    schedule 02.07.2015
comment
Спасибо, Джесси, я думаю, мы не могли сказать, была ли это проблема с использованием или фактическая ошибка.   -  person Greg    schedule 02.07.2015
comment
У меня была такая же проблема, но проблема заключалась в соединении на уровне ORM с mongoengine   -  person Julio Marins    schedule 02.01.2018


Ответы (24)


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

person Bernie Hackett    schedule 02.07.2015
comment
Возможно, это глупый вопрос, но как именно это сделать? - person SARose; 02.10.2016
comment
Это решение не работает, если мы используем аутентификацию в mongodb. Есть ли другое решение для этого - person Arun K; 06.10.2016
comment
У меня это не сработало - pymongo 3.7.2 с python 3.6.7 под Ubuntu 18.04 - может подключаться и выполнять выборку, но получаю исключение ServerSelectionTimeoutError, когда я пытаюсь выполнить простую вставку. Отладчик показывает, что одна и та же ссылка на файл сертификата SSL на всех трех этапах ресурса подключения. - person Micheal Shallop; 07.01.2019

Я исправил это для себя, понизив версию pymongo 3.0 до 2.8. Понятия не имею, что происходит.

   flask/bin/pip uninstall pymongo
   flask/bin/pip install pymongo==2.8
person Greg    schedule 01.07.2015
comment
по состоянию на 22 ноября 2016 года с Debian Jessie (т.е. pymongo 3.3.x и последний mongodb-org, т.е. что-то вроде 3.2) была такая же ошибка, даже с флагом connect = False. переход на pymongo 2.8 решил проблему. - person comte; 23.11.2016
comment
Я использовал pymogo==3.7.2, удалил его и установил pymongo==2.8. Но у меня это не сработало. - person Sashini Hettiarachchi; 02.02.2019

Как упоминалось здесь: https://stackoverflow.com/a/54314615/8953378

Я добавил ?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"

(Обратите внимание, что если у вас есть другие параметры в строке подключения, вам необходимо изменить ? на &)

person Alon Gouldman    schedule 10.10.2019
comment
Решил проблему для меня с pymongo==3.11.3 - person MartinKondor; 24.02.2021
comment
Решил проблему для меня с Flask-Pymongo 2.3.0 - person Arindam; 11.05.2021

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

person Raj    schedule 17.09.2017
comment
исправлено и для меня (pymongo == 3.6, мотор) - person Bruno Gelb; 06.04.2018

Я не уверен, что вы используете MongoDB в паре с сервисом AWS Cloud. Но если да, то я обнаружил, что вам нужно указать, к какому IP-адресу вы хотите, чтобы MongoDB имел доступ.

Итак, что вам нужно сделать, это добавить IP-адрес вашего хост-сервера, чтобы разрешить вход.

В MongoAtlas это можно сделать на этой странице  введите описание изображения здесь

Я знаю, что уже было решение той же проблемы, но я не нашел решения, которое помогло бы моей ситуации, поэтому я хотел опубликовать это, чтобы другие могли извлечь выгоду, если когда-нибудь столкнутся с той же проблемой, что и я.

person cruise_lab    schedule 30.05.2018

В моем случае

  • Я использовал Mongo Atlas
  • После перезагрузки роутера я получил другой IP-адрес

поэтому мне пришлось добавить этот IP-адрес в белый список в настройках Mongo Atlas через

MongoAtlas website -> Network Access -> IP Whitelist -> Add IP Address -> Add Current IP Address

затем подождите, пока статус IP-адреса изменится на Активный, а затем попробуйте снова запустить приложение.

person Pavel Pokrovskii    schedule 04.08.2020

Я решил это, установив dnspython (pip install dnspython). Проблема в том, что: «Для использования mongodb + srv: // URI должен быть установлен модуль dnspython»

person ttfreeman    schedule 02.06.2019

Сегодня я столкнулся с тем же исключением. В моем случае настройки прокси, вероятно, блокировали соединение, так как я мог установить успешное соединение с mongodb, изменив свой Wi-Fi. Даже если этот вопрос уже отмечен как решенный, можно надеяться, что он сузит проблему для некоторых других.

person Simon    schedule 10.06.2020

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

Это может быть связано с тем, что pymongo3 не безопасен для вилки.

Я исправляю это, добавляя параметр --lazy-apps в uwsgi, это может избежать проблемы с безопасностью вилки.

видя uwsgi doc предварительная установка -vs-lazy-apps-vs-lazy.

Обратите внимание, нет уверенности в том, что у этих двоих есть положительное соединение.

person zephor    schedule 28.12.2016

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

person Joe Cheng    schedule 27.07.2016

возможно, вы можете попробовать добавить IP-адрес вашего сервера в файл mongod.conf. если вы используете ОС linux (ubuntu), вы можете попробовать мое решение:

  1. измените файл mongod.conf:

    vi /etc/mongod.conf
    

    и вы можете добавить IP-адрес сервера mongodb за 127.0.0.1 и сохранить:

    net:
      port:27017
      bindIp:127.0.0.1,mongodb server ip
    
  2. в финале:

    sudo service mongod restart

Теперь вы можете попробовать подключить mongodb с помощью pymongo MongoClient.

person Patrick Chen    schedule 24.07.2018

Эта ошибка возникла из-за того, что сервер MongoDB не работает в фоновом режиме. Чтобы запустить сервер MongoDB, откройте командную строку или приглашение anaconda и введите следующее: -

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

затем беги

import pymongo
myclient = pymongo.MongoClient()    
mydb = myclient["mydatabase"]
myclient.list_database_names()
person Adil    schedule 22.11.2018

Я использую pymongo 3.2 и сталкиваюсь с той же ошибкой, однако в моем случае это была неправильная конфигурация. После включения авторизации я забыл обновить порт в URL-адресе, который закончился таймаутом подключения. Вероятно, стоит упомянуть, что может потребоваться? AuthSource, поскольку он обычно отличается от базы данных, в которой хранятся данные приложения.

person user2944582    schedule 06.02.2019

Я закомментировал переменную bindIP в mongod.conf вместо разрешения всех подключений (для которых вы должны ввести 0.0.0.0). Конечно, остерегайтесь последствий.

person viggy28    schedule 09.11.2019

pymongo 3 не сообщит вам, что ваше соединение не удалось, когда вы создаете экземпляр своего клиента. Возможно, вы не подключены.

https://api.mongodb.com/python/3.5.1/api/pymongo/mongo_client.html

"он больше не вызывает ConnectionFailure, если они недоступны. Вы можете проверить, доступен ли сервер следующим образом:"

from pymongo.errors import ConnectionFailure
client = MongoClient()
try:
    # The ismaster command is cheap and does not 
require auth.
    client.admin.command('ismaster')
except ConnectionFailure:
    print("Server not available")
person DaveP    schedule 17.03.2020

Разработчики исследуют эту проблему, обнаруженную в PYTHON-961. Вы можете обойти эту проблему, запустив mongod.exe вручную и наблюдая за ним. Эта проблема возникает, когда консоль зависает, и вы можете нажать ввод, если консоль mongod застряла. На данный момент это самое простое решение, пока разработчики не исправят эту ошибку.

person Asiri H.    schedule 04.07.2020

Я столкнулся с той же проблемой во время разработки. Это произошло из-за того, что mongodb не работал на моем локальном компьютере (sudo systemctl restart mongod, чтобы запустить mongodb на Ubuntu).

person amucunguzi    schedule 14.07.2020

Я просто добавил свой текущий IP-адрес во вкладку network access, так как он изменился автоматически. Удалил предыдущий, было небольшое изменение IP-адреса.

person Amir Ansari    schedule 04.12.2020

Я столкнулся с той же ошибкой в ​​Windows, и я только что запустил службу MongoDB

  • откройте службы ctrl + R, затем введите services.msc и нажмите Enter.
person Mahmoud Nasr    schedule 06.01.2021

В моем случае я установил только свой список разрешенных IP-адресов 0.0.0.0 разрешить где угодно, но вы можете установить свой IP-адрес, используя мой IP-адрес, и скопировать и вставить его для доступа к сети ›добавить IP-адрес

person denmg    schedule 04.07.2021

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

person thylong    schedule 16.03.2016
comment
Я только что перешел с pymongo 2.6.2 на 3.2.2 и получаю эту ошибку: ServerSelectionTimeoutError: No servers found yet. Запуск MongoDB 3.2.5, Python 2.7, Bottle 0.12.9 в Ubuntu 16.04. Есть ли исправление в версии, отличной от 3.2.2? - person user1063287; 25.04.2016
comment
Это не исправление, этот PR просто включает обходной путь, упомянутый в принятом ответе: stackoverflow.com/a/31194981/1446048 - person OJFord; 12.06.2016

Эта проблема была решена, когда я просто переключил MongoDB в сервисах на работу, которая была остановлена ​​ранее.  часть службы mongodb

person Spsnamta    schedule 12.01.2021

  • Сначала настройте среду MongoDB.

  • Запустите это в CMD - "C: \ Program Files \ MongoDB \ Server \ 3.6 \ bin \ mongod.exe"

  • Откройте другой CMD и запустите это - «C: \ Program Files \ 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/

person Vaishnavi Bala    schedule 29.05.2018

Если это может помочь, я решил заменить:

from flask.ext.mongoengine import MongoEngine

by :

from flask_mongoengine import MongoEngine
person PetitCitron    schedule 29.06.2018