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)

O SQL Server 2019 (15.x) CTP 2.0 apresenta o redirecionamento de conexão de leitura/gravação de réplica secundária para primária para 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 cadeia de conexão pode ser direcionada a uma réplica secundária. Dependendo da configuração de réplica do AG (grupo de disponibilidade) e as configurações na cadeia 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 redirecionam o tráfego do usuário para a réplica primária para garantir a reconexão depois do failover. O SQL Server 2019 (15.x) continua a ser compatível com a funcionalidade de ouvinte do AG e adiciona redirecionamento de conexão da réplica para cenários que não podem incluir um ouvinte. Por exemplo:

  • A tecnologia de cluster integrada pelos grupos de disponibilidade do SQL Server não oferece uma funcionalidade semelhante a ouvinte
  • 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/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ão 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 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 Conexões bem-sucedidas
Leituras bem-sucedidas
Gravações com falha
ApplicationIntent=ReadOnly Conexões com falha Conexões bem-sucedidas Conexões 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) definido

Depois de definir o redirecionamento de conexão de leitura/gravação, a maneira como a réplica trata as solicitações de conexão se comporta de forma 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 Conexões bem-sucedidas Conexões 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.

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.

Availability group with primary, secondary, and asynchronous secondary

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 o 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.

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

A réplica secundária redireciona chamadas de leitura/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 passou por failover manual para COMPUTER02. Um aplicativo cliente se conecta ao COMPUTER01 com ApplicationIntent=ReadWrite. A conexão é redirecionada para a réplica primária.

Connection redirected to new primary replica on computer2

Confira também

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

Sobre Acesso de conexão de cliente a réplicas de disponibilidade (SQL Server)

Ouvintes do grupo de disponibilidade, conectividade de cliente e failover de aplicativo (SQL Server)