0

我们有几个 .NET Core 3.0 Web 应用程序(英国南部)连接到在 Amazon Windows Server 2016 数据中心(EC2 实例)上运行的 MS SQL 2016 数据库。我们通过安装在 SQL Server 上的 Azure 中继/混合连接进行连接。

它已经运行了一年多,没有任何错误,但最近我们开始收到以下错误,大约每 30 个连接中有 1 个错误:

处理请求时发生未处理的异常。Win32Exception:现有连接被远程主机强行关闭。位置不明

SqlException:与服务器成功建立连接,但在登录前握手期间发生错误。(提供者:TCP 提供者,错误:0 - 现有连接被远程主机强行关闭。)

如果你再试一次,它通常会起作用。

在阅读了很多关于此的帖子后,我使用EnableRetryOnFailure()将瞬态错误处理添加到代码/弹性中到数据库连接。

我还尝试将Trusted_Connection=False添加到连接字符串中。

在此之后,您可能会看到连接重试多次,直到它工作,有时需要 20 秒或更长时间。尽管如此,可能有 100 个连接中的 1 个最终会因相同的错误而失败。

我们还查看了 TLS_DHE 错误https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/apps-forcibly-closed-tls-connection-errors但服务器上未安装 TLS_DHE 密码一点也不。

Windows 服务器上的事件日志或发生错误时的数据库日志中没有任何内容。

基础架构的最新变化:Panda 防病毒软件,将 Web 应用程序移至不同的 Azure 区域。

这几天我一直在阅读这方面的帖子,大部分都是很老的,而且略有不同。我正在寻找任何想法来尝试查明错误。谢谢。

编辑:我在 Microsoft/ServiceBus/Client 中发现了一些事件日志

HybridConnectionManager 跟踪:Microsoft.Azure.Relay.RelayException:无法从传输连接读取数据:现有连接被远程主机强行关闭。---> System.Net.WebSockets.WebSocketException:发生内部 WebSocket 错误。有关更多详细信息,请参阅 innerException(如果存在)。---> System.IO.IOException: Unable to read data from the transport connection: 一个现有的连接被远程主机强行关闭。---> System.Net.Sockets.SocketException:现有连接被远程主机在 System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult) 在 System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult) 处强行关闭--- 内部异常堆栈跟踪结束 ---

4

1 回答 1

0

嗯,这需要三个月的时间来解决,它涉及我们的网络支持团队、AWS 支持和 Azure 支持。

我已经回来三次编辑这个答案。解决方案在另一台服务器上返回,因此我们尝试了在一台服务器上有效的修复程序,但它们不起作用!

在 Azure Relay/Hyrbid 连接中,我们看到有问题的连接下有两个侦听器,而实际上应该只有一个。您安装和连接的每个混合连接管理器都显示为侦听器。

那么第二个听众在哪里呢?无处。它似乎是来自先前删除的连接的挂起的孤立链接。

删除幻像侦听器的唯一方法是

  • 在数据库服务器上卸载 HCM
  • 从所有使用它的 azure 应用程序中删除连接
  • 在 azure 中完全删除混合连接
  • 重新在 azure 中重新创建连接
  • 重新连接应用程序
  • 在数据库服务器上重新安装 HCM
  • 将 HCM 连接到新的混合连接

在此之后,我们在 Azure 中的连接下显示了一个侦听器,并且事情立即生效。

当您有两个侦听器时,数据在它们之间是负载平衡的,因此在我的情况下,有一半时间数据被路由到不存在的侦听器并失败。这就是为什么数据库服务器上没有出现日志的原因——它根本没有到达那里!

于 2021-04-28T11:35:29.050 回答