我正在寻找由 SQL Server 提供支持的应用程序的高可用性选项。
要求如下:
- 针对存储故障的 HA 保护。
- 当其中一个数据库服务器正在进行软件更新(例如,Windows Update/SQL Server 服务包的计划中断)时的数据可访问性。
- 一定不能涉及太多的硬件采购。
- 该应用程序是一个 ASP.NET Web 应用程序。
- Web 应用程序的用户拥有自己的数据库实例。
我看到过两个主要选项:SQL Server 故障转移群集和 SQL Server 镜像。
我了解 SQL Server 故障转移群集需要购买共享磁盘阵列,并且如果共享存储出现故障,则不提供任何保护(因此文档建议在两个群集之间设置镜像)。
数据库镜像似乎是更便宜的选择(因为它只需要两个数据库服务器和一个简单的见证箱)——但我听说当你有大量数据库时它效果不佳。我正在开发的应用程序涉及为每个客户端提供他们自己的数据库——可能有数百个数据库。由于我们已部署自动化系统,设置镜像没有问题。
我的最后一点涉及故障转移如何针对客户端连接进行工作 - SQL Server 故障转移群集使用 MSCS,这意味着群集对客户端不可见 - 连接尝试可能会在故障转移期间失败,但简单的重新连接将使其再次工作。然而,据我所知,镜像要求客户端了解镜像伙伴:如果客户端无法连接到主服务器,则它会尝试辅助服务器。
我想知道这与 ASP.NET 应用程序中的连接池如何工作 - 客户端连接故障转移是否意味着当连接池在每次尝试连接时尝试主服务器时可能会有 2 秒(假设 2000 毫秒 TCP 超时策略)的暂停?
我读到过,镜像可以在 MSCS 上使用,这意味着客户端不需要知道镜像(因此在连接期间不会有任何潜在的延迟,并且不需要对客户端进行任何更改,甚至不需要更改连接字符串) - 但是我发现很难获得有关这种方法的文档或白皮书。但如果这是真的,那么最好的方法是使用 MSCS(为了客户端无知和连接性能)进行镜像(为了 HA)。
...但是,如何扩展到可能包含数百个镜像数据库的服务器实例?
答案1
您说得对,镜像和集群可以一起使用,但我认为您对它的工作方式的理解有点偏差。如果您希望应用程序能够识别镜像,则必须设置连接字符串,使其具有指定的故障转移伙伴。现在,如果您有集群故障转移,则发生的情况取决于您如何设置镜像。如果您将其设置为自动故障转移,镜像将接管,您的应用程序将连接到镜像伙伴。如果您将其设置为手动故障转移,则集群中主节点的其他节点之一将启动 SQL 服务,主节点将继续提供流量。查看http://technet.microsoft.com/en-us/library/ms191309.aspx了解更多信息。
另外,SQL 2012 引入了一种称为“Always On”的新方法。它可能会以更少的努力解决您的问题。