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, чего я не знаю.