У нас есть mongodb с драйвером mgo для golang.Есть два сервера приложений, которые подключаются к mongodb, кроме приложений (golang binaries).Mongodb работает как набор реплик, и каждый сервер соединяет два основных или дополнительных в зависимости от текущего состояния реплики.
Мы испытали SocketException handling request, closing client connection: 9001 socket exception
на одном из серверов mongo (что привело к гибели соединения с mongodb из наших приложений. После этого набор реплик продолжал функционировать, но наш второй сервер (на которомошибка не произошла) соединение также прервалось.
В логах golang это проявлялось как:
read tcp 10.10.0.5:37698-\u003e10.10.0.7:27017: i/o timeout
Почему это произошло? Как это могло произойти?быть предотвращенным?
Как я понимаю, mgo
подключается ко всей реплике по URL (он определяет всю топологию по URL-адресу одного экземпляра), но почему отключено соединение на одном из серверов?это на втором?
Редактировать:
- Полный путь к пакету, который используется
"gopkg.in/mgo.v2"
- К сожалению, здесь нельзя обмениваться файлами монго. Но кроме socketexecptionЖурналы mongo не содержат ничего полезного.Есть указание на некоторую степень конкуренции за блокировку, когда время получения блокировки довольно высокое, но ничего кроме этого
- MongoDB делает некоторые тяжелые операции.Несколько раз, но в последнее время не было никаких необычных всплесков, так что нет ничего сверх нормального