适用范围:SQL Server
本文介绍了如何连接到 SQL Server 的 Always On 可用性组侦听器。 可用性组侦听器是客户端用来连接到可用性组中托管的数据库的虚拟网络名称。 无论哪个可用性副本当前托管主数据库,侦听器都会为客户端应用程序提供一致的连接终结点。 侦听器还启用只读路由和自动故障转移的支持。
配置侦听器后,请更新连接字符串以指向侦听器,以便应用程序流量自动路由到预期副本,而无需在每次故障转移后手动更新连接字符串。
连接到主要副本
在连接字符串中指定可用性组侦听器 DNS 名称,可连接到主要副本以进行读写访问。
例如,若要通过侦听器连接到 SQL Server Management Studio 中的主要副本,请在服务器名称字段中输入侦听器 DNS 名称:
在故障转移期间,当主要副本变化时,与侦听器的现有连接将会断开,新的连接将路由到新的主要副本。
ADO.NET 提供程序的基本连接字符串示例(Microsoft.Data.SqlClient 或 System.Data.SqlClient):
Server=tcp: AGListener,1433;Database=MyDB;Integrated Security=SSPI
注意
Microsoft.Data.SqlClient 建议使用 ADO.NET 数据提供程序进行新的应用程序开发。 它支持与System.Data.SqlClient相同的连接字符串关键字。 有关详细信息,请参阅 Microsoft.Data.SqlClient 命名空间简介。
可以通过运行以下 Transact-SQL (T-SQL) 命令,验证您当前是通过侦听器连接到哪个副本的:
SELECT @@SERVERNAME
例如,当 SQLVM1 是主要副本时:
仍可使用主要副本或次要副本的实例名称(而不使用可用性组侦听器)直接连接到 SQL Server 的实例。 但是,这样就无法享受将新连接自动路由到当前新主要副本的好处。 此外,您将失去只读路由的好处,其中用 read-intent 指定的连接会自动路由到具备读取能力的次要副本。
连接到只读副本
“只读路由”是指将传入的监听器连接自动路由到配置为允许只读工作负荷的可读的次要副本。
如果满足以下条件,则连接将自动路由到只读副本:
至少一个次要副本设置为只读访问,并且每个只读次要副本和主要副本都配置为支持只读路由。
连接字符串引用可用性组中涉及的数据库。 替代方法是连接中使用的登录帐户将该数据库配置为其默认数据库。 有关详细信息,请参阅此有关如何使用算法处理只读路由的文章。
连接字符串引用某一可用性组侦听器,并且将传入连接的应用程序意向设置为只读(例如,使用 ODBC 或 OLEDB 连接字符串或连接特性或属性中的 Application Intent=ReadOnly 关键字)。
应用程序意向属性在登录期间存储在客户端的会话中。 SQL Server 实例处理意向并确定根据可用性组的配置以及辅助副本中目标数据库的当前读写状态执行哪些操作。
例如,若要使用 SQL Server Management Studio 连接到只读副本,请在“连接到服务器”对话框中选择“选项”,选择“其他连接参数”选项卡,然后在文本框中指定ApplicationIntent=ReadOnly:
指定只读应用程序意向的 ADO.NET 提供程序(Microsoft.Data.SqlClient 或 System.Data.SqlClient)的连接字符串示例:
Server=tcp:AGListener;Database=AdventureWorks;Integrated Security=SSPI;ApplicationIntent=ReadOnly
有关详细信息,请参阅配置对可用性副本的只读访问 (SQL Server)
非默认端口
创建侦听器时,指定一个供侦听器使用的端口。 如果端口是默认端口 1433,则连接到侦听器时不必指定端口号。 但是,如果端口不是 1433,则必须在连接字符串中以 listenername,port 格式指定端口,例如:
以下是指定侦听器非默认端口的 ADO.NET 提供程序的连接字符串示例(Microsoft.Data.SqlClient 或 System.Data.SqlClient):
Server=tcp:AGListener,1445;Database=AdventureWorks;Integrated Security=SSPI
绕过侦听器
当可用性组侦听器支持故障转移重定向和只读路由时,客户端连接无需使用这两个功能。 客户端连接还可以直接引用 SQL Server 实例,而不是连接到可用性组侦听器。
对于 SQL Server 实例,无论连接是使用可用性组侦听器还是使用其他实例终结点登录都无关紧要。 SQL Server 实例根据可用性组的配置以及实例上的数据库当前状态来验证目标数据库的状态,并允许或禁止连接。 例如,如果客户端应用程序直接连接到 SQL Server 实例的端口并连接到可用性组中承载的目标数据库,且该目标数据库处于主状态和联机状态,则连接将获得成功。 如果目标数据库处于脱机状态或处于过渡状态,则与数据库的连接将失败。
此外,当从数据库镜像迁移到 Always On 可用性组时,只要只有一个辅助副本存在且该副本禁止用户连接,应用程序就可以指定数据库镜像连接字符串。
数据库镜像连接字符串
如果一个可用性组仅有一个次要副本,并且次要副本配置为 ALLOW_CONNECTIONS = READ_ONLY 或 ALLOW_CONNECTIONS = NONE,则客户端可以通过使用数据库镜像连接字符串连接到主要副本。 在将现有应用程序从数据库镜像迁移到可用性组时,此方法可能会很有用,只要您将可用性组限制为两个可用性副本(一个主副本和一个辅助副本)。 如果添加其他辅助副本,则需要为该可用性组创建一个可用性组侦听器,并更新应用程序以使用该可用性组侦听器 DNS 名称。
在使用数据库镜像连接字符串时,客户端可以使用 SQL Server Native Client 或 .NET Framework 数据提供程序用于 SQL Server。 客户端提供的连接字符串必须至少提供一个服务器实例的名称,即“初始伙伴名称” ,以便标识最初承载您想要连接到的可用性副本的服务器实例。 此外,连接字符串还可以提供另一个服务器实例的名称,即“故障转移伙伴名称” ,以便标识最初将辅助副本作为故障转移伙伴名称承载的服务器实例。
有关数据库镜像连接字符串详细信息,请参阅 将客户端连接到数据库镜像会话 (SQL Server)。
多子网故障转移
如果使用支持连接字符串中 MultiSubnetFailover 连接选项的客户端库,则可通过将 MultiSubnetFailover 设置为“True”或“Yes”(根据使用的提供程序的语法),优化到不同子网的可用性组故障转移。
注意
对于到可用性组侦听器以及到 SQL Server 故障转移群集实例名称的单个和多子网连接,建议使用此设置。 启用此选项将添加额外的优化,即使对于单子网方案也不例外。
MultiSubnetFailover 连接选项仅适用于 TCP 网络协议,并且只在连接到可用性组侦听程序以及任何连接到 SQL Server 的虚拟网络名称时才受支持。
启用多子网故障转移的 ADO.NET 提供程序(Microsoft.Data.SqlClient 或 System.Data.SqlClient)连接字符串的示例如下所示:
Server=tcp:AGListener,1433;Database=AdventureWorks;Integrated Security=SSPI; MultiSubnetFailover=True
即使可用性组仅跨一个子网,MultiSubnetFailover 连接选项仍应设置为 True。 通过此选项,可以预配置新客户端以支持未来子网的扩展,而无需日后更改客户端连接字符串,并优化单子网故障转移时的性能表现。 尽管不需要MultiSubnetFailover连接选项,但使用它可以提供更快的子网故障转移的优势。 客户端驱动程序尝试为与可用性组关联的每个 IP 地址并行打开 TCP 套接字。 客户端驱动程序等待第一个 IP 以成功响应,一旦成功,就使用它进行连接。
侦听器和 TLS/SSL 证书
连接到可用性组侦听器时,如果参与的 SQL Server 实例将 TLS/SSL 证书与会话加密结合使用,则连接客户端驱动程序需要支持 TLS/SSL 证书中的使用者备用名称以强制加密。
必须为故障转移集群中每个参与的服务器节点配置 X.509 证书,并在证书“使用者备用名称”中设置所有可用性组侦听器的列表。
证书值的格式为:
CN = Server.FQDN
SAN = Server.FQDN,Listener1.FQDN,Listener2.FQDN
例如,你有以下值:
Servername: Win2019
Instance: SQL2019
AG: AG2019
Listener: Listener2019
Domain: contoso.com (which is also the FQDN)
对于拥有一个可用性组的 WSFC,证书应当同时包括服务器的完整限定域名 (FQDN) 和侦听器的完整限定域名 (FQDN):
CN: Win2019.contoso.com
SAN: Win2019.contoso.com, Listener2019.contoso.com
使用此配置,连接到实例(WIN2019\SQL2019)或侦听器(Listener2019)时,连接是加密的。
有一小部分客户可能也需要将 NetBIOS 添加到 SAN,具体视网络的配置方式而定。 在这种情况下,证书值应为:
CN: Win2019.contoso.com
SAN: Win2019,Win2019.contoso.com,Listener2019,Listener2019.contoso.com
如果 WSFC 有三个可用性组侦听器,例如:Listener1、Listener2、Listener3
则证书值应为:
CN: Win2019.contoso.com
SAN: Win2019.contoso.com,Listener1.contoso.com,Listener2.contoso.com,Listener3.contoso.com
侦听器和 Kerberos (SPN)
域管理员必须在 Active Directory 中为每个可用性组侦听器配置服务主体名称 (SPN),以便为到侦听器的客户端连接启用 Kerberos。 注册 SPN 时,必须使用托管可用性副本的服务器实例的服务帐户。 跨所有副本要让 SPN 正常工作,承载可用性组的 WSFC 群集中的所有实例必须使用相同的服务帐户。
使用 Windows 命令行工具 setspn 配置 SPN。 例如,要为一组 SQL Server 实例上承载的名为 AG1listener.Adventure-Works.com 的可用性组侦听程序配置 SPN,所有实例都应被配置为在域帐户 corp\svclogin2 下运行:
setspn -A MSSQLSvc/AG1listener.Adventure-Works.com:1433 corp\svclogin2
有关为 SQL Server 手动注册 SPN 的详细信息,请参阅为 Kerberos 连接注册服务主体名称。