为什么PyMongo 3给ServerSelectionTimeoutError?

问题描述 投票:32回答:13

我正在使用:

  • 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开始PARAMS:

--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字典到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通过使用CherryPy的nginx的内置的服务器,该insert_one()工作。

更新1/25下午4点53分美国东部时间:

加入在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
python mongodb uwsgi mlab pymongo-3.x
13个回答
40
投票

我们正在调查这个问题,在PYTHON-961跟踪。您可以通过创建MongoClient的情况下,当通过连接= False来解决此问题。这推迟的后台连接直到第一个数据库操作尝试,避免什么,我怀疑是自旋之间的竞争条件了MongoClient的监视线程和多进程分叉的。


0
投票

我通过安装dnspython(PIP安装dnspython)解决了这个。问题是,道:“‘dnspython’模块必须安装使用MongoDB的+ SRV://的URI”


-1
投票

此问题已修复与"C:\Program Files\MongoDB\Server\3.6\bin\mongod.exe" pull_request import pymongo myclient = pymongo.MongoClient() mydb = myclient["mydatabase"] myclient.list_database_names()


-1
投票
  • 首先建立MongoDB的环境。
  • 在CMD运行这个 - “C:\ Program Files文件\ MongoDB的\服务器\ 3.6 \ BIN \ mongod.exe”
  • 打开另一个CMD并运行此 - “C:\ Program Files文件\ MongoDB的\服务器\ 3.6 \ BIN \ mongo.exe”

然后你就可以使用pymongo [蟒蛇提示]

PyMongo

请参阅 - this


-1
投票

如果它可以帮助我解决了更换:

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/

10
投票

我从pymongo 3.0到2.8降级固定它自己。不知道这是怎么回事。

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

4
投票

我有同样的问题与Pymongo 3.5原来用127.0.0.1或者你的MongoDB实例的对应的IP地址解决问题替换本地主机。


3
投票

我不知道,如果您使用的AWS云服务配对MongoDB的。但如果你是,我发现,你必须指定你想要的MongoDB有机会获得哪个IP地址。

所以,你需要做的是添加你的主机服务器的IP地址允许进入。

在MongoDB中阿特拉斯,这可以在这个页面qazxsw POI完成

我知道已经有相同的问题的解决方案,但我没有找到一个解决方案,帮助我的情况,所以想后这一点,所以如果他们面对的,我做了同样的问题,其他人可以从中受益。


0
投票

我遇到同样的问题,终于让我找到客户端IP被蒙戈服务器的防火墙阻止。


0
投票

我遇到了这一点。

这可能是由于enter image description here

我加入pymongo3 isn't fork safe参数去uwsgi解决这个问题,这可避免“叉安全”问题。

看到uwsgi DOC --lazy-apps

请注意,没有确定的这两具有正的连接。


0
投票

也许你可以尝试添加您的服务器的IP地址到mongod.conf文件。如果你使用Linux(Ubuntu的)操作系统,你可以试试我的解决方案:

  1. 修改mongod.conf文件: preforking-vs-lazy-apps-vs-lazy 您可以添加MongoDB的服务器IP地址后面127.0.0.1,并保存: vi /etc/mongod.conf
  2. 在终端: qazxsw POI

现在,你可以尝试使用pymongo MongoClient连接的MongoDB。


0
投票

已发生错误的原因是在后台没有MongoDB的服务器上运行。要运行MongoDB服务器打开CMD或蟒蛇提示符并键入如下: -

net:
  port:27017
  bindIp:127.0.0.1,mongodb server ip

然后运行

sudo service mongod restart

0
投票

我使用pymongo 3.2和我碰到了同样的错误,但它是在我的情况下,missconfiguration。启用授权后,我忘了更新的端口在结束了在连接timout的URL。也许这是值得一提的是?因为它通常比数据库中存储应用程序数据的不同authSource可能是必需的。

© www.soinside.com 2019 - 2024. All rights reserved.