为什么 PyMongo 3 给出 ServerSelectionTimeoutError?
Why is PyMongo 3 giving ServerSelectionTimeoutError?
我正在使用:
- Python 3.4.2
- PyMongo 3.0.2
- mongolab 运行ning 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:pw@host.mongolab.com:port/mydb')
self.db = self.mongo_client['mydb']
我尝试将 JSON 字典保存到 MongoDB:
result = self.db.jobs.insert_one(job_dict)
它通过执行与 mongodb 相同的代码路径的单元测试来工作。然而,当我使用 HTTP POST 通过 CherryPy 和 uWSGI 执行时,我得到:
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()
似乎知道服务器 'myserver-a.mongolab.com' 的 server_type = 2。然而 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
我通过从 pymongo 3.0 降级到 2.8 自行修复了它。不知道发生了什么。
flask/bin/pip uninstall pymongo
flask/bin/pip install pymongo==2.8
我们正在调查这个问题,在 PYTHON-961 中进行了跟踪。您可以通过在创建 MongoClient 实例时传递 connect=False 来解决此问题。这推迟了后台连接,直到尝试第一个数据库操作,避免了我怀疑是 MongoClient 的监视器线程的旋转和多进程分叉之间的竞争条件。
这已在 PyMongo
和 this pull_request 中修复。
我遇到了同样的问题,最后我发现客户端IP被mongo服务器的防火墙阻止了。
我也遇到过这种情况
这可能是由于 pymongo3 isn't fork safe。
我通过向 uwsgi 添加 --lazy-apps
参数来解决这个问题,这可以避免 "fork safe" 问题。
正在查看 uwsgi 文档 preforking-vs-lazy-apps-vs-lazy。
注意,不确定这两者是否有正相关。
我在 Pymongo 3.5 上遇到了同样的问题
结果用 127.0.0.1 或 mongodb 实例的相应 IP 地址替换 localhost 解决了问题。
首先设置MongoDB环境。
运行 这在 CMD 上 - "C:\Program Files\MongoDB\Server.6\bin\mongod.exe"
- 打开另一个 CMD 和 运行 这个 - "C:\Program Files\MongoDB\Server.6\bin\mongo.exe"
然后就可以使用pymongo [anaconda prompt]
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 云服务配对。但如果你是,我发现你必须指定你想要 MongoDB 访问哪个 IP 地址。
所以您需要做的是添加您的主机服务器的 IP 地址以允许进入。
在 MongoAtlas 中,可以在此页面完成
我知道同样的问题已经有解决方案,但我没有找到对我的情况有帮助的解决方案,所以想 post 这个,这样其他人如果遇到同样的问题也可以受益我做的问题。
也许您可以尝试将您的服务器 ip 地址添加到 mongod.conf 文件中。
如果你使用linux(ubuntu) os,你可以尝试我的解决方案:
修改mongod.conf文件:
vi /etc/mongod.conf
并且可以在127.0.0.1后面加上mongodb服务器ip地址,保存:
net:
port:27017
bindIp:127.0.0.1,mongodb server ip
在终端:
sudo service mongod restart
现在,您可以尝试使用 pymongo MongoClient 连接 mongodb。
发生该错误是因为后台没有 MongoDB 服务器 运行ning。要 运行 MongoDB 服务器打开 cmd 或 anaconda 提示符并输入:-
"C:\Program Files\MongoDB\Server.6\bin\mongod.exe"
然后 运行
import pymongo
myclient = pymongo.MongoClient()
mydb = myclient["mydatabase"]
myclient.list_database_names()
我使用的是 pymongo 3.2,我 运行 遇到了同样的错误,但在我的情况下这是配置错误。启用授权后,我忘记更新 url 中的端口,导致连接超时。可能值得一提的是,可能需要 ?authSource,因为它通常不同于存储应用程序数据的数据库。
我通过安装 dnspython (pip install dnspython) 解决了这个问题。问题是:必须安装 "The "dnspython" 模块才能使用 mongodb+srv:// URIs"
如此处所述:
我在我的连接字符串中添加了 ?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"
(注意,如果你的连接字符串中有其他参数,你需要将 ?
更改为 &
)
我在 mongod.conf 中注释掉了 bindIP 变量,而不是允许所有连接(为此您必须输入 0.0.0.0)。当然后果自负
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")
我今天遇到了同样的异常。在我的例子中,代理设置可能阻止了连接,因为我可以通过更改我的wifi与mongodb成功建立连接.即使这个问题被标记为已解决,它也有望缩小其他人的问题范围。
开发人员正在调查此问题,并在 PYTHON-961 中进行了跟踪。您可以通过 运行 mongod.exe 手动解决此问题并对其进行监控。当控制台冻结时会出现此问题,如果 mongod 控制台卡住,您可以按回车键。在开发人员修复此错误之前,这是目前最简单的解决方案。
我 运行 在开发过程中遇到了同样的问题。这是因为 mongodb 在我的本地机器上不是 运行(sudo systemctl restart mongod
在 Ubuntu 上得到 mongodb 运行)。
就我而言
- 我正在使用 Mongo Atlas
- 我在路由器重启后获得了另一个 IP 地址
因此我不得不通过
在 Mongo Atlas 设置上将该 IP 添加到白名单
MongoAtlas website -> Network Access -> IP Whitelist -> Add IP Address -> Add Current IP Address
然后等待 IP 地址的状态更改为活动,然后再次尝试 运行 应用程序
如果您使用 repl.it 服务器来托管,只需添加您用于配置服务器的主机 ip,对我来说是 0.0.0.0,这是最常见的
我只是在 network access
选项卡中添加了我当前的 IP 地址,因为它会自动更改。删除了前面的,IP地址略有变化。
我在 windows 上遇到了同样的错误,我刚刚启动了 MongoDB 服务
- 打开服务 ctrl+R 然后输入 services.msc 然后回车
当我将服务中的 MongoDB 切换到之前停止的 运行 时,这个问题就解决了。
对于我的情况,我只设置我的 ip 允许列表 0.0.0.0 允许任何地方,但你可以使用“我的 ip 是什么”设置你的 ip 并将其复制粘贴到网络访问 > 添加 ip
转到您的 Atlas 控制台 > 网络访问,然后添加您的客户端 IP 地址,
前任。 0.0.0.0/00
(注意:所有客户端ips都可以访问你的数据库)
我一直在为同样的问题而苦苦挣扎。读取和插入根本不起作用 ServerSelectionTimeoutError
。
我一直在 Ubuntu 18.04 LTS 上使用 pymongo==3.11.4
。
尝试使用 connect=False
,将额外的 ?ssl=true&ssl_cert_reqs=CERT_NONE
选项传递给我的连接字符串和上面列出的其他建议。就我而言,它们不起作用。
最后简单地尝试升级到 pymongo==3.12.1
并且连接开始工作而没有通过 connect=false
,其他 extra arguments
建议。
login = '<USERNAME>'
password = '<PASSWORD>'
host = '*.mongodb.net'
db = '<DB>'
uri = f'mongodb+srv://{login}:{password}@{host}/{db}?retryWrites=true&w=majority'
client = MongoClient(uri, authsource='admin')#, connect=False)
collection = client.db.get_collection('collection_name')
# t = collection.find_one({'hello': '1'})
t = collection.insert_one({'hello': '2'})
print(t)
我今天遇到了这个问题。我设法通过以下方式处理它:
正在安装 dnspython 库 > 转到 MongoDB 网页 > 登录 > 安全 > 网络访问 > 添加 IP 地址 > 添加我的请求来自的 IP 地址。
希望这对某人有所帮助。
确保您输入的是用户密码,而不是 MongoDB 帐户密码。我遇到了类似的问题。就我而言,我错误地输入了 MongoDB 帐户密码而不是用户密码。
我遇到了同样的问题。2 分钟前运行良好的代码给出了这个错误。我在 google 上寻找解决方案大约 30 分钟,它自动得到修复。问题可能出在我的家庭互联网连接上。只是一个猜测,但如果您没有对代码或任何其他配置文件进行任何更改,最好等待一段时间再重试。
我正在使用:
- Python 3.4.2
- PyMongo 3.0.2
- mongolab 运行ning 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:pw@host.mongolab.com:port/mydb')
self.db = self.mongo_client['mydb']
我尝试将 JSON 字典保存到 MongoDB:
result = self.db.jobs.insert_one(job_dict)
它通过执行与 mongodb 相同的代码路径的单元测试来工作。然而,当我使用 HTTP POST 通过 CherryPy 和 uWSGI 执行时,我得到:
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()
似乎知道服务器 'myserver-a.mongolab.com' 的 server_type = 2。然而 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
我通过从 pymongo 3.0 降级到 2.8 自行修复了它。不知道发生了什么。
flask/bin/pip uninstall pymongo
flask/bin/pip install pymongo==2.8
我们正在调查这个问题,在 PYTHON-961 中进行了跟踪。您可以通过在创建 MongoClient 实例时传递 connect=False 来解决此问题。这推迟了后台连接,直到尝试第一个数据库操作,避免了我怀疑是 MongoClient 的监视器线程的旋转和多进程分叉之间的竞争条件。
这已在 PyMongo
和 this pull_request 中修复。
我遇到了同样的问题,最后我发现客户端IP被mongo服务器的防火墙阻止了。
我也遇到过这种情况
这可能是由于 pymongo3 isn't fork safe。
我通过向 uwsgi 添加 --lazy-apps
参数来解决这个问题,这可以避免 "fork safe" 问题。
正在查看 uwsgi 文档 preforking-vs-lazy-apps-vs-lazy。
注意,不确定这两者是否有正相关。
我在 Pymongo 3.5 上遇到了同样的问题 结果用 127.0.0.1 或 mongodb 实例的相应 IP 地址替换 localhost 解决了问题。
首先设置MongoDB环境。
运行 这在 CMD 上 - "C:\Program Files\MongoDB\Server.6\bin\mongod.exe"
- 打开另一个 CMD 和 运行 这个 - "C:\Program Files\MongoDB\Server.6\bin\mongo.exe"
然后就可以使用pymongo [anaconda prompt]
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 云服务配对。但如果你是,我发现你必须指定你想要 MongoDB 访问哪个 IP 地址。
所以您需要做的是添加您的主机服务器的 IP 地址以允许进入。
在 MongoAtlas 中,可以在此页面完成
我知道同样的问题已经有解决方案,但我没有找到对我的情况有帮助的解决方案,所以想 post 这个,这样其他人如果遇到同样的问题也可以受益我做的问题。
也许您可以尝试将您的服务器 ip 地址添加到 mongod.conf 文件中。 如果你使用linux(ubuntu) os,你可以尝试我的解决方案:
修改mongod.conf文件:
vi /etc/mongod.conf
并且可以在127.0.0.1后面加上mongodb服务器ip地址,保存:
net: port:27017 bindIp:127.0.0.1,mongodb server ip
在终端:
sudo service mongod restart
现在,您可以尝试使用 pymongo MongoClient 连接 mongodb。
发生该错误是因为后台没有 MongoDB 服务器 运行ning。要 运行 MongoDB 服务器打开 cmd 或 anaconda 提示符并输入:-
"C:\Program Files\MongoDB\Server.6\bin\mongod.exe"
然后 运行
import pymongo
myclient = pymongo.MongoClient()
mydb = myclient["mydatabase"]
myclient.list_database_names()
我使用的是 pymongo 3.2,我 运行 遇到了同样的错误,但在我的情况下这是配置错误。启用授权后,我忘记更新 url 中的端口,导致连接超时。可能值得一提的是,可能需要 ?authSource,因为它通常不同于存储应用程序数据的数据库。
我通过安装 dnspython (pip install dnspython) 解决了这个问题。问题是:必须安装 "The "dnspython" 模块才能使用 mongodb+srv:// URIs"
如此处所述:
我在我的连接字符串中添加了 ?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"
(注意,如果你的连接字符串中有其他参数,你需要将 ?
更改为 &
)
我在 mongod.conf 中注释掉了 bindIP 变量,而不是允许所有连接(为此您必须输入 0.0.0.0)。当然后果自负
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")
我今天遇到了同样的异常。在我的例子中,代理设置可能阻止了连接,因为我可以通过更改我的wifi与mongodb成功建立连接.即使这个问题被标记为已解决,它也有望缩小其他人的问题范围。
开发人员正在调查此问题,并在 PYTHON-961 中进行了跟踪。您可以通过 运行 mongod.exe 手动解决此问题并对其进行监控。当控制台冻结时会出现此问题,如果 mongod 控制台卡住,您可以按回车键。在开发人员修复此错误之前,这是目前最简单的解决方案。
我 运行 在开发过程中遇到了同样的问题。这是因为 mongodb 在我的本地机器上不是 运行(sudo systemctl restart mongod
在 Ubuntu 上得到 mongodb 运行)。
就我而言
- 我正在使用 Mongo Atlas
- 我在路由器重启后获得了另一个 IP 地址
因此我不得不通过
在 Mongo Atlas 设置上将该 IP 添加到白名单MongoAtlas website -> Network Access -> IP Whitelist -> Add IP Address -> Add Current IP Address
然后等待 IP 地址的状态更改为活动,然后再次尝试 运行 应用程序
如果您使用 repl.it 服务器来托管,只需添加您用于配置服务器的主机 ip,对我来说是 0.0.0.0,这是最常见的
我只是在 network access
选项卡中添加了我当前的 IP 地址,因为它会自动更改。删除了前面的,IP地址略有变化。
我在 windows 上遇到了同样的错误,我刚刚启动了 MongoDB 服务
- 打开服务 ctrl+R 然后输入 services.msc 然后回车
当我将服务中的 MongoDB 切换到之前停止的 运行 时,这个问题就解决了。
对于我的情况,我只设置我的 ip 允许列表 0.0.0.0 允许任何地方,但你可以使用“我的 ip 是什么”设置你的 ip 并将其复制粘贴到网络访问 > 添加 ip
转到您的 Atlas 控制台 > 网络访问,然后添加您的客户端 IP 地址, 前任。 0.0.0.0/00 (注意:所有客户端ips都可以访问你的数据库)
我一直在为同样的问题而苦苦挣扎。读取和插入根本不起作用 ServerSelectionTimeoutError
。
我一直在 Ubuntu 18.04 LTS 上使用 pymongo==3.11.4
。
尝试使用 connect=False
,将额外的 ?ssl=true&ssl_cert_reqs=CERT_NONE
选项传递给我的连接字符串和上面列出的其他建议。就我而言,它们不起作用。
最后简单地尝试升级到 pymongo==3.12.1
并且连接开始工作而没有通过 connect=false
,其他 extra arguments
建议。
login = '<USERNAME>'
password = '<PASSWORD>'
host = '*.mongodb.net'
db = '<DB>'
uri = f'mongodb+srv://{login}:{password}@{host}/{db}?retryWrites=true&w=majority'
client = MongoClient(uri, authsource='admin')#, connect=False)
collection = client.db.get_collection('collection_name')
# t = collection.find_one({'hello': '1'})
t = collection.insert_one({'hello': '2'})
print(t)
我今天遇到了这个问题。我设法通过以下方式处理它:
正在安装 dnspython 库 > 转到 MongoDB 网页 > 登录 > 安全 > 网络访问 > 添加 IP 地址 > 添加我的请求来自的 IP 地址。
希望这对某人有所帮助。
确保您输入的是用户密码,而不是 MongoDB 帐户密码。我遇到了类似的问题。就我而言,我错误地输入了 MongoDB 帐户密码而不是用户密码。
我遇到了同样的问题。2 分钟前运行良好的代码给出了这个错误。我在 google 上寻找解决方案大约 30 分钟,它自动得到修复。问题可能出在我的家庭互联网连接上。只是一个猜测,但如果您没有对代码或任何其他配置文件进行任何更改,最好等待一段时间再重试。