本地mongo停止时,Express无法连接到mongodb副本集

时间:2017-11-24 19:17:15

标签: node.js mongodb mongodb-replica

我有一个mongodb replica set,其中包含以下配置:

  • M1(192.168.77.3)primary(主机App1)
  • M2(192.168.77.4)secondary(主机App2)
  • M3(192.168.77.5)secondary(主机App3)
  • M4仲裁员

这是我的Express代码连接到db(我使用mongoose作为ODM):

 const config = {
    db: `mongodb://192.168.77.3,192.168.77.4,192.168.77.5/mydb`,
    dbOptions: {
      useMongoClient: true,
      reconnectTries: Number.MAX_VALUE,
      replicaSet: process.env.REPLICA_SET,
      poolSize: 100,
      keepAlive: 1,
      connectTimeoutMS: 30000,
      socketTimeoutMS: 300000,
      w: 1
    }
  }
mongoose.connect(config.db, config.dbOptions, (error) => {
  if (error) {
    console.log('Error on connecting to th db: ', error)
    console.log('\x1b[31m', '*** PLEASE CONNECT TO DATABASE BEFORE RUN SERVER', '\x1b[0m')
    process.exit(1)
  }
  callback()
})

该应用按预期工作。 当M1关闭时,M2或M3被选为primaryApp2App3仍在工作,但App1无法连接到replica set 1}},错误消息:

MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]

这是App1上的mongodb配置:

storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

net:
  port: 27017
  bindIp: [127.0.0.1, 192.168.77.3]

replication:
  oplogSizeMB: 3000
  replSetName: my_rs

我的配置有什么问题吗?

1 个答案:

答案 0 :(得分:0)

您不能在一个配置文件中混合多个节点的IP地址。

你的bindIp字符串

bindIp: [127.0.0.1, 192.168.77.4, 192.168.77.5]

应该是

bindIp: "127.0.0.1,192.168.77.3"

在第一个节点和

bindIp: "127.0.0.1,192.168.77.4"

在第二个节点。等等......所以,你可以拥有localhost绑定和其他属于该节点的地址。

我最初的回答是错误的,因为我认为它与mongooos有关,我不知道。