【问题标题】:MongoDB replica set, error when connecting from mongoose node.jsMongoDB 副本集,从 mongoose node.js 连接时出错
【发布时间】: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


【解决方案1】:

您必须使用一个副本集,并且一个副本集可以有多个成员。 并确保您已在 etc/hosts 文件中的主机中添加了副本集节点。 就像下面的例子一样 -

127.0.0.1   mongoset1 mongoset2 mongoset3

注意 - 127.0.0.1 是您的主机,mongoset1、mongoset2 和 mongoset3 是副本集的节点(成员)。

【讨论】: