Подтвердить что ты не робот

Почему 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
4b9b3361

Ответ 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, вы можете попробовать мое решение:

  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.

Ответ 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

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

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

  • Откройте другую CMD и запустите это - "C:\Program Files\MongoDB\Server\3.6\bin\mongo.exe"

И тогда вы можете использовать пимонго [анаконда подсказка]

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