【发布时间】:2026-02-17 21:20:04
【问题描述】:
我在 Windows 的 docker 容器中运行 mongodb replicaSet。 这是 docker compose 文件
version: '3'
services:
rs0:
image: mongo:4.4
ports:
- "27018:27017"
command: mongod --replSet rsnmbp
volumes:
- rs0_data:/data/db
- ./nmbprsdata0:/nmbpdata
rs1:
image: mongo:4.4
ports:
- "27019:27017"
command: mongod --replSet rsnmbp
volumes:
- rs1_data:/data/db
- ./nmbprsdata1:/nmbpdata
rs2:
image: mongo:4.4
ports:
- "27020:27017"
command: mongod --replSet rsnmbp
volumes:
- rs2_data:/data/db
- ./nmbprsdata2:/nmbpdata
rs3:
image: mongo:4.4
ports:
- "27021:27017"
command: mongod --replSet rsnmbp
volumes:
- rs3_data:/data/db
- ./nmbprsdata3:/nmbpdata
rs4:
image: mongo:4.4
ports:
- "27022:27017"
command: mongod --replSet rsnmbp
volumes:
- rs4_data:/data/db
- ./nmbprsdata4:/nmbpdata
volumes:
rs0_data:
rs1_data:
rs2_data:
rs3_data:
rs4_data:
副本集通过配置
rsconf = {
_id: "rsnmbp",
members: [
{
_id: 0,
host: "rs0:27017"
},
{
_id: 1,
host: "rs1:27017"
},
{
_id: 2,
host: "rs2:27017"
},
{
_id: 3,
host: "rs3:27017"
},
{
_id: 4,
host: "rs4:27017"
},
]
}
rs.initiate(rsconf)
我正在尝试通过 node.js 中的 mongoose 连接到副本集
const DB_URI = 'mongodb://localhost:27018,localhost:27019,localhost:27020,localhost:27021,localhost:27022/test'
mongoose.connect(DB_URI)
.then((result) =>console.log ("connected to database"))
.catch((err) =>console.log (err))
但我收到以下错误
MongooseServerSelectionError: getaddrinfo ENOTFOUND rs0
...
reason: TopologyDescription {
type: 'ReplicaSetNoPrimary',
servers: Map(5) {
'rs0:27017' => [ServerDescription],
'rs1:27017' => [ServerDescription],
'rs2:27017' => [ServerDescription],
'rs3:27017' => [ServerDescription],
'rs4:27017' => [ServerDescription]
},
stale: false,
compatible: true,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
setName: 'rsnmbp',
maxSetVersion: 1,
maxElectionId: new ObjectId("7fffffff0000000000000003"),
commonWireVersion: 9,
logicalSessionTimeoutMinutes: undefined
}
}
我在 Windows 上的 etc/hosts 中添加了以下几行
127.0.0.1 rs0
127.0.0.1 rs1
127.0.0.1 rs2
127.0.0.1 rs3
127.0.0.1 rs4
并将 const DB_URI 更改为
const DB_URI = 'mongodb://rs0:27018,rs1:27019,rs2:27020,rs3:27021,rs4:27022/test'
但现在我收到以下错误
MongooseServerSelectionError: Server selection timed out after 30000 ms
...
reason: TopologyDescription {
type: 'ReplicaSetNoPrimary',
servers: Map(0) {},
stale: false,
compatible: true,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
setName: 'rsnmbp',
maxSetVersion: 1,
maxElectionId: new ObjectId("7fffffff0000000000000003"),
commonWireVersion: 9,
logicalSessionTimeoutMinutes: undefined
}
}
如何在 node.js 中使用 mongoose 连接到此副本集 提前致谢。
【问题讨论】:
-
你初始化副本集了吗?尝试连接字符串
mongodb://rs0:27017,rs1:27017,rs2:27017,rs3:27017,rs4:27017/test?replicaSet=rsnmbp -
我有另一个在 27017 上运行的单个 Mongo 容器
0.0.0.0:27017->27017/tcp docker_mongodb下面是副本集端口0.0.0.0:27020->27017/tcp rs2_1 0.0.0.0:27020->27017/tcp rs1_1 0.0.0.0:27020->27017/tcp rs3_1 0.0.0.0:27020->27017/tcp rs0_1 0.0.0.0:27020->27017/tcp rs4_1与您一起,我正在连接到这个单个 mongodb 容器 -
抱歉,我打错了副本集的端口。下面是正确的端口
0.0.0.0:27018->27017/tcp, 0.0.0.0:27019->27017/tcp, 0.0.0.0:27020->27017/tcp, 0.0.0.0:27021->27017/tcp, 0.0.0.0:27022->27017/tcp -
我已经停止了单个 Mongo 容器,并将 uri 更改为
const DB_URI = 'mongodb://rs0:27017,rs1:27017,rs2:27017,rs3:27017,rs4:27017/test',但现在我收到来自所有五个副本集成员的以下错误error: MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017。有什么想法吗?
标签: node.js mongodb mongoose connection replicaset