Reindirizzamento della connessione in lettura/scrittura dalla replica secondaria alla primaria (Gruppi di disponibilità AlwaysOn)

Si applica a: SQL Server 2019 (15.x)

SQL Server 2019 (15.x) CTP 2.0 introduce il reindirizzamento della connessione in lettura/scrittura dalla replica secondaria alla primaria per i Gruppi di disponibilità Always On. Il reindirizzamento della connessione di lettura/scrittura è disponibile in qualsiasi piattaforma del sistema operativo. Consente di orientare le connessioni dell'applicazione client alla replica primaria, indipendentemente dal server di destinazione specificato nella stringa di connessione.

Ad esempio, la stringa di connessione può avere come destinazione una replica secondaria. A seconda della configurazione della replica del gruppo di disponibilità (AG) e delle impostazioni nella stringa di connessione, è possibile reindirizzare automaticamente la connessione alla replica primaria.

Utilizzare casi

Nelle versioni precedenti a SQL Server 2019 (15.x) il listener del gruppo di disponibilità e la risorsa cluster corrispondente reindirizzano il traffico utente alla replica primaria per garantire la riconnessione dopo il failover. SQL Server 2019 (15.x) continua a supportare la funzionalità listener del gruppo di disponibilità e aggiunge il reindirizzamento della connessione di replica per gli scenari che non possono includere un listener. Ad esempio:

  • La tecnologia cluster con cui si integrano i gruppi di disponibilità SQL Server non offre una funzionalità di tipo listener
  • Una configurazione con più subnet come nel cloud o un IP variabile per più subnet, dove le configurazioni diventano complesse, soggette a errori e con una risoluzione dei problemi impegnativa a causa del numero di componenti attivi
  • La scalabilità in lettura o il ripristino di emergenza e il tipo di cluster è NONE, perché non è presente un meccanismo diretto che garantisce la riconnessione trasparente in caso di failover manuale

Requisito

Affinché una replica secondaria reindirizzi le richieste di connessione in lettura/scrittura:

  • La replica secondaria deve essere online.
  • La specifica della replica PRIMARY_ROLE deve includere READ_WRITE_ROUTING_URL.
  • La stringa di connessione deve essere ReadWrite definendo ApplicationIntent come ReadWrite o non impostando ApplicationIntent e consentendo l'uso effettivo dell'impostazione predefinita (ReadWrite).

Impostare l'opzione READ_WRITE_ROUTING_URL

Per configurare il reindirizzamento della connessione di lettura/scrittura, impostare READ_WRITE_ROUTING_URL per la replica primaria quando si crea il gruppo di disponibilità.

In SQL Server 2019 (15.x) l'elemento READ_WRITE_ROUTING_URL è stato aggiunto alla specifica <add_replica_option>. Vedi gli argomenti seguenti:

PRIMARY_ROLE(READ_WRITE_ROUTING_URL) non impostato (impostazione predefinita)

Per impostazione predefinita il reindirizzamento della connessione di replica di lettura/scrittura non è impostato per una replica. Il modo in cui una replica secondaria gestisce le richieste di connessione dipende dal fatto che la replica secondaria sia impostata o meno per consentire le connessioni e dall'impostazione ApplicationIntent nella stringa di connessione. La tabella seguente illustra come una replica secondaria gestisce le connessioni in base a SECONDARY_ROLE (ALLOW CONNECTIONS = ) e ApplicationIntent.

Valore ApplicationIntent SECONDARY_ROLE (ALLOW CONNECTIONS = NO) SECONDARY_ROLE (ALLOW CONNECTIONS = READ_ONLY) SECONDARY_ROLE (ALLOW CONNECTIONS = ALL)
ApplicationIntent=ReadWrite
Default
Le connessioni hanno esito negativo Le connessioni hanno esito negativo Le connessioni hanno esito positivo
Le operazioni di lettura hanno esito positivo
Le operazioni di scrittura hanno esito negativo
ApplicationIntent=ReadOnly Le connessioni hanno esito negativo Le connessioni hanno esito positivo Le connessioni hanno esito positivo

La tabella precedente illustra il comportamento predefinito, analogo a quello delle versioni di SQL Server precedenti a SQL Server 2019 (15.x).

PRIMARY_ROLE(READ_WRITE_ROUTING_URL) impostato

Dopo l'impostazione del reindirizzamento della connessione di lettura/scrittura, la modalità con cui la replica gestisce le richieste di connessione cambia. Il comportamento delle connessioni dipende comunque dalle impostazioni SECONDARY_ROLE (ALLOW CONNECTIONS = ) e ApplicationIntent. La tabella seguente illustra come una replica secondaria con READ_WRITE_ROUTING impostato gestisce le connessioni in base a SECONDARY_ROLE (ALLOW CONNECTIONS = ) e ApplicationIntent.

Valore ApplicationIntent SECONDARY_ROLE (ALLOW CONNECTIONS = NO) SECONDARY_ROLE (ALLOW CONNECTIONS = READ_ONLY) SECONDARY_ROLE (ALLOW CONNECTIONS = ALL)
ApplicationIntent=ReadWrite
Default
Le connessioni hanno esito negativo Le connessioni hanno esito negativo Le connessioni vengono instradate alla replica primaria
ApplicationIntent=ReadOnly Le connessioni hanno esito negativo Le connessioni hanno esito positivo Le connessioni hanno esito positivo

La tabella precedente evidenzia che quando per la replica primaria è impostato READ_WRITE_ROUTING_URL, la replica secondaria reindirizza le connessioni alla replica primaria se SECONDARY_ROLE (ALLOW CONNECTIONS = ALL) e la connessione specifica ReadWrite.

Esempio

In questo esempio un gruppo di disponibilità ha tre repliche:

  • Una replica primaria in COMPUTER01
  • Una replica secondaria sincrona in COMPUTER02
  • Una replica secondaria asincrona in COMPUTER03

L'immagine seguente rappresenta il gruppo di disponibilità.

Availability group with primary, secondary, and asynchronous secondary

Lo script Transact-SQL seguente crea questo gruppo di disponibilità. In questo esempio, ogni replica specifica l'elemento 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>
    • Dominio e dominio di primo livello del nome di dominio completo. Ad esempio, corporation.com.

Comportamenti di connessione

Nel diagramma seguente un'applicazione client si connette a COMPUTER02 con ApplicationIntent=ReadWrite. La connessione viene reindirizzata alla replica primaria.

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

La replica secondaria reindirizza le chiamate di lettura/scrittura alla replica primaria. Una connessione di lettura/scrittura a una delle repliche determina il reindirizzamento alla replica primaria.

Nel diagramma seguente la replica primaria è stata sottoposta manualmente a failover su COMPUTER02. Un'applicazione client si connette a COMPUTER01 con ApplicationIntent=ReadWrite. La connessione viene reindirizzata alla replica primaria.

Connection redirected to new primary replica on computer2

Vedi anche

Panoramica di Gruppi di disponibilità AlwaysOn (SQL Server)

Informazioni sull'accesso alla connessione client per le repliche di disponibilità (SQL Server)

Listener del gruppo di disponibilità, connettività client e failover dell'applicazione (SQL Server)