当主服务器物理离线时,c# 中的数据库自动故障转移不起作用

当主服务器物理离线时,c# 中的数据库自动故障转移不起作用

我正在使用 SQL Server 2008 在 C# 中设置数据库自动故障转移,并且使用见证设置具有“高安全性和自动故障转移镜像”,我的连接字符串如下所示

"Server=tcp:DC01; Failover Partner=tcp:DC02; database=dbname; uid=sewebsite;pwd=somerndpwd;Connect Timeout=10;Pooling=True;"

在测试期间,当我关闭主服务器上的 SQL Server 服务时,自动故障转移可以正常工作,但如果我使主服务器脱机(通过关闭服务器或关闭网卡),自动故障转移将不起作用,我的网站就会超时。

我发现本文倒数第二篇帖子表明这是因为我们使用了命名管道,当主体离线时,命名管道不起作用,但我们在连接字符串中强制使用 TCP。

我缺少什么才能使这个数据库自动故障转移正常工作?

答案1

与 MS 合作一周后,我们弄清楚了为什么会发生这种情况。

本质上,应用程序没有进行故障转移,因为它需要确保数据库已进行故障转移 - 并且在连接确定数据库已进行故障转移之前,sql连接已经超时。

确认数据库已故障转移(使用所有默认的 tcp 注册表设置)的过程如下:

  1. 尝试与校长沟通,确保不再是校长
  2. 与故障转移服务器进行通信,以确保其已完成故障转移并且现在是新的主体。

当主体瘫痪时,此通信大约需要 21 秒,因为它将:

  1. 尝试与校长沟通,等待3秒,超时
  2. 尝试再次与校长沟通,等待6秒,超时
  3. 尝试再次与校长沟通,等待12秒,超时
  4. 尝试与故障转移伙伴进行通信,查看其是否已发生故障转移,然后在应用程序中进行故障转移。

因此,如果您的 SQL 连接没有等待 21 秒(实际上可能更多),那么它将在完成此舞蹈之前超时,并且根本不会进行故障转移。

解决方案是将连接字符串中的超时设置为较大的值,为了安全起见,我们使用 60 秒。

干杯

答案2

我想知道在您进行测试时是否没有满足自动故障转移的条件?具体来说 - 如果发生故障时数据库未与镜像同步(从 sys.database_mirroring 检查镜像状态)并且/或者见证服务器和镜像服务器当时未连接(通过参与角色之间的 ping 进行测试)。

您还可能遇到合作伙伴和镜像数据库未相互连接的情况 - 但合作伙伴和镜像数据库仍独立连接到见证服务器。在这种情况下,见证服务器看不到任何问题(因此不会发生故障转移)。但您提到您关闭了服务器本身,所以这种情况听起来不太可能。

或者您是说故障转移最终会发生,但重新连接失败?在这种情况下,检测和故障转移时间取决于主服务器故障的方式以及恢复镜像数据库的总时间。

相关内容