Redirecionamento de conexão de leitura/gravação de réplica secundária para primária (Grupos de Disponibilidade Always On)

Aplica-se a: SQL Server 2019 (15.x) e posterior

O SQL Server 2019 (15.x) introduz o redirecionamento de conexão de leitura/gravação da réplica secundária para a réplica primária em grupos de disponibilidade Always On. O redirecionamento de conexão de leitura/gravação está disponível em qualquer plataforma de sistema operacional. Ele permite que conexões do aplicativo cliente sejam direcionadas para a réplica primária, independentemente do servidor de destino especificado na cadeia de conexão.

Por exemplo, a string de conexão pode apontar para uma réplica secundária. Dependendo da configuração da réplica do grupo de disponibilidade (AG) e das configurações na string de conexão, a conexão pode ser redirecionada automaticamente para a réplica primária.

Casos de uso

Antes do SQL Server 2019 (15.x), o ouvinte do AG e o recurso de cluster correspondente redirecionavam o tráfego do usuário para a réplica primária para garantir a reconexão após o failover. O SQL Server 2019 (15.x) continua oferecendo suporte à funcionalidade de listener do AG e adiciona redirecionamento de conexão para réplicas em cenários que não podem incluir um listener. Por exemplo:

  • A tecnologia de cluster com a qual os grupos de disponibilidade do SQL Server se integram não oferece um recurso semelhante a um listener
  • Uma configuração de várias sub-redes, como na nuvem ou em um IP flutuante de várias sub-redes com o Pacemaker em que as configurações se tornam complexas, propensas a erros e com problemas difíceis de solucionar devido aos vários componentes envolvidos
  • Escala de leitura ou recuperação de desastres e o tipo do cluster é NONE, porque não há nenhum mecanismo simples para garantir a reconexão transparente após o failover manual

Requisito

Para que uma réplica secundária redirecione as solicitações de conexão de leitura e gravação:

  • A réplica secundária precisa estar online.
  • A especificação de réplica PRIMARY_ROLE precisa incluir READ_WRITE_ROUTING_URL.
  • A cadeia de conexão deve ser ReadWrite definindo ApplicationIntent como ReadWrite ou não configurando ApplicationIntent e permitindo que o padrão (ReadWrite) entre em vigor.

Definir a opção READ_WRITE_ROUTING_URL

Para configurar o redirecionamento de conexões de leitura/gravação, defina READ_WRITE_ROUTING_URL para a réplica primária ao criar o AG.

Em SQL Server 2019 (15.x), READ_WRITE_ROUTING_URL foi adicionado à especificação <add_replica_option>. Consulte os seguintes tópicos:

PRIMARY_ROLE(READ_WRITE_ROUTING_URL) não definido (padrão)

Por padrão, o redirecionamento de conexão de réplica de leitura/gravação não é definido para uma réplica. A forma como uma réplica secundária trata as solicitações de conexão depende se a réplica secundária está definida para permitir conexões ou não e a configuração de ApplicationIntent na cadeia de conexão. A tabela a seguir mostra como uma réplica secundária lida com as conexões com base em SECONDARY_ROLE (ALLOW CONNECTIONS = ) e ApplicationIntent.

ApplicationIntent valor SECONDARY_ROLE (ALLOW CONNECTIONS = NO) SECONDARY_ROLE (ALLOW CONNECTIONS = READ_ONLY) SECONDARY_ROLE (ALLOW CONNECTIONS = ALL)
ApplicationIntent=ReadWrite
Padrão
Conexões com falha Conexões com falha As conexões são realizadas com sucesso
Leituras realizadas com sucesso
Falha na escrita
ApplicationIntent=ReadOnly Conexões com falha As conexões são bem-sucedidas As conexões são bem-sucedidas

A tabela anterior mostra o comportamento padrão, que é o mesmo que as versões do SQL Server antes de SQL Server 2019 (15.x).

PRIMARY_ROLE(READ_WRITE_ROUTING_URL) configurado

Depois de configurar o redirecionamento de conexão de leitura/gravação, a forma como a réplica lida com as solicitações de conexão passa a ser diferente. O comportamento de conexão ainda depende da configuração de SECONDARY_ROLE (ALLOW CONNECTIONS = ) e ApplicationIntent. A tabela a seguir mostra como uma réplica secundária com READ_WRITE_ROUTING definido lida com conexões com base em SECONDARY_ROLE (ALLOW CONNECTIONS = ) e ApplicationIntent.

ApplicationIntent valor SECONDARY_ROLE (ALLOW CONNECTIONS = NO) SECONDARY_ROLE (ALLOW CONNECTIONS = READ_ONLY) SECONDARY_ROLE (ALLOW CONNECTIONS = ALL)
ApplicationIntent=ReadWrite
Padrão
Conexões com falha Conexões com falha Rotas de conexões para a primária
ApplicationIntent=ReadOnly Conexões com falha As conexões são bem-sucedidas As conexões são bem-sucedidas

A tabela anterior mostra que, quando a réplica primária tem READ_WRITE_ROUTING_URL definido, a réplica secundária redirecionará as conexões para a réplica primária quando SECONDARY_ROLE (ALLOW CONNECTIONS = ALL) e a conexão especificar ReadWrite.

Reverter para o comportamento de roteamento padrão

A partir do SQL Server 2025 (17.x), você pode especificar NONE como o READ_WRITE_ROUTING_URL ou o READ_ONLY_ROUTING_URL destino para reverter o roteamento especificado para a réplica de disponibilidade e rotear o tráfego com base no comportamento padrão. Para saber mais, examine ALTER AVAILABILITY GROUP Transact-SQL comando.

Exemplo

Neste exemplo, um grupo de disponibilidade tem três réplicas:

  • Uma réplica primária em COMPUTER01
  • Uma réplica secundária síncrona em COMPUTER02
  • Uma réplica secundária assíncrona no COMPUTER03

A imagem a seguir representa o grupo de disponibilidade.

Grupo de disponibilidade com réplica primária, secundária e secundária assíncrona

O script Transact-SQL a seguir cria este AG. Neste exemplo, cada réplica especifica o 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>
    • Domínio e domínio de nível superior do nome de domínio totalmente qualificado. Por exemplo, corporation.com.

Comportamentos de conexão

No diagrama a seguir, um aplicativo cliente se conecta ao COMPUTER02 com ApplicationIntent=ReadWrite. A conexão é redirecionada para a réplica primária.

A conexão com o computador 2 é redirecionada para a réplica primária

A réplica secundária redireciona chamadas de leitura e gravação para a réplica primária. Uma conexão de leitura e gravação para qualquer uma das réplicas será redirecionada para a réplica primária.

No diagrama a seguir, a réplica primária foi manualmente transferida para COMPUTER02. Um aplicativo cliente se conecta ao COMPUTER01 com ApplicationIntent=ReadWrite. A conexão é redirecionada para a réplica primária.

Conexão redirecionada para a nova réplica primária no computador 2

Consulte Também

Visão geral dos Grupos de Disponibilidade AlwaysOn (SQL Server)

Sobre o acesso do cliente às réplicas de disponibilidade (SQL Server)

Listeners do Grupo de Disponibilidade, Conectividade do Cliente e Failover de Aplicativos (SQL Server)