我们有一个运行一些nodeJS服务的AWS服务器。连接到MS sql的服务随机崩溃,并显示消息"无法连接到数据库服务器:1433-无法连接(序列)"。
我们正在运行:
应用服务器:Linux Ubuntu 14.4AWS m5NodeJS:8.11.2服务正在使用包mssql最新版本(4.3.0)。这包括乏味的2.7.1。
数据库服务器:Windows服务器2012。sql server 2012
吞吐量:大约300rpm,当吞吐量较低(大约20rpm)时也会发生错误。应用程序通过PM2在集群中运行(运行4次)。我们看到错误同时发生在所有4个实例上,但有时也发生在1或2个实例上。
我们尝试了什么:
- 使用繁琐的3.0.1升级到mssql的alpha版本。没什么区别
- 从亚马逊M4机器升级到M5机器,增强了网络功能
- 正在更改应用程序中的池设置。我们尝试将最小连接数设置为0或低/高值。最大值也为低/高值,但无效
- 将服务器复制到新计算机
- 将idleTimeoutMillis设置为1秒
- ping数据库服务器以查看是否存在连接问题,但当错误发生时,我们没有看到奇怪的ping
应用程序启动时的连接:
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)
{
});
错误由"on error"处理程序捕获。
该错误在服务间随机发生。有些人比其他人有更多的错误实例。我们没有选择了。如果我们能看到更详细的错误,你知道吗?
我有几个建议。
首先,你有多确信这些错误实际上是个问题?如果您的代码只是重试而不是退出,那么之后连接是否稳定,或者连接是否可以在查询过程中中断?
(在查询过程中丢弃连接显然不好,但连接上的随机故障(可以通过重试修复)是IMHO的最佳问题。)
忽略潜在的代码修复,我想知道当你说你"将服务器复制到新机器"时——你是使用最新的Windows server 2012启动了一个新的AMI,还是镜像和克隆?如果您的数据库服务器使用了几年,那么您的实例中可能实际运行了过时的网络驱动程序,可能会让您遇到一些问题。
如果您想探索这一点,可以尝试在新启动的AMI上从头开始重建整个数据库服务器。或者,您可以在现有实例上升级PV驱动程序、网络适配器和EC2Config,可以在以下链接中找到说明:
https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/Upgrading_PV_drivers.html#aws-光伏升级
https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/sriov-networking.html#enable-增强型网络
https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/UsingConfig_Install.html