【问题标题】:SQL Server 2014 Cluster Failover Instance, how to reconnect on failover?SQL Server 2014 Cluster Failover Instance,如何在故障转移时重新连接?
【发布时间】:2015-02-17 06:04:02
【问题描述】:

我在测试环境中设置了一个 Windows Server 故障转移群集,并在其上安装了一个群集 SQL Server 2014 实例。集群有两个节点,网络名称为 SQLINSTANCE。

现在,从小型控制台应用程序中,我有一个简单的循环(运行良好),每 100 毫秒查询一次测试数据库:

while (true)
{
   using (var dbContext = new TestDBContext())
   {
       foreach (var person in dbContext.People)
       {
            Console.WriteLine(person.FirstName + " " + person.LastName);
            System.Threading.Thread.Sleep(100);
       }
    } 
 }

现在我强制在集群上进行故障转移(通过关闭一个节点,或从集群管理器将 SQL 服务器角色移动到另一个节点)。故障转移过程大约需要 50 秒。 当故障转移完成时,我的测试循环抛出一个 EntityException,说“底层提供程序在打开时失败”。 InnerException 是 SqlClient.SqlException,表示“无法打开登录请求的数据库“TestDB”。登录失败。用户“域\用户”登录失败。”

我已经像这样设置了我的连接字符串:

 <add name="TestDBEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;
         provider connection string=&quot;data source=sqlinstance;initial catalog=TestDB;integrated security=True;
         MultiSubnetFailover=true;
         connect timeout=150;
         ConnectRetryCount=15;
         ConnectRetryInterval=10;
         MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

我所期待的是 SqlClient 尝试重新连接到我的集群实例 15 次,间隔为 10 秒,然后在故障转移完成后成功重新连接。但它仍然不断抛出异常。

我尝试更改“Connect Timeout”、“ConnectRetryCount”和“ConnectRetryInterval”值,但故障转移后仍然没有成功完全重新连接...

我很困惑,我在这里缺少什么,或者我不能依赖底层的 SqlClient,我是否必须在 DAL 中提供我的 owm 重试逻辑??

【问题讨论】:

  • 例外是?我问是因为故障转移可能已完成,但并非所有数据库都在线...
  • 这是一个 EntityException,表示“底层提供程序在打开时失败”。 InnerException 是 SqlClient.SqlException,表示“无法打开登录请求的数据库“TestDB”。登录失败。用户“域\用户”登录失败。”它在故障转移完成时被抛出。顺便说一句,我还用这个详细的异常信息编辑了我的问题......
  • 问题是无法打开数据库。为什么会出现这种情况?每次重新启动 SQL Server 时,它都需要对数据库进行一些检查。根据大小和待处理的交易,它可能需要几秒钟到几天的时间。您可以在错误日志中验证这一点。您会发现诸如“正在启动数据库 'dbname'”之类的消息以及其他为您提供检查状态信息的消息。
  • @user_0,好吧,这听起来很合理。所以实例已启动,我的应用程序可以建立连接,但数据库尚不可用......您知道任何解决方案,可能内置在 .NET Framework 中吗?我阅读了一些关于 EF6 的执行策略和 SqlAzureExecutionStrategy 的内容。你知道这是否合适,还是我必须提供我自己的逻辑?
  • 对此不确定,抱歉。我有一些不同语言的服务。他们通常每 x 次重传连接(x 变量取决于服务或应用程序的种类)

标签: c# .net sql-server failover alwayson


【解决方案1】:

我不是这方面的专家,尤其是我不确定 C# 如何处理数据库连接。我在我们的一个应用程序中看到的是,您在 AlwaysOn 集群中打开了与数据库的连接,并且当您对应用程序进行故障转移时,该连接仍在使用相同的底层 TCP 连接,该连接实际上将连接到现在已经拥有的节点改变了。对我们来说,解决方案是在捕获异常时正确重新连接。

【讨论】:

  • 嗨@ikkjo。遇到了你的这个答案。我认为我们在我们的环境中面临着类似的情况,尽管故障转移应用程序仍在连接到现在的辅助节点。您能否详细说明一下您的解决方案是什么?
  • 嗨@Crabster。不确定我能给你更多。应用程序已经检查了数据库连接的健康状况并尝试在断开连接时重新连接。但是,当尝试对数据库进行更改时,我们遇到了异常。最终归结为以下几点(虽然不是 100% 确定这一点): 将请求发送到服务器时发生了传输级错误。 (provider: TCP Provider, error: 0 - 一个已存在的连接被远程主机强行关闭。) 所以我们捕捉到了异常并重新打开了数据库连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 2010-09-16
相关资源
最近更新 更多