PyMongo 自动重新连接:超时
PyMongo AutoReconnect: timed out
我在 Azure 环境中工作。我有一个运行 Django 应用程序 (Open edX) 和另一个 VM 实例 (Ubuntu 16.04) 上的 Mongo 服务器的 VM。每当我尝试在应用程序中加载任何内容(从 Mongo 服务器获取数据的地方)时,我都会收到如下错误:
Feb 23 12:49:43 xxxxx [service_variant=lms][mongodb_proxy][env:sandbox] ERROR [xxxxx 13875] [mongodb_proxy.py:55] - Attempt 0
Traceback (most recent call last):
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/mongodb_proxy.py", line 53, in wrapper
return func(*args, **kwargs)
File "/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/contentstore/mongo.py", line 135, in find
with self.fs.get(content_id) as fp:
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/gridfs/__init__.py", line 159, in get
return GridOut(self.__collection, file_id)
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/gridfs/grid_file.py", line 406, in __init__
self._ensure_file()
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/gridfs/grid_file.py", line 429, in _ensure_file
self._file = self.__files.find_one({"_id": self.__file_id})
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/pymongo/collection.py", line 1084, in find_one
for result in cursor.limit(-1):
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/pymongo/cursor.py", line 1149, in next
if len(self.__data) or self._refresh():
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/pymongo/cursor.py", line 1081, in _refresh
self.__codec_options.uuid_representation))
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/pymongo/cursor.py", line 996, in __send_message
res = client._send_message_with_response(message, **kwargs)
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/pymongo/mongo_client.py", line 1366, in _send_message_with_response
raise AutoReconnect(str(e))
AutoReconnect: timed out
首先我认为这是因为我的 Mongo 服务器位于 Django 应用程序虚拟网络之外的一个实例中。我在同一个虚拟网络中的一个实例上创建了一个新的 Mongo 服务器,但仍然会遇到这些问题。请注意,我最终收到了数据,但我觉得如果连接正常,我不会收到 timed out
错误。
如果有帮助,这是我用来创建 Mongo 服务器的 Ansible 剧本:https://github.com/edx/configuration/tree/master/playbooks/roles/mongo_3_2
我还跟踪了 Mongo 日志文件,这是唯一会同时出现的行,我会在应用程序服务器上收到 timed out
错误:
2018-02-23T12:49:20.890+0000 [conn5] authenticate db: edxapp { authenticate: 1, user: "user", nonce: "xxx", key: "xxx" }
mongostat
和 mongotop
没有显示任何异常。这里还有 htop
输出:
我不知道还需要寻找什么或如何解决这个问题。
我忘记将 Django 应用程序设置中的 Mongo 服务器 IP 更改为指向虚拟网络内的新私有 IP 地址,而不是 public IP。在我更改之后,它不再出现该问题。
如果您正在阅读本文,如果您在 Djagno 应用程序设置中使用该 IP 地址,请确保将私有 IP 更改为 Azure 中的静态 IP。
我在 Azure 环境中工作。我有一个运行 Django 应用程序 (Open edX) 和另一个 VM 实例 (Ubuntu 16.04) 上的 Mongo 服务器的 VM。每当我尝试在应用程序中加载任何内容(从 Mongo 服务器获取数据的地方)时,我都会收到如下错误:
Feb 23 12:49:43 xxxxx [service_variant=lms][mongodb_proxy][env:sandbox] ERROR [xxxxx 13875] [mongodb_proxy.py:55] - Attempt 0
Traceback (most recent call last):
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/mongodb_proxy.py", line 53, in wrapper
return func(*args, **kwargs)
File "/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/contentstore/mongo.py", line 135, in find
with self.fs.get(content_id) as fp:
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/gridfs/__init__.py", line 159, in get
return GridOut(self.__collection, file_id)
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/gridfs/grid_file.py", line 406, in __init__
self._ensure_file()
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/gridfs/grid_file.py", line 429, in _ensure_file
self._file = self.__files.find_one({"_id": self.__file_id})
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/pymongo/collection.py", line 1084, in find_one
for result in cursor.limit(-1):
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/pymongo/cursor.py", line 1149, in next
if len(self.__data) or self._refresh():
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/pymongo/cursor.py", line 1081, in _refresh
self.__codec_options.uuid_representation))
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/pymongo/cursor.py", line 996, in __send_message
res = client._send_message_with_response(message, **kwargs)
File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/pymongo/mongo_client.py", line 1366, in _send_message_with_response
raise AutoReconnect(str(e))
AutoReconnect: timed out
首先我认为这是因为我的 Mongo 服务器位于 Django 应用程序虚拟网络之外的一个实例中。我在同一个虚拟网络中的一个实例上创建了一个新的 Mongo 服务器,但仍然会遇到这些问题。请注意,我最终收到了数据,但我觉得如果连接正常,我不会收到 timed out
错误。
如果有帮助,这是我用来创建 Mongo 服务器的 Ansible 剧本:https://github.com/edx/configuration/tree/master/playbooks/roles/mongo_3_2
我还跟踪了 Mongo 日志文件,这是唯一会同时出现的行,我会在应用程序服务器上收到 timed out
错误:
2018-02-23T12:49:20.890+0000 [conn5] authenticate db: edxapp { authenticate: 1, user: "user", nonce: "xxx", key: "xxx" }
mongostat
和 mongotop
没有显示任何异常。这里还有 htop
输出:
我不知道还需要寻找什么或如何解决这个问题。
我忘记将 Django 应用程序设置中的 Mongo 服务器 IP 更改为指向虚拟网络内的新私有 IP 地址,而不是 public IP。在我更改之后,它不再出现该问题。
如果您正在阅读本文,如果您在 Djagno 应用程序设置中使用该 IP 地址,请确保将私有 IP 更改为 Azure 中的静态 IP。