Клиентское соединение MongoDB NodeJS с набором реплик не будет повторно подключаться при отключении основного

#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
        }