Добрый день. Есть replica set из 2 нод и арбитра (все на разных машинах). Приложение node.js (express) имеет ряд api для получения/обновления и т.д. информации как в БД MongoDB, так и в БД под управлением другой СУБД. Если принудительно завершить одну из нод, то Mongo Shell показывает, что другая нода работает, она primary, я могу спокойно работать с данными в Mongo Shell. Но если при этом обратиться к любому api приложения, даже тому, который не работает с MongoDB, запрос как будто отправляется в космос: дождаться ответа нереально, запрос подвисает. Ощущение, что само приложение виснет. Но стоит только восстановить ноду, как приложение «просыпается» и возвращает ответ. В чем может быть причина?
mongoose 7.4.1, node 14.17.1, express 4.17.1
Вот строка подключения к replica set: mongoURI = «mongodb://[login]:[password]@[node1_ip]:27017,[node2_ip]:27017/[db_name]?authSource=admin&readPreference=primaryPreferred&directConnection=false»
Вот как происходит подключение к БД в коде: await mongoose.connect(mongoURI, { useNewUrlParser: true, useUnifiedTopology: true, maxPoolSize: 10, serverSelectionTimeoutMS: 30000 });
Единственная вещь, которая помогает в такой ситуации - убрать неактивную ноду из репликасета, не трогая строку подключения к БД. Но мне нужно добиться автоматического восстановления работоспособности приложения.
Согласно найденной в глобальной сети информации: The configuration parameter «useUnifiedTopology» has its own Autodiscovery and DB reconnect implementation. Unified topology auto connect the primary and secondary node for writing and reading the bson document. And reconnect time of unifiedTopology is 2 minutes as per the Mongoose library code. In the replicaset if one Node went down the mongoose wait for the node election and auto reconnect to the primary node with unified topology.
У меня данный параметр установлен, но что-то мешает его действию?
router.get( ‘/apiName’, async (req, res) => { // я не попадаю даже сюда, в самое начало обработчика; // если сюда поместить console.log(…), то ничего не будет выведено на консоль … } )