LINUX.ORG.RU

Виснет приложение node.js при падении реплики MongoDB

 


0

1

Добрый день. Есть 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(…), то ничего не будет выведено на консоль … } )



Последнее исправление: NatalliaF (всего исправлений: 6)

В чем может быть причина?

Вероятно, в непонимании сетевой организации?

replica set из 2 нод и арбитра (все на разных машинах)

То есть, все с разными адресами? Через какой космос запросы из express попадают в монгу?

Кроме того, документация по монге гласит:

To connect to a replica set deployment, specify each node’s hostname and port number, separated by commas, and the replica set name as the value of the replicaSet parameter in the connection string.

Не наблюдаю в connection string, процитированной в ОП, данного параметра.

aol ★★★★★
()
Последнее исправление: aol (всего исправлений: 1)
Ответ на: комментарий от aol
  1. Для работы с MongoDB в приложении используется библиотека Mongoose.

  2. Вариант строки подключения mongoURI = «mongodb://[login]:[password]@[node1_ip]:27017,[node2_ip]:27017/[db_name]?authSource=admin&replicaSet=[rs_name]&readPreference=primaryPreferred&directConnection=false» тоже не проходит (та же проблема)

  3. И так тоже не работает mongoURI = «mongodb://[login]:[password]@[node1_ip]:27017,[node2_ip]:27017/[db_name]?connectTimeoutMS=30000&authSource=admin&replicaSet=[rs_name]&readPreference=primaryPreferred&directConnection=false»

NatalliaF
() автор топика