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" }

mongostatmongotop 没有显示任何异常。这里还有 htop 输出:

我不知道还需要寻找什么或如何解决这个问题。

我忘记将 Django 应用程序设置中的 Mongo 服务器 IP 更改为指向虚拟网络内的新私有 IP 地址,而不是 public IP。在我更改之后,它不再出现该问题。

如果您正在阅读本文,如果您在 Djagno 应用程序设置中使用该 IP 地址,请确保将私有 IP 更改为 Azure 中的静态 IP。