Почему 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 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 это можно сделать на этой странице enter image description here

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


возможно, вы можете попробовать добавить свой 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.


перейти на сайт PyMongo с этой pull_request.


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

from flask.ext.mongoengine import MongoEngine

by:

from flask_mongoengine import MongoEngine