#node.js #mongodb #replicaset
#node.js #mongodb #набор реплик
Вопрос:
MongoClient.connect('mongodb://mongo1,mongo2,mongo3?replicaSet=rs', {
useUnifiedTopology: true,
}, (err, mongoClient) => {
setTimeout(() => {
mongoClient.db("mydb").collection('mycollection').insertOne({...})
}, 10000)
})
Должен ли MongoClient повторно подключаться к другому экземпляру mongo в ReplicaSet при отключении основного и при использовании UnifiedTopology? Потому что в этом примере MongoClient по-прежнему указывает на старый основной экземпляр. Это предполагаемое поведение?
Редактировать
Комментарии:
1. Вы можете попробовать использовать формат uri строки подключения в соответствии с документами . Кроме того, опубликуйте конфигурацию вашего набора реплик.
Ответ №1:
Попробуйте использовать **mongoose**
как таковой :
if(config.db.indexOf('replicaSet') > - 1) {
dbOptions = {
db: {native_parser: true},
replset: {
auto_reconnect:false,
poolSize: 10,
socketOptions: {
keepAlive: 1000,
connectTimeoutMS: 30000
}
},
server: {
poolSize: 5,
socketOptions: {
keepAlive: 1000,
connectTimeoutMS: 30000
}
}
};
}
var db = mongoose.connect(config.db, dbOptions);
где
config.db = 'mongodb://USER:PW@host1:port1,host2:port2/DBNAME?replicaSet=RSNAME'
Дополнительная информация :
Блок «сервер» вызывается только тогда, когда URI соединения содержит одно некластеризованное соединение (иначе одну строку подключения).
Блок «replset» вызывается только тогда, когда URL-адрес соединения содержит список строк соединения, разделенных запятыми (он же набор репликации).
var options = {
db: {
native_parser: true
},
// This block gets run for a non replica set connection string (eg. localhost with a single DB)
server: {
poolSize: 5,
reconnectTries: Number.MAX_VALUE,
ssl: false,
sslValidate: false,
socketOptions: {
keepAlive: 1000,
connectTimeoutMS: 30000
}
},
// This block gets run when the connection string indicates a replica set (comma seperated connections)
replset: {
auto_reconnect: false,
poolSize: 10,
connectWithNoPrimary: true,
ssl: true,
sslValidate: false,
socketOptions: {
keepAlive: 1000,
connectTimeoutMS: 30000
}
}
};
Этот блок работал как на localhost, так и на рабочей среде.
Комментарии:
1. Как насчет конфигурации для клиента mongodb без mongoose?
2. Вы можете добавить сценарий оболочки для выполнения таких действий, как упомянутая здесь ссылка
3. Я опубликую новый ответ ниже, если это поможет, если это поможет, пожалуйста, поддержите его!
4. Я попробовал подключиться с помощью этих параметров, но безуспешно « autoReconnect: false, poolSize: 10, SocketOptions: { connectTimeoutMS: 30000, keepAlive: true }, native_parser: true «
5. вы пробовали сценарий оболочки?
Ответ №2:
Согласно документации Mongo 3.4: в 3.4:
mongo "mongodb://host1,host2,host3/myDB?replicaSet=myRS"
или
mongo "mongodb://host1:27017,host2:27017,host3:27017/myDB?replicaSet=myRS"
Комментарии:
1. да, как я уже писал в вопросе, строка подключения, которую я использую, именно такая. mongodb://mongo1:27017,mongo2:27017,mongo3:27017/admin?ReplicaSet=rs. Но не повезло
Ответ №3:
Оказывается, фактической проблемой была плохая конфигурация, у 3-го узла был приоритет 0 и голоса 0 вместо 1
{
"_id" : 2,
"host" : "mongo3:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 0
}