Случайные ошибки подключения к MS SQL из приложения nodeJS
У нас есть сервер AWS, на котором запущены некоторые службы nodeJS. Службы, подключающиеся к MS sql, случайным образом аварийно завершают работу с сообщением "Не удалось подключиться к серверу базы данных:1433 - Не удалось подключиться (последовательность)".
Мы работаем на:
Сервер приложений: Linux Ubuntu 14.4 AWS m5 NodeJS: 8.11.2 Службы используют последнюю версию пакета mssql (4.3.0). Это включает в себя утомительный 2.7.1.
Сервер БД: Windows Server 2012. SQL Server 2012
пропускная способность: около 300 об / мин, ошибка также возникает, когда пропускная способность ниже (около 20 об / мин). Приложение работает в кластере через PM2 (запускается 4 раза). Мы видим, что ошибка происходит на всех 4 одновременно, но иногда также на 1 или 2 экземплярах.
Что мы пробовали:
- Обновление до альфа-версии mssql с утомительным 3.0.1. Не имеет значения
- Обновление с машины Amazon M4 до машины M5 с улучшенной сетью
- Изменение настроек пула в приложении. Мы попытались установить мин соединения на 0 или низкое / высокое значение. Макс также до низкого / высокого значения, но безрезультатно.
- Дублируйте сервер на новую машину.
- Установка idleTimeoutMillis на 1 секунду
- Пингует сервер БД, чтобы узнать, есть ли проблема с подключением, но мы не видим странных пингов, когда происходит ошибка.
Подключение при запуске приложения:
App.sqlConnection = new App.SQL.ConnectionPool(config, function(err) {
if(err){
Log.error(err);
process.exit(1);
}
App.sqlConnection.on('error', err => {
Log.error(`There was a connection err : ${err}`);
process.exit(1);
});
});
запрос;
var request = new App.SQL.Request(App.sqlConnection);
request.query(sQuery, function(err,results)
{
});
Ошибки отлавливаются обработчиком "при ошибке".
Ошибка происходит случайно в разных сервисах. Некоторые имеют больше случаев ошибки, чем другие. У нас заканчиваются варианты. Любая идея, если мы можем увидеть более подробные ошибки?
1 ответ
У меня есть пара предложений.
Во-первых, насколько вы уверены, что эти ошибки на самом деле являются проблемой? Если ваш код просто повторяет, а не завершает свою работу, стабильны ли впоследствии соединения или соединение может разорваться в середине запроса?
(Соединения, сбрасываемые в середине запросов, явно не годятся, но случайные сбои в соединении, которые могут быть исправлены при повторных попытках, являются лучшим видом проблемы, имеющей ИМХО.)
Не обращая внимания на возможное исправление в коде, мне интересно, когда вы говорите, что вы "дублировали сервер на новую машину" - вы запускали новый AMI с использованием последней версии Windows Server 2012, или вы создавали образ и клонировали? Если вашему серверу баз данных уже пару лет, возможно, вы используете устаревшие сетевые драйверы в вашем экземпляре, что может привести к некоторым сбоям.
Если вы хотите изучить это, вы можете попытаться восстановить весь сервер базы данных с нуля на недавно запущенном AMI. Кроме того, вы можете обновить драйвер PV, сетевой адаптер и EC2Config в существующем экземпляре. Инструкции можно найти по следующим ссылкам:
https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/Upgrading_PV_drivers.html
https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/sriov-networking.html
https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/UsingConfig_Install.html