次要副本到主要副本读/写连接重定向(Always On 可用性组)

适用于: SQL Server 2019 (15.x)

SQL Server 2019 (15.x) CTP 2.0 引入了 Always On 可用性组的次要副本到主要副本读/写连接重定向。 读/写连接重定向适用于任何操作系统平台。 它允许客户端应用程序连接定向到主要副本,而不考虑在连接字符串中指定的目标服务器。

例如,连接字符串可以针对次要副本。 根据可用性组 (AG) 副本的配置和连接字符串中的设置,连接可以自动重定向到主要副本。

用例

在 SQL Server 2019 (15.x) 之前,AG 侦听器和相应的群集资源将用户流量重定向到主要副本,以确保在故障转移后重新连接。 SQL Server 2019 (15.x) 继续支持 AG 侦听器功能,并为不能包含侦听器的方案添加副本连接重定向。 例如:

  • SQL Server 可用性组集成的群集技术不提供类似于侦听器的功能
  • 多子网配置,如在云中或具有 Pacemaker 的多子网浮动 IP,其中配置变得复杂,容易出错,并且由于涉及多个组件而难以排除故障
  • 读取扩展或灾难恢复和群集类型是 NONE,因为没有简单的机制来确保在手动故障转移时进行透明重新连接

要求

为使次要副本重定向读/写连接请求:

  • 次要副本必须处于联机状态。
  • 副本规范 PRIMARY_ROLE 必须包含 READ_WRITE_ROUTING_URL
  • 连接字符串必须为 ReadWrite,方法是将 ApplicationIntent 定义为 ReadWrite 或不设置 ApplicationIntent 并让默认值 (ReadWrite) 生效。

设置 READ_WRITE_ROUTING_URL 选项

若要配置读/写连接重定向,请在创建 AG 时为主要副本设置 READ_WRITE_ROUTING_URL

在 SQL Server 2019 (15.x) 中,READ_WRITE_ROUTING_URL 已添加到 <add_replica_option> 规范。 请参阅下列主题:

PRIMARY_ROLE(READ_WRITE_ROUTING_URL) 未设置(默认值)

默认情况下,未对副本设置读/写副本连接重定向。 次要副本处理连接请求的方式取决于是否将次要副本设置为允许连接以及连接字符串中的 ApplicationIntent 设置。 下表显示次要副本如何处理基于 SECONDARY_ROLE (ALLOW CONNECTIONS = )ApplicationIntent 的连接。

ApplicationIntent SECONDARY_ROLE (ALLOW CONNECTIONS = NO) SECONDARY_ROLE (ALLOW CONNECTIONS = READ_ONLY) SECONDARY_ROLE (ALLOW CONNECTIONS = ALL)
ApplicationIntent=ReadWrite
默认
连接失败 连接失败 连接成功
读取成功
写入失败
ApplicationIntent=ReadOnly 连接失败 连接成功 连接成功

上表显示默认行为,与 SQL Server 2019 (15.x) 之前的 SQL Server 版本相同。

PRIMARY_ROLE(READ_WRITE_ROUTING_URL) 集

设置读/写连接重定向后,副本处理连接请求的行为方式有所不同。 连接行为仍然取决于 SECONDARY_ROLE (ALLOW CONNECTIONS = )ApplicationIntent 设置。 下表显示包含 READ_WRITE_ROUTING 集的次要副本如何处理基于 SECONDARY_ROLE (ALLOW CONNECTIONS = )ApplicationIntent 的连接。

ApplicationIntent SECONDARY_ROLE (ALLOW CONNECTIONS = NO) SECONDARY_ROLE (ALLOW CONNECTIONS = READ_ONLY) SECONDARY_ROLE (ALLOW CONNECTIONS = ALL)
ApplicationIntent=ReadWrite
默认
连接失败 连接失败 连接路由到主要副本
ApplicationIntent=ReadOnly 连接失败 连接成功 连接成功

上表显示,当主要副本包含 READ_WRITE_ROUTING_URL 集时,次要副本会在 SECONDARY_ROLE (ALLOW CONNECTIONS = ALL) 时将连接重定向到主要副本,并且连接会指定 ReadWrite

示例

在此示例中,可用性组有三个副本:

  • COMPUTER01 上的主要副本
  • COMPUTER02 上的同步次要副本
  • COMPUTER03 上的异步次要副本

下图表示可用性组。

Availability group with primary, secondary, and asynchronous secondary

以下 Transact-SQL 脚本创建此 AG。 在此示例中,每个副本都会指定 READ_WRITE_ROUTING_URL

CREATE AVAILABILITY GROUP MyAg   
     WITH ( CLUSTER_TYPE =  NONE )  
   FOR   
     DATABASE  [<Database1>]   
   REPLICA ON   
      'COMPUTER01' WITH   
         (  
         ENDPOINT_URL = 'TCP://COMPUTER01.<domain>.<tld>:5022',  
         AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,  
         FAILOVER_MODE = MANUAL,  
         SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL,   
            READ_ONLY_ROUTING_URL = 'TCP://COMPUTER01.<domain>.<tld>:1433' ),
         PRIMARY_ROLE (ALLOW_CONNECTIONS = READ_WRITE,   
            READ_ONLY_ROUTING_LIST = ('COMPUTER02', 'COMPUTER03'),
            READ_WRITE_ROUTING_URL = 'TCP://COMPUTER01.<domain>.<tld>:1433' ),   
         SESSION_TIMEOUT = 10  
         ),   
      'COMPUTER02' WITH   
         (  
         ENDPOINT_URL = 'TCP://COMPUTER02.<domain>.<tld>:5022',  
         AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,  
         FAILOVER_MODE = MANUAL, 
         SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL,   
            READ_ONLY_ROUTING_URL = 'TCP://COMPUTER02.<domain>.<tld>:1433' ),  
         PRIMARY_ROLE (ALLOW_CONNECTIONS = READ_WRITE,   
            READ_ONLY_ROUTING_LIST = ('COMPUTER01', 'COMPUTER03'),  
            READ_WRITE_ROUTING_URL = 'TCP://COMPUTER02.<domain>.<tld>:1433' ),
         SESSION_TIMEOUT = 10  
         ),   
      'COMPUTER03' WITH   
         (  
         ENDPOINT_URL = 'TCP://COMPUTER03.<domain>.<tld>:5022',  
         AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,  
         FAILOVER_MODE = MANUAL,  
         SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL,   
            READ_ONLY_ROUTING_URL = 'TCP://COMPUTER03.<domain>.<tld>:1433' ),  
         PRIMARY_ROLE (ALLOW_CONNECTIONS = READ_WRITE,   
            READ_ONLY_ROUTING_LIST = ('COMPUTER01', 'COMPUTER02'),  
            READ_WRITE_ROUTING_URL = 'TCP://COMPUTER03.<domain>.<tld>:1433' ),
         SESSION_TIMEOUT = 10  
         );
GO  
  • <domain>.<tld>
    • 完全限定域名的域和顶级域。 例如,corporation.com

连接行为

在下图中,客户端应用程序连接到 COMPUTER02,且 ApplicationIntent=ReadWrite。 连接重定向到主要副本。

Connection to computer 2 is re-directed to the primary replica

次要副本会将读/写调用重定向到主要副本。 与任一副本的读写连接将重定向到主要副本。

在下图中,主要副本已手动故障转移至 COMPUTER02。 客户端应用程序连接到 COMPUTER01,且 ApplicationIntent=ReadWrite。 连接重定向到主要副本。

Connection redirected to new primary replica on computer2

另请参阅

AlwaysOn 可用性组概述 (SQL Server)

关于对可用性副本的客户端连接访问 (SQL Server)

可用性组侦听器、客户端连接和应用程序故障转移 (SQL Server)