我们正在为即将推出的 Web 产品构建生产环境。对于此堆栈,主 SQL Server 2008 将用于实时数据库操作,辅助 SQL Server 2008 将从主 SQL Server 获取其数据镜像(通过 SQL Server 的内置镜像功能)。我们将让 Report Service 针对辅助 SQL Server 运行,同时让它在主 SQL Server 不可用时处于热备用状态。
在应用程序层面,我们有两个选择:
- 在应用层实施故障检测,这样如果主 SQL Server 没有响应,我们的 DAL 就会访问辅助 SQL Server。或者
- 让应用层指向 VIP,并让 HAProxy 处理故障检测。
问题是,选项 2 是否可行?
注意:我们知道还有其他方法可以在数据库级别提供高可用性(例如集群),但我们的目标是寻找一种经济高效的解决方案。
答案1
“数据镜像”是什么意思?
您可以进行数据库镜像,在这种情况下,客户端(即您的 DAL)可以使用连接字符串中的 FailoverPartner 并遵循故障转移事件并连接到新主体。由于镜像不可用,您的报告将基于数据库快照而不是数据库本身运行。
您可以拥有一个故障转移群集,并且客户端首先连接到群集资源名称,并且它不知道首先要启动的活动节点主机名,但这不会让您访问备用伙伴上的任何数据。
您可以进行硬件镜像,但这是一个单独的主题。
有人说复制是一种选择,但我不属于那一派。
而且……差不多就是这样了。除了开发自己的内部数据镜像技术,不管那意味着什么。
更新
如果您使用数据库镜像,那么您只需在连接字符串中指定故障转移伙伴,请参阅将客户端连接到镜像数据库。您的应用程序必须在发生故障转移事件时处理事务一致性。故障转移事件将突然断开客户端连接,客户端代码中将引发异常。任何待处理的事务都将被中止。客户端代码必须重新连接,读取持久状态并从数据库中找到的状态恢复工作。正确编写的应用程序将优雅地处理此问题,而不会出现问题。
镜像始终处于脱机状态,无法访问。如果要在镜像上运行报告,则必须获取数据库快照并在快照上运行报告。必须定期刷新快照(删除并重新创建)。请参阅数据库镜像和数据库快照。
网络层负载均衡器与镜像无关,也不能解决任何问题。
答案2
怎么样以上都不是?
请澄清一下您所说的镜像 SQL 服务器是什么意思。您是使用某种类型的 SAN 进行镜像,还是使用 SQL Server 的内置镜像功能?
我知道您如何在 Web 层使用 HAProxy,但为什么要对 SQL Server 这样做?SQL Server 还有其他受支持的 HA 选项,例如集群、镜像和复制。我会先研究一下这些。