无法连接到 mongodb 副本集 Google 计算引擎
Unable to connect to mongodb replicaset Google Compute Engine
我在 google 计算引擎上为 mongodb 创建了一个 3 节点副本集,出于测试目的,我为防火墙规则添加了 0.0.0.0/0
并且我能够连接从任何地方到单个节点,所有实例都可以正常工作!但问题是当我尝试使用以下命令连接到副本集时
mongo "mongodb://username:password@public-ip-1:27017,public-ip-2:27017,public-ip-3:27017/production?replicaSet=rs0"
- 当我在同一项目的另一个实例中尝试此代码时,它可以正常工作
- 当我从不同的项目实例或我的本地实例尝试时,它抛出如下错误
2020-08-22T14:36:40.579+0530 I NETWORK [thread1] getaddrinfo("mongodb-1-servers-vm-0") failed: nodename nor servname provided, or not known
2020-08-22T14:36:40.582+0530 I NETWORK [thread1] getaddrinfo("mongodb-1-servers-vm-1") failed: nodename nor servname provided, or not known
2020-08-22T14:36:40.582+0530 W NETWORK [thread1] Unable to reach primary for set rs0
从这些实例中,我可以分别连接到各个节点,如
mongo "mongodb://username:passsword@public-ip-1:27017/production"
mongo "mongodb://username:passsword@public-ip-2:27017/production"
mongo "mongodb://username:passsword@public-ip-3:27017/production"
可能是什么问题?
第二个问题,防火墙上有添加应用引擎服务账号的选项吗?所以如果我禁用 0.0.0.0/0
public 访问并添加此规则,我可以从我的应用引擎连接到这些实例吗?
连接到副本集时,客户端使用服务器发现过程。基本步骤是:
- 连接到连接字符串中的第一台主机
- 如果失败尝试第二个
- 建立连接后,运行 命令这样
isMaster
到:
- 发现所有副本集成员的名字
- 发现当前主节点
- 关闭初始连接
- 使用在步骤 2 中发现的主机名和端口连接到副本集的每个成员
这意味着从 rs.conf()
或 rs.status()
返回的主机名必须可由您希望能够直接连接到副本集的每个客户端解析。
从错误消息来看,节点似乎是使用短名称添加到副本集中的。如果将每个节点的短名称添加到您要连接的计算机上的主机文件中,它应该可以工作。
或者,在 rs.initiate
和 rs.add
命令中使用可公开解析的主机名重建副本集。
我在 google 计算引擎上为 mongodb 创建了一个 3 节点副本集,出于测试目的,我为防火墙规则添加了 0.0.0.0/0
并且我能够连接从任何地方到单个节点,所有实例都可以正常工作!但问题是当我尝试使用以下命令连接到副本集时
mongo "mongodb://username:password@public-ip-1:27017,public-ip-2:27017,public-ip-3:27017/production?replicaSet=rs0"
- 当我在同一项目的另一个实例中尝试此代码时,它可以正常工作
- 当我从不同的项目实例或我的本地实例尝试时,它抛出如下错误
2020-08-22T14:36:40.579+0530 I NETWORK [thread1] getaddrinfo("mongodb-1-servers-vm-0") failed: nodename nor servname provided, or not known 2020-08-22T14:36:40.582+0530 I NETWORK [thread1] getaddrinfo("mongodb-1-servers-vm-1") failed: nodename nor servname provided, or not known 2020-08-22T14:36:40.582+0530 W NETWORK [thread1] Unable to reach primary for set rs0
从这些实例中,我可以分别连接到各个节点,如
mongo "mongodb://username:passsword@public-ip-1:27017/production"
mongo "mongodb://username:passsword@public-ip-2:27017/production"
mongo "mongodb://username:passsword@public-ip-3:27017/production"
可能是什么问题?
第二个问题,防火墙上有添加应用引擎服务账号的选项吗?所以如果我禁用 0.0.0.0/0
public 访问并添加此规则,我可以从我的应用引擎连接到这些实例吗?
连接到副本集时,客户端使用服务器发现过程。基本步骤是:
- 连接到连接字符串中的第一台主机
- 如果失败尝试第二个
- 建立连接后,运行 命令这样
isMaster
到:- 发现所有副本集成员的名字
- 发现当前主节点
- 关闭初始连接
- 使用在步骤 2 中发现的主机名和端口连接到副本集的每个成员
这意味着从 rs.conf()
或 rs.status()
返回的主机名必须可由您希望能够直接连接到副本集的每个客户端解析。
从错误消息来看,节点似乎是使用短名称添加到副本集中的。如果将每个节点的短名称添加到您要连接的计算机上的主机文件中,它应该可以工作。
或者,在 rs.initiate
和 rs.add
命令中使用可公开解析的主机名重建副本集。