问题描述
我在围绕如何连接到副本集时遇到了一些麻烦 - 我需要 .watch()
收集事件,这需要一个副本集 - 请参阅:MongoDB watch() to observe change in Database with NodeJS and Mongoose(我已经按照这个答案好吧,不起作用 - 请参阅此问题的底部)
这是我的设置:
- nodejs express api + mongoose
- 我的主要“管理员”mongo db(名为
DEV
) - 用于副本设置的 3 个 mongo 节点
我已经使用这个片段通过 docker-compose 设置了 3 个 mongo 节点:
version: "3"
services:
mongo0:
hostname: mongo0
container_name: mongo0
image: mongo:latest
expose:
- 30000
ports:
- 30000:30000
volumes:
- mongodb_repl_data1:/data/db
restart: always
command: "--bind_ip_all --replSet rs0 --port 30000"
mongo1:
hostname: mongo1
container_name: mongo1
image: mongo:latest
expose:
- 30001
ports:
- 30001:30001
volumes:
- mongodb_repl_data2:/data/db
restart: always
command: "--bind_ip_all --replSet rs0 --port 30001"
mongo2:
hostname: mongo2
container_name: mongo2
image: mongo:latest
expose:
- 30002
ports:
- 30002:30002
volumes:
- mongodb_repl_data3:/data/db
restart: always
command: "--bind_ip_all --replSet rs0 --port 30002"
volumes:
mongodb_repl_data1:
mongodb_repl_data2:
mongodb_repl_data3:
运行良好,我可以docker exec -it <container> mongo --port <port>
进入所有容器上的 mongo shell。
我在本地的 27017 端口有我的主要“admin”mongo db。
我正在尝试像这样连接到他们:
await mongoose.connect("mongodb://localhost:30000,localhost:30001,localhost:30002,localhost:27017/DEV?replicaset=rs0",{
useNewUrlParser: true,useUnifiedTopology: true
})
当我运行时,它挂在这个 connect()
上,然后抛出:
Failed to inititate mongo connection: MongooseServerSelectionError: getaddrinfo ENOTFOUND mongo0
at NativeConnection.Connection.openUri (/Users/zac/Projects/score/app/application/server/node_modules/mongoose/lib/connection.js:821:32)
at /Users/zac/Projects/score/app/application/server/node_modules/mongoose/lib/index.js:342:10
at /Users/zac/Projects/score/app/application/server/node_modules/mongoose/lib/helpers/promiSEOrCallback.js:31:5
at new Promise (<anonymous>)
at promiSEOrCallback (/Users/zac/Projects/score/app/application/server/node_modules/mongoose/lib/helpers/promiSEOrCallback.js:30:10)
at Mongoose.connect (/Users/zac/Projects/score/app/application/server/node_modules/mongoose/lib/index.js:341:10)
at Object.exports.default (/Users/zac/Projects/score/app/application/server/dist/submodules/connectDb.js:13:34)
at start (/Users/zac/Projects/score/app/application/server/dist/index.js:31:34)
at Object.<anonymous> (/Users/zac/Projects/score/app/application/server/dist/index.js:47:1)
at Module._compile (internal/modules/cjs/loader.js:1075:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1096:10)
at Module.load (internal/modules/cjs/loader.js:940:32)
at Function.Module._load (internal/modules/cjs/loader.js:781:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
at internal/main/run_main_module.js:17:47 {
reason: TopologyDescription {
type: 'replicasetnoprimary',setName: 'rs0',maxSetVersion: 1,maxElectionId: 7fffffff0000000000000001,servers: Map(3) {
'mongo0:30000' => [ServerDescription],'mongo1:30001' => [ServerDescription],'mongo2:30002' => [ServerDescription]
},stale: false,compatible: true,compatibilityError: null,logicalSessionTimeoutMinutes: null,heartbeatFrequencyMS: 10000,localThresholdMS: 15,commonWireversion: 9
}
}
在 mongo 节点中,我这样做了:
config={"_id":"rs0","members":[{"_id":0,"host":"mongo0:30000"},{"_id":1,"host":"mongo1:30001"},{"_id":2,"host":"mongo2:30002"}]}
rs.initiate(config);
返回成功:
{
"ok" : 1,"$clusterTime" : {
"clusterTime" : Timestamp(1609794399,1),"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)
}
},"operationTime" : Timestamp(1609794399,1)
}
如果我这样做rs.status()
:
rs0:SECONDARY> rs.status()
{
"set" : "rs0","date" : ISODate("2021-01-04T21:06:53.009Z"),"myState" : 1,"term" : NumberLong(1),"syncSourceHost" : "","syncSourceId" : -1,"heartbeatIntervalMillis" : NumberLong(2000),"majorityVoteCount" : 2,"writeMajorityCount" : 2,"votingMembersCount" : 3,"writableVotingMembersCount" : 3,"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1609794412,"t" : NumberLong(1)
},"lastCommittedWallTime" : ISODate("2021-01-04T21:06:52.570Z"),"readConcernMajorityOpTime" : {
"ts" : Timestamp(1609794412,"readConcernMajorityWallTime" : ISODate("2021-01-04T21:06:52.570Z"),"appliedOpTime" : {
"ts" : Timestamp(1609794412,"durableOpTime" : {
"ts" : Timestamp(1609794412,"lastAppliedWallTime" : ISODate("2021-01-04T21:06:52.570Z"),"lastDurableWallTime" : ISODate("2021-01-04T21:06:52.570Z")
},"lastStableRecoveryTimestamp" : Timestamp(1609794411,3),"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout","lastElectionDate" : ISODate("2021-01-04T21:06:51.027Z"),"electionTerm" : NumberLong(1),"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(0,0),"t" : NumberLong(-1)
},"lastSeenopTimeAtElection" : {
"ts" : Timestamp(1609794399,"numVotesNeeded" : 2,"priorityAtElection" : 1,"electionTimeoutMillis" : NumberLong(10000),"numCatchUpOps" : NumberLong(0),"newTermStartDate" : ISODate("2021-01-04T21:06:51.051Z"),"wMajorityWriteAvailabilityDate" : ISODate("2021-01-04T21:06:52.545Z")
},"members" : [
{
"_id" : 0,"name" : "mongo0:30000","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 1485,"optime" : {
"ts" : Timestamp(1609794412,"t" : NumberLong(1)
},"optimeDate" : ISODate("2021-01-04T21:06:52Z"),"infoMessage" : "","electionTime" : Timestamp(1609794411,"electionDate" : ISODate("2021-01-04T21:06:51Z"),"configVersion" : 1,"configTerm" : 1,"self" : true,"lastHeartbeatMessage" : ""
},{
"_id" : 1,"name" : "mongo1:30001","state" : 2,"stateStr" : "SECONDARY","uptime" : 13,"optime" : {
"ts" : Timestamp(1609794399,"t" : NumberLong(-1)
},"optimeDurable" : {
"ts" : Timestamp(1609794399,"optimeDate" : ISODate("2021-01-04T21:06:39Z"),"optimeDurableDate" : ISODate("2021-01-04T21:06:39Z"),"lastHeartbeat" : ISODate("2021-01-04T21:06:51.038Z"),"lastHeartbeatRecv" : ISODate("2021-01-04T21:06:52.549Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","configTerm" : 0
},{
"_id" : 2,"name" : "mongo2:30002","lastHeartbeat" : ISODate("2021-01-04T21:06:51.040Z"),"lastHeartbeatRecv" : ISODate("2021-01-04T21:06:52.551Z"),"configTerm" : 0
}
],"ok" : 1,"$clusterTime" : {
"clusterTime" : Timestamp(1609794412,"operationTime" : Timestamp(1609794412,1)
}
在没有 Docker 的情况下,我尝试像这样使用 mongodb-topology-manager
:
这是在:MongoDB watch() to observe change in Database with NodeJS and Mongoose
import { ReplSet } from 'mongodb-topology-manager';
export default async () => {
// Starts a 3-node replica set on ports 31000,31001,31002,replica set
// name is "rs0".
const replSet = new ReplSet('mongod',[{ options: { port: 31000,dbpath: `${__dirname}/data/db/31000`,bind_ip: 'localhost' } },{ options: { port: 31000,dbpath: `${__dirname}/data/db/31001`,{ options: { port: 31001,{ options: { port: 31002,dbpath: `${__dirname}/data/db/31002`,bind_ip: 'localhost' } }
],{ replSet: 'rs0' });
try {
console.log("rep set discovering...");
await replSet.discover()
console.log("rep set purging...");
await replSet.purge();
console.log("rep set starting...");
await replSet.start();
console.log("rep set done.");
} catch (err) {
console.error("Failed to start replica sets:",err);
}
}
但是如果我运行它,它总是挂在 replSet.start()
上并且从不做任何事情,只是永远挂起。 db 路径存在且端口未在其他地方使用。
rep set discovering...
rep set purging...
rep set starting...
简单地说,如何正确启动 mongodb repl 集并通过 mongoose 连接到它?如果我需要在本地(而不是在 Docker 中)设置 repl,我该如何使用我的一个本地 mongodb 实例(以便我可以仅使用命令 $ mongo
或 $ mongod
而不是通过 docker 访问它们) )?
任何帮助将不胜感激
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)