奇怪的 MongoDB 仅在本地主机上的连接问题
Strange MongoDB connection issue only on localhost
我有 3 台服务器,其中 运行 一个 MongoDB 副本集,1 个主服务器,1 个辅助服务器,1 个仲裁服务器。我在连接到这个副本集时遇到问题。使用 test.js 文件进行测试,该文件 运行 在本地主机和备用服务器上。
- 从本地主机连接,节点 6.5.0:OK
- 从本地主机连接,节点 10.15.1:失败
- 从备用服务器连接,节点 6.5.0:OK
- 从备用服务器连接,节点 10.15.1:OK
这是我的 test.js 文件:
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://root:password"+
"@mgdb1.mydomain,mgdb2.mydomain/vApp?replicaSet=rs0&authSource=admin";
console.log("Connecting...");
MongoClient.connect(url,(err,client)=>{
if (err!=null){
console.log("Error:",err);
return;
}
console.log("Connected.");
process.exit();
});
奇怪的是,它显示了 ECONNREFUSED 错误,但不是在副本集中 3 个服务器的 IP,而是我的 ISP 范围内的 IP。那么为什么它在 afterConnect 后会失败呢?显示TCPConnectWrap.afterConnect,是不是已经连接成功了?
错误是这样的:
Connecting...
(node:1412) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
Error: { Error: connect ECONNREFUSED 125.235.4.59:27017
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1104:14)
errno: 'ECONNREFUSED',
code: 'ECONNREFUSED',
syscall: 'connect',
address: '125.235.4.59',
port: 27017 }
编辑:
我目前的解决方法是不使用 replicaset=rs0 直接连接到主服务器,但是,这不是理想的方式。
我发现了问题。当在云上的一组机器上创建副本集时,服务器的地址是 服务器名称 ,只有同一服务器 LAN 上的其他机器知道。在办公室的本地主机上,没有这样的服务器名称。
Work-around 1:
- 仅连接到主服务器或辅助服务器
Work-around 2:
- 编辑 /etc/hosts 文件(或 c:\windows\system32\drivers\etc\hosts)
- 将服务器名称指向其适当的 IP
我有 3 台服务器,其中 运行 一个 MongoDB 副本集,1 个主服务器,1 个辅助服务器,1 个仲裁服务器。我在连接到这个副本集时遇到问题。使用 test.js 文件进行测试,该文件 运行 在本地主机和备用服务器上。
- 从本地主机连接,节点 6.5.0:OK
- 从本地主机连接,节点 10.15.1:失败
- 从备用服务器连接,节点 6.5.0:OK
- 从备用服务器连接,节点 10.15.1:OK
这是我的 test.js 文件:
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://root:password"+
"@mgdb1.mydomain,mgdb2.mydomain/vApp?replicaSet=rs0&authSource=admin";
console.log("Connecting...");
MongoClient.connect(url,(err,client)=>{
if (err!=null){
console.log("Error:",err);
return;
}
console.log("Connected.");
process.exit();
});
奇怪的是,它显示了 ECONNREFUSED 错误,但不是在副本集中 3 个服务器的 IP,而是我的 ISP 范围内的 IP。那么为什么它在 afterConnect 后会失败呢?显示TCPConnectWrap.afterConnect,是不是已经连接成功了?
错误是这样的:
Connecting...
(node:1412) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
Error: { Error: connect ECONNREFUSED 125.235.4.59:27017
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1104:14)
errno: 'ECONNREFUSED',
code: 'ECONNREFUSED',
syscall: 'connect',
address: '125.235.4.59',
port: 27017 }
编辑:
我目前的解决方法是不使用 replicaset=rs0 直接连接到主服务器,但是,这不是理想的方式。
我发现了问题。当在云上的一组机器上创建副本集时,服务器的地址是 服务器名称 ,只有同一服务器 LAN 上的其他机器知道。在办公室的本地主机上,没有这样的服务器名称。
Work-around 1:
- 仅连接到主服务器或辅助服务器
Work-around 2:
- 编辑 /etc/hosts 文件(或 c:\windows\system32\drivers\etc\hosts)
- 将服务器名称指向其适当的 IP