我是一名经验丰富的程序员,但 Python、Ubuntu 和 Linux 方面却是新手。如果这个问题在其他论坛上提出会更好,我深表歉意。
我正在使用 PyCharm 开发一个 Python 项目,代码在 Vagrant 中的 Ubuntu 环境中执行。它必须访问 MongoDb 数据库。
当数据库是本地数据库时,我没有遇到任何困难。我也可以连接到一个远程数据库。但是,我最想连接的数据库是副本集的一部分,这似乎是问题所在。
(我应该说具有副本集的数据库在其实际角色中表现很好。我似乎是有问题的人。)
ssh
我们根据以下建议建立了一些隧道:
我们设立hosts
并ifconfig
适当。
我的主管现在可以毫无困难地连接。但是,我不断收到此消息:
pymongo.errors.ServerSelectionTimeoutError: No replica set members available for replica set name "abc"
连接信息包括所有 3 个副本集服务器作为字符串的一部分host
,加上指定的副本集名称和ReadPreference.PRIMARY
。
堆栈轨迹如下所示:
File "/usr/local/src/dashboard/dashboard/dashboard/app/tasks/exports/__init__.py", line 95, in get_sections
sections = CourseSection.objects(**params)
File "/apps/dashboard-env/lib/python3.4/site-packages/mongoengine/queryset/manager.py", line 37, in __get__
queryset = queryset_class(owner, owner._get_collection())
File "/apps/dashboard-env/lib/python3.4/site-packages/mongoengine/document.py", line 198, in _get_collection
cls.ensure_indexes()
File "/apps/dashboard-env/lib/python3.4/site-packages/mongoengine/document.py", line 878, in ensure_indexes
collection.create_index(fields, background=background, **opts)
File "/apps/dashboard-env/lib/python3.4/site-packages/pymongo/collection.py", line 1753, in create_index
self.__create_index(keys, kwargs, session, **cmd_options)
File "/apps/dashboard-env/lib/python3.4/site-packages/pymongo/collection.py", line 1641, in __create_index
with self._socket_for_writes() as sock_info:
File "/apps/dashboard-env/lib/python3.4/site-packages/pymongo/collection.py", line 193, in _socket_for_writes
return self.__database.client._socket_for_writes()
File "/apps/dashboard-env/lib/python3.4/site-packages/pymongo/mongo_client.py", line 965, in _socket_for_writes
server = self._get_topology().select_server(writable_server_selector)
File "/apps/dashboard-env/lib/python3.4/site-packages/pymongo/topology.py", line 224, in select_server
address))
File "/apps/dashboard-env/lib/python3.4/site-packages/pymongo/topology.py", line 183, in select_servers
selector, server_timeout, address)
File "/apps/dashboard-env/lib/python3.4/site-packages/pymongo/topology.py", line 199, in _select_servers_loop
self._error_message(selector))
pymongo.errors.ServerSelectionTimeoutError: No replica set members available for replica set name "abc"
这个特定的消息No replica set members available for replica set name "abc"
似乎相对不常见,因为我没有在 Google 上找到任何关于特定命名副本集的问题。
任何建议将不胜感激。
答案1
我已经解决了我自己的问题。
事实证明,为了改变我运行代码的数据库,我需要执行以下操作:
- 终止
ssh
Vagrant 上的所有会话,以关闭所有现有隧道。 - 停止本地
mongod
服务:service mongod stop
- 如果打开新隧道:
ssh
在 Vagrant 上执行所需命令以创建所需隧道。如果本地连接,则无需执行任何操作。 - 重新开始
mongod
:service mongod start
现在我的代码可以无错误地连接。
可能有更好的方法来实现这一点,但这让我能够做我想做的事情。