Express не может подключиться к набору реплик mongodb при остановке локального монго

У меня есть mongodb replica set со следующим конфигом:

  • M1 (192.168.77.3) основной (хост App1)
  • M2 (192.168.77.4) вторичный (хост App2)
  • M3 (192.168.77.5) вторичный (хост App3)
  • Арбитр М4

Вот мой экспресс-код для подключения к БД (я использую 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 избираются primary, App2 а также App3 все еще работает, НО App1 НЕ МОЖЕТ подключиться к replica set с сообщением об ошибке:

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

Это мой конфиг mongodb на App1:

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 ответ

Вы НЕ МОЖЕТЕ смешивать IP-адреса нескольких узлов в одном файле конфигурации.

Ваша строка привязки

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"

на втором узле. И так далее... Итак, вы можете привязать локальный хост и другие адреса, которые принадлежат этому узлу.

Мой первоначальный ответ был неправильным, потому что я думал, что это как-то связано с mongooos, чего я не знаю.

Другие вопросы по тегам