升级到PyMongo 3.0导致ServerSelectionTimeoutError

时间:2015-04-16 01:41:55

标签: python mongodb nginx pymongo uwsgi

我最近将Bottle + uWSGI + Nginx应用程序升级到MongoDB 3.0.2。它与PyMongo 2.8一起工作正常,但今天我通过运行以下命令升级到PyMongo 3.0:

pip install --upgrade pymongo

我没有对代码进行任何其他更改,但现在我一直收到以下错误。

File "/pymongo/cursor.py", line 968, in __next__ if len(self.__data) or self._refresh():
File "/pymongo/cursor.py", line 905, in _refresh self.__read_preference))
File "/pymongo/cursor.py", line 812, in __send_message **kwargs)
File "/pymongo/mongo_client.py", line 716, in _send_message_with_response server = topology.select_server(selector)
File "/pymongo/topology.py", line 113, in select_server server_selection_timeout))
File "/pymongo/topology.py", line 93, in select_servers self._error_message(selector))
ServerSelectionTimeoutError: No servers found yet

我用来连接数据库的功能如下:

def connect_db(db_name):
    global db
    host = "localhost"
    port = 27017
    connection = pymongo.MongoClient(host=host, port=port)
    db = connection[db_name]

我重新启动了所有服务器。静态页面工作正常,但任何试图访问数据库的页面都会挂起并抛出上面的错误。但是,如果我转到mongo shell或Python shell并查询MongoDB服务器,它可以正常工作。

>>> import pymongo
>>> host = "localhost"
>>> port = 27017
>>> connection = pymongo.MongoClient(host=host, port=port)
>>> db = connection[test]
>>> db.test.insert_one({"test": True});
<pymongo.results.InsertOneResult object at 0x7fc43b8efc80>

似乎只有我的应用程序找不到MongoDB服务器。请注意,我正在使用虚拟环境,以防以任何方式影响情况。此外,如果我降级回PyMongo 2.8,一切正常。

5 个答案:

答案 0 :(得分:0)

对我的解决方案令人惊讶; 我是在Bash提示下输入的

sudo /usr/sbin/setsebool -P httpd_can_network_connect 1
sudo service httpd restart

归功于this answer。结果是Apache权限问题。

注意:我在CentOS 6.6上运行PyMongo 3.0,Python 2.6和Mongo 2.4。我得到了一个略有不同的错误,但它与PyMongo的行相同。这是我的堆栈跟踪的结束:

File "/usr/lib64/python2.6/site-packages/pymongo/topology.py", line 93, in select_servers
    self._error_message(selector))
ServerSelectionTimeoutError: localhost:27017: [Errno 13] Permission denied

答案 1 :(得分:0)

这似乎与this questionbug中的问题相同。但是我尝试在MongoClient()创建中设置connect = False,如此建议无济于事。目前唯一可以全面运作的解决方案是降级到2.8(pip install pymongo==2.8

答案 2 :(得分:0)

我认为这与此question重复。

避免触发错误的解决方法很有效(在创建MongoClient实例时传递 connect = False )。 在pymongo 3.0.4版本中会有更清晰的警告。并希望在下一个版本中修复。

答案 3 :(得分:-1)

使用mongos时这可能与this critical PyMomongo 3.0 bug有关吗?如果是这样,他们就推动了对master分支的修复(参见this commit。)

答案 4 :(得分:-1)

<强>编辑:

你检查过你的mongodb日志文件了吗?我认为我遇到了与你相同的问题。

我在/ var / log / mongodb中发现了以下问题:

[initandlisten] exception in initAndListen: 15926 Insufficient free space for journals, terminating
It seems I have no enough free disk in my VM so my mongodb it wasn't running on my machine.

以下帖子是此错误的解决方案:Why getting error mongod dead but subsys locked and Insufficient free space for journal files on Linux?

现在看来我的问题已经解决了。也许你有同样的错误,你需要使用smallfiles才能工作。

最好的问候。