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


9

我正在使用SQL Server 2008在C#中设置DB自动故障转移,并且使用见证程序设置具有“具有自动故障转移镜像的高安全性”,并且我的连接字符串看起来像

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

在测试过程中,当我关闭主体服务器上的SQL Server服务时,自动故障转移就像超级按钮一样工作,但是如果我使主体服务器脱机(通过关闭服务器或杀死网卡),自动故障转移将无法正常工作,网站刚刚超时。

我发现这篇文章的第二个帖子暗示了这一点,因为我们使用的是命名管道,当主体脱机时该管道不起作用,但是我们在连接字符串中强制使用TCP。

要使此数据库自动故障转移正常工作,我缺少什么?


是否需要[C#]标签?它似乎并不是C#特有的。
加布

Answers:


6

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

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

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

  1. 尝试与校长交流,请注意不再是校长
  2. 与故障转移进行通信,以确保它已进行了故障转移并且现在是新的主体。

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

  1. 尝试与校长沟通,等待3秒,超时
  2. 尝试再次与校长通信,等待6秒,超时
  3. 尝试再次与校长通信,等待12秒,超时
  4. 尝试与故障转移伙伴进行通信,请参见故障转移伙伴,以便在应用程序中进行故障转移。

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

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

干杯


0

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

您还可能遇到伙伴和镜像未相互连接的情况,但是伙伴和镜像数据库仍独立连接到见证人。在那种情况下,见证人没有发现任何错误(因此也没有故障转移)。但是您提到要关闭服务器本身,因此听起来不太可能。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.