为 Always On 可用性组配置只读路由

适用于:SQL Server

若要配置 AlwaysOn 可用性组以便在 SQL Server中支持只读路由,你可以使用 Transact-SQL 或 PowerShell。 只读路由 指的是 SQL Server 将符合条件的只读连接请求路由到可用的 AlwaysOn 可读次要副本 (即,配置为在辅助角色下运行时允许只读工作负荷的副本)的能力。 为支持只读路由,可用性组必须具备 可用性组侦听器。 只读客户端必须将连接请求定向到此侦听器,并且客户端的连接字符串必须将应用程序意向指定为“只读”。也就是说,它们必须是读取意向连接请求

只读路由在 SQL Server 2016 (13.x) 及更高版本中可用。

注意

有关如何配置可读次要副本的信息,请参阅 配置对可用性副本的只读访问 (SQL Server)

先决条件

为支持只读路由,您需要配置哪些副本属性?

  • 对于要支持只读路由的每个可读次要副本,你需要指定 只读路由 URL。 此 URL 仅在本地副本在辅助角色下运行时起作用。 必须根据需要针对每个副本分别指定只读路由 URL。 每个只读路由 URL 都用于将读意向请求路由到一个特定的可读辅助副本。 通常,向每个可读辅助副本分配一个只读路由 URL。

    有关计算可用性副本的只读路由 URL 的信息,请参阅 计算 AlwaysOn 的 read_only_routing_url

  • 对于要在其作为主要副本时支持只读路由的每个可用性副本,都需要指定一个 只读路由列表。 一个给定的只读路由列表仅在本地副本在主角色下运行时才起作用。 必须根据需要按每个副本分别指定此列表。 通常,每个只读路由列表都包含所有只读路由 URL,并将本地副本的 URL 放在列表末尾。

    注意

    读意向连接请求将被路由到当前主副本的只读路由列表上的第一个可用条目。 但是,支持在只读副本之间进行负载均衡。 有关详细信息,请参阅 在只读副本间配置负载平衡

注意

有关可用性组侦听程序的信息,以及只读路由的详细信息,请参阅可用性组侦听程序、客户端连接和应用程序故障转移 (SQL Server)

权限

任务 权限
在创建可用性组时配置副本 要求具有 sysadmin 固定服务器角色的成员身份,并具有以下权限之一:CREATE AVAILABILITY GROUP 服务器权限、ALTER ANY AVAILABILITY GROUP 权限或 CONTROL SERVER 权限。
修改可用性副本 需要对可用性组具有 ALTER AVAILABILITY GROUP 权限、CONTROL AVAILABILITY GROUP 权限、ALTER ANY AVAILABILITY GROUP 权限或 CONTROL SERVER 权限。

“使用 Transact-SQL”

配置只读路由列表

使用以下步骤,通过使用 Transact-SQL 配置只读路由。 有关代码示例,请参阅本节后面的 示例 (Transact-SQL)

  1. 连接到承载主副本的服务器实例。

  2. 如果要为新的可用性组指定副本,请使用 CREATE AVAILABILITY GROUP Transact-SQL 语句。 如果要为现有可用性组添加或修改副本,请使用 ALTER AVAILABILITY GROUP Transact-SQL 语句。

    • 若要配置辅助角色的只读路由,请在 ADD REPLICA 或 MODIFY REPLICA WITH 子句中指定 SECONDARY_ROLE 选项,如下所示:

      SECONDARY_ROLE READ_ONLY_ROUTING_URL ='TCP://system-addressport')

      只读路由 URL 的参数如下所示:

      system-address
      是一个字符串,例如系统名称、完全限定域名或 IP 地址,可唯一标识目标计算机系统。

      港口
      一个端口号,由 SQL Server 实例的数据库引擎使用。

      例如:SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://COMPUTER01.contoso.com:1433')

      如果副本已配置为允许只读连接,则在 MODIFY REPLICA 子句中,ALLOW_CONNECTIONS 是可选的。

      有关详细信息,请参阅 计算 AlwaysOn 的 read_only_routing_url

    • 若要为主角色配置只读路由,请在 ADD REPLICA 或 MODIFY REPLICA WITH 子句中指定 PRIMARY_ROLE 选项,如下所示:

      PRIMARY_ROLE ( READ_ONLY_ROUTING_LIST =('server' [ ,...n ] ))

      其中, server 标识一个托管可用性组中的只读次要副本的服务器实例。

      例如:PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('Server1','Server2'))

      注意

      您必须先设置只读路由 URL,然后才能配置只读路由列表。

在只读副本间配置负载平衡

从 SQL Server 2016 (13.x)开始,可以在一组只读副本间配置负载平衡。 以前,只读路由始终都将流量定向到路由列表中第一个可用的副本。 若要利用此功能,请在 CREATE AVAILABILITY GROUPALTER AVAILABILITY GROUP 命令中,对 READ_ONLY_ROUTING_LIST 服务器实例使用一层嵌套圆括号。

例如,以下路由列表可在两个只读副本 Server1Server2 之间对读意向连接请求进行负载均衡。 括住这些服务器的嵌套圆括号可以标识已实现负载平衡的组。 如果该组中没有副本,则它将继续尝试按顺序连接到只读路由列表中的其他副本: Server3Server4

READ_ONLY_ROUTING_LIST = (('Server1','Server2'), 'Server3', 'Server4')  

请注意,路由列表中的每项本身也可以是一组负载平衡的只读副本。 下面的示例演示这一操作。

READ_ONLY_ROUTING_LIST = (('Server1','Server2'), ('Server3', 'Server4', 'Server5'), 'Server6')  

仅支持一个级别的嵌套圆括号。

示例 (Transact-SQL)

以下示例将修改现有可用性组 AG1 的两个可用性副本以支持只读路由(如果其中一个副本拥有主角色)。 为了标识承载可用性副本的服务器实例,此示例指定了实例名称 COMPUTER01COMPUTER02

ALTER AVAILABILITY GROUP [AG1]  
 MODIFY REPLICA ON  
N'COMPUTER01' WITH   
(SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));  
ALTER AVAILABILITY GROUP [AG1]  
 MODIFY REPLICA ON  
N'COMPUTER01' WITH   
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://COMPUTER01.contoso.com:1433'));  
  
ALTER AVAILABILITY GROUP [AG1]  
 MODIFY REPLICA ON  
N'COMPUTER02' WITH   
(SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));  
ALTER AVAILABILITY GROUP [AG1]  
 MODIFY REPLICA ON  
N'COMPUTER02' WITH   
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://COMPUTER02.contoso.com:1433'));  
  
ALTER AVAILABILITY GROUP [AG1]   
MODIFY REPLICA ON  
N'COMPUTER01' WITH   
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('COMPUTER02','COMPUTER01')));  
  
ALTER AVAILABILITY GROUP [AG1]   
MODIFY REPLICA ON  
N'COMPUTER02' WITH   
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('COMPUTER01','COMPUTER02')));  
GO  
  

使用 PowerShell

配置只读路由列表

使用以下步骤,通过使用 PowerShell 配置只读路由。 有关代码示例,请参阅本节后面的 示例 (PowerShell)

  1. 将默认值 (cd) 设置为托管主副本的服务器实例。

  2. 在将可用性副本添加到可用性组中时,使用 New-SqlAvailabilityReplica cmdlet。 在修改现有可用性副本时,使用 Set-SqlAvailabilityReplica cmdlet。 相关参数如下:

    • 若要为辅助角色配置只读路由,请指定 ReadonlyRoutingConnectionUrl"url" 参数。

      其中,URL 是用于路由到副本进行只读连接的连接完全限定域名(FQDN)和端口。 例如:-ReadonlyRoutingConnectionUrl "TCP://DBSERVER8.manufacturing.Adventure-Works.com:7024"

      有关详细信息,请参阅 计算 AlwaysOn 的 read_only_routing_url

    • 若要为主要角色配置连接访问,请指定 ReadonlyRoutingList"server" [ , ...n ],其中, server 标识一个托管可用性组中的只读次要副本的服务器实例。 例如:-ReadOnlyRoutingList "SecondaryServer","PrimaryServer"

      注意

      您必须先设置副本的只读路由 URL,然后才能为其配置只读路由列表。

    注意

    若要查看 cmdlet 的语法,请在 PowerShell 环境中使用 Get-Help SQL Server cmdlet。 有关详细信息,请参阅 Get Help SQL Server PowerShell

设置和使用 SQL Server PowerShell 提供程序

示例 (PowerShell)

以下示例在可用性组中配置主副本和一个辅助副本以进行只读路由。 首先,该示例将向每个副本分配一个只读路由 URL。 然后,在主副本上设置只读路由列表。 在连接字符串中将“ReadOnly”属性设置好的连接将被重定向到辅助副本。 如果此辅助副本不可读(由 ConnectionModeInSecondaryRole 设置决定),则连接将被定向回主副本。

Set-Location SQLSERVER:\SQL\PrimaryServer\default\AvailabilityGroups\MyAg  
$primaryReplica = Get-Item "AvailabilityReplicas\PrimaryServer"  
$secondaryReplica = Get-Item "AvailabilityReplicas\SecondaryServer"  
  
Set-SqlAvailabilityReplica -ReadOnlyRoutingConnectionUrl "TCP://PrimaryServer.domain.com:1433" -InputObject $primaryReplica  
Set-SqlAvailabilityReplica -ReadOnlyRoutingConnectionUrl "TCP://SecondaryServer.domain.com:1433" -InputObject $secondaryReplica  
Set-SqlAvailabilityReplica -ReadOnlyRoutingList "SecondaryServer","PrimaryServer" -InputObject $primaryReplica  

后续操作:配置只读路由后

当当前主副本和可读辅助副本都已配置为在这两种角色下支持只读路由时,可读辅助副本便可接收来自通过可用性组侦听程序连接的客户端的读意向连接请求。

提示

使用 bcp 实用工具sqlcmd 实用工具时,你可以通过指定 -K ReadOnly 开关来对允许只读访问的任意次要副本指定只读访问。

针对客户端连接字符串的要求和建议

对于要使用只读路由的客户端应用程序,其连接字符串必须满足以下要求:

  • 使用 TCP 协议。

  • 将应用程序意向特性/属性设置为只读。

  • 引用已配置为支持只读路由的可用性组侦听器。

  • 引用该可用性组中的数据库。

此外,我们建议在连接字符串中启用多子网故障转移,该功能为每个子网上的每个副本提供一个并行客户端线程。 这将最大程度地减小故障转移后的客户端重新连接时间。

连接字符串的语法取决于应用程序正在使用的 SQL Server 提供程序。 以下用于 SQL Server 的 .NET Framework 数据访问接口 4.0.2 的示例连接字符串说明了使用只读路由时所需的和建议的连接字符串的部分。

Server=tcp:MyAgListener,1433;Database=Db1;IntegratedSecurity=SSPI;ApplicationIntent=ReadOnly;MultiSubnetFailover=True  

有关只读应用程序意向和只读路由的详细信息,请参阅 可用性组侦听器、客户端连接和应用程序故障转移 (SQL Server)

如果只读路由无法正常工作

有关解决只读路由配置问题的信息,请参阅 只读路由未正确工作

还原为默认路由行为

从 SQL Server 2025 (17.x)开始,您可以指定 NONE 作为 READ_WRITE_ROUTING_URLREAD_ONLY_ROUTING_URL 的目标,以恢复可用性副本的指定路由,并根据默认行为路由流量。 若要了解详细信息,请查看 ALTER AVAILABILITY GROUP Transact-SQL 命令。

后续步骤

查看只读路由配置

配置客户端连接的访问权限

在应用程序中使用连接字符串

博客:

更多内容