最佳实践:如何检测SQ​​L Server是否可用,如果没有则进行故障转移

时间:2010-10-15 16:05:04

标签: c# .net sql-server

我正在寻找一种方法来检测SQL Server是否无法响应(超时/异常等),这样如果我们的C#/ .net程序试图访问服务器请求服务器停机维护,它就会跳转并自动尝试另一个。

我想要一个解决方案,我们进行SQL连接,然后获得超时。我们可以建立一个WCF服务并问一个,但我认为这有点过分。

此处不存在多个服务器位置之间的同步问题。

目前我们的开发平台是SQL2008express,目前很多,但后来我们可能会切换到真正的SQL2008服务器(或者什么是最新的服务器)。

客户端将连接到“最后已知的动态列表”中的“第一个已知”,询问“rootserver”或硬编码配置以进行首次查找。

当客户端失去连接时,他们将自动尝试重新连接到群集中的其他节点,并使用任何返回首先回复。节点将通过我们也在云中分发的其他服务来连接和共享数据。

我们知道镜像和群集可能通过大型许可证获得,但我们的设置需要更加动态的“链接”,我们相信这种方法可以更好地满足我们的需求。

所以...具体来说:

  

我们需要检测SQL服务器何时脱机,何时不再可用。例如。在交易过程中或当我们尝试连接时。

是进行“try-catch”异常处理的最佳方法,还是在查看WAN并使用C#/时有更好的技巧.net =

修改

我收到了许多使用故障转移服务器的好主意,但我想要一个更专业的方法,那么查询服务器的最佳方法是什么?

情况: 在单独的WAN / IP上运行的4个不同的SQL服务器,每个都将维护一个“其他人在哪里”的列表(点对点)。它们将自动地相互移动数据(很像RAID设置,其中数据分布在多个驱动器上)

客户端从入口点服务器重试列表,并询问第一个可用的列表。 如果客户端要求服务器“关闭以进行维护”或者数据已移至其他服务器之一,则必须自动询问列表中的下一个服务器。

我们在寻找什么......

是从C#/ .net中检测服务器当前不可用的最佳方式。

  1. 我们可以连接到一个服务,当我们松开它时,服务器关闭
  2. 我们可以创建一个“dbConnectionSqlServer3.open()”并等待超时。
  3. 我们可以投资“真正的集群服务器”,付出很多钱+将自己绑定到1个SQL服务器类型(SQL平台将来可能会发生变化,所以这不是一个真正的选择)
  4. 那么你的投票结果如何:1还是2? 或者你能想出一个能够超越想法的数字4吗? :O)

2 个答案:

答案 0 :(得分:1)

在ConnectionString中,您可以指定故障转移合作伙伴,例如

Data Source=<MySQLServer>;Failover Partner=<MyAlternateSQLServer>;Initial Catalog=<MyDB>;Integrated Security=True

http://www.connectionstrings.com上有一节讨论DataBase镜像。

答案 1 :(得分:1)

我可能采取不同的方法。

我指定一个服务器(带有故障转移伙伴)作为服务器列表的持有者。它应该监视所有其他服务器的可用性。

当客户端最初想要连接时,它应该联系列表服务器并询问它要使用什么。从那时起,客户应该坚持使用它,除非检测到故障。此时它应联系列表服务器以获取新的。

列表服务器可以通过告诉客户端连接到哪个来实现您想要的任何类型的负载平衡。此外,部署新服务器很容易,因为这个主服务器将维护唯一的“列表”。

这完全忽略了您可能遇到的任何类型的服务器同步问题。

一个主要的好处是,通过让中央服务器进行监控,您的客户端不必通过3台,5台或10台服务器就可以找到一台服务器。这将提高响应能力。

<强>更新
@BerggreenDK:检测服务器是否出现故障的最好的,也许是唯一可靠的方法是连接到它并运行一个简单的查询。所有其他机制,如ping,简单检查端口是否打开等,可能会产生误报。如果服务器本身已启动但SQL Server已关闭(例如:数据库处于脱机状态),即使在该服务器上运行进程本身也可能会给出错误读数。

最终,听起来您的客户端必须连接到其中一个网关服务器并获取一个sql服务器的简短列表以尝试连接。失败时,它必须通过该短列表轮换。如果全部关闭,则必须返回网关并要求新列表以启动该过程。