使用可用性组时指定故障转移伙伴

Tom*_*Tom 6 sql-server sql-server-2012 availability-groups

我们有这样一种情况,即我们在使用可用性组的环境中使用复制数据库。由于我们希望在故障转移时不需要人工干预,因此我们决定设置订阅以将复制的数据写入我们的两个副本服务器。由于这些数据库只能被读取,所以这种架构应该没问题。

为了进一步配置,并在阅读Brent Ozar 的这篇文章后,我们在使用所述数据库的应用程序中设置了连接字符串,并具有故障转移合作伙伴,这样如果我们丢失了主要副本,那么我们的应用程序仍然可以工作。

在最近的测试、故障转移和故障恢复之后,我们现在开始从客户那里收到一些间歇性错误:

System.InvalidOperationException:
Server xxx, database xxx is not configured for database mirroring.
Run Code Online (Sandbox Code Playgroud)

目前我很困惑为什么会出现这个错误。有一些建议将连接超时添加到连接字符串,但这对我来说没有意义,好像主要超时然后从辅助读取应该工作,并且在我们的例子中是有效的,因为它是一个精确的副本。

如果有人有任何想法,我将不胜感激。

编辑:除此之外,我现在从连接字符串中删除了故障转移伙伴,并将其指向副本上的数据库,但是我们收到以下错误:

System.Data.SqlClient.SqlException:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:TCP 提供者,错误:0 - 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。)

它就像客户端在某处缓存了辅助服务器?


编辑:回应布伦特的回答

嗨,布伦特,谢谢你,但是我在最初的描述中不清楚。复制的数据库不是可用性组的一部分,而是我在每个节点上都有一个订阅,因为据我所知,AG 中并没有很好地支持复制的 DB。

因此,我试图想出一种方法,如果副本发生故障以及属于 AG 故障转移一部分的其他数据库,则可以避免对这些数据库进行手动干预。

我在想,当节点 A 启动时,所有连接都会转到该服务器,但是如果节点 A 失败,那么在使用故障转移伙伴时连接会转到节点 B。然而,事实似乎并非如此,实际上根据这篇文章:

http://msdn.microsoft.com/en-gb/library/system.data.sqlclient.sqlconnection.connectionstring.aspx

如果您指定了故障转移伙伴,但故障转移伙伴服务器没有配置为数据库镜像并且主服务器(用 Server 关键字指定)不可用,则连接将失败。

我尝试使用它的方式似乎不支持此故障转移伙伴配置,但让我遇到任何故障转移都需要手动干预的情况:( 除非我遗漏了什么?

Bre*_*zar 7

这个问题有两个部分:

首先,您能否将故障转移伙伴连接字符串提示与 AlwaysOn 可用性组结合使用? 不可以。AlwaysOn AG 的“监听器”技术是替代品。让您的连接字符串指向侦听器名称,它们将始终获得主要副本。(对于这个答案的下一部分,我假设您正在使用侦听器名称 - 如果不是,请开始,呵呵。)

二、为什么有些查询无法连接到监听器? 这与侦听器的 DNS 条目数有关。侦听器的所有可能子网将始终在 DNS 中。如果您在 192.168.1.X 中有一个侦听器,在 192.168.100.x 中有另一个侦听器,则这两个侦听器将始终位于 DNS 中。默认情况下,您的客户端将尝试按顺序连接到每个 DNS 条目,而不总是按数字顺序连接。如果您的连接超时 30 秒,则您的应用程序可能只会尝试其中一个 IP,然后在有时间尝试第二个 IP 之前失败。

如果您想尝试同时连接到所有可能的 IP,请查看 SQL Server 客户端的 MultiSubnetFailover = True 选项,如下所述:http : //msdn.microsoft.com/en-us/library/hh205662.aspx

否则,您需要增加连接超时以考虑多个 IP。

2 月 27 日更新:问题补充说,“因此,我试图想出一种方法,如果副本发生故障以及属于 AG 故障转移一部分的其他数据库,则避免对这些(复制的)数据库进行手动干预。”

哦,不幸的是,不,如果数据库不是可用性组的一部分,您将需要手动工作以进行故障转移。一种流行的选择是使用 DNS 记录,并将 DNS 记录重新指向当前托管数据库主要副本的任何服务器。