Время ожидания подключения к MongoDb на виртуальной машине Azure

У меня возникают проблемы с тайм-аутом при подключении моего веб-приложения Azure к базе данных MongoDb, размещенной на виртуальной машине Azure.

2015-12-19T15:57:47.330+0100 I NETWORK  Socket recv() errno:10060 A connection attempt 
 failed because the connected party did not properly respond after a period of time, 
 or established connection failed because connected host has failed to respond.
2015-12-19T15:57:47.343+0100 I NETWORK  SocketException: remote: 104.45.x.x:27017 error: 
 9001 socket exception [RECV_ERROR] server [104.45.x.x:27017]
2015-12-19T15:57:47.350+0100 I NETWORK  DBClientCursor::init call() failed

В настоящее время mongodb настроен на одном сервере (только для разработчиков) и доступен через общедоступный IP-адрес. Веб-сайт подключается к нему с помощью доменного имени Azure (*.westeurope.cloudapp.azure.com) и без виртуальной сети.

Обычно все работает хорошо, но через несколько минут бездействия я получаю исключение тайм-аута. То же самое произойдет при использовании оболочки MongoDb с моего ПК, поэтому я совершенно уверен, что это проблема на стороне mongodb.

Мне не хватает какой-то конфигурации?


person Davide Icardi    schedule 19.12.2015    source источник


Ответы (2)


После некоторого поиска здесь мои соображения:

  • Обычно рекомендуется реализовать некоторую логику повторных попыток для каждого ресурса, к которому вы обращаетесь в Azure (база данных, виртуальная машина и т. д.). Для MongoDb существует частичная реализация, так что вы, возможно, должны написать свою собственную. См. также эту проблему и это.
  • Если возможно, все ресурсы в Azure должны находиться в одной и той же виртуальной сети Azure (таким образом, все подключения выполняются с использованием частного IP-адреса Azure вместо общедоступного IP-адреса. Это также полезно по соображениям безопасности, поскольку вам не нужно открывать конечную точку для общего доступа). .
  • При развертывании MongoDb в Azure старайтесь следовать официальным рекомендациям MongoDb.
  • В этом конкретном случае вы должны установить значение net.ipv4.tcp_keepalive_time ниже, чем значение TCP Keep Alive Azure, которое по умолчанию составляет 240 секунд. Таким образом, соединение закрывается, и драйвер MongoDb может перехватить это условие и открыть новое соединение. Если соединение закрыто Azure, драйвер не сможет его перехватить. Если вы хотите изменить этот параметр в Azure (не рекомендуется), вы можете найти его в конфигурации общедоступного IP-адреса.

В моей среде разработки я установил net.ipv4.tcp_keepalive_time на 120, и теперь все работает нормально. Учтите, что если вы размещаете MondoDb внутри контейнера Docker, вы должны установить этот параметр на хосте Docker.

Вот еще несколько полезных ссылок:

person Davide Icardi    schedule 19.12.2015

При использовании драйвера С# Mongo мы решили эту проблему, установив следующее

MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1);
person rrrr    schedule 22.12.2015