我正在使用sql Server 2008在C#中设置数据库自动故障转移,并且使用见证设置我具有“具有自动故障转移镜像的高安全性”,并且我的连接字符串看起来像
“Server = tcp:DC01; Failover Partner = tcp:DC02; database = dbname; uid = sewebsite; pwd = somerndpwd; Connect Timeout = 10; Pooling = True;”
在测试期间,当我关闭主服务器上的sql Server服务时,自动故障转移就像一个魅力,但如果我使主服务器脱机(通过关闭服务器或查杀网卡)自动故障转移不起作用,我的网站刚出来.
我找到了this article,其中第二个帖子表明它是因为我们使用的命名管道在主体离线时不起作用,但我们在连接字符串中强制使用TCP.
解决方法
在与MS合作一周后,我们已经弄清楚了为什么会这样.
本质上,应用程序没有故障转移,因为它需要确保数据库已经故障转移 – 并且在连接确定数据库已经故障转移之前,sql连接超时.
确认数据库已故障转移(具有所有默认tcp注册表设置)的过程是:
>尝试与校长沟通,看到它不再是校长
>与故障转移通信以确保它已经故障转移并且它现在是新的主体.
当主体关闭时,此通信大约需要21秒,因为它将:
>尝试与校长沟通,等待3秒,超时
>尝试再次与校长沟通,等待6秒,等待12秒,超时
>尝试与故障转移伙伴进行通信,看到它已经故障转移,因此应用程序中进行故障转移.
因此,如果您的sql连接没有等待21秒(实际上可能更多),那么它将在完成此舞蹈之前超时,并且它根本不会进行故障转移.
解决方案是将连接字符串中的超时设置为较大值,我们使用60秒只是为了安全.
干杯