Condividi tramite


Si verifica un timeout quando ci si connette a un listener Always On in un ambiente con più subnet

Questo articolo illustra come risolvere il problema che si verifica quando ci si connette a un listener del gruppo di disponibilità AlwaysOn di SQL Server in un ambiente con più subnet.

Versione originale del prodotto: SQL Server 2012 Developer, SQL Server 2012 Enterprise, SQL Server 2012 Express, SQL Server 2012 Standard, SQL Server 2012 Web, SQL Server 2012 Enterprise Core
Numero KB originale: 2792139

Sintomi

Dopo aver configurato il listener del gruppo di disponibilità per un gruppo di disponibilità AlwaysOn in Microsoft SQL Server 2012, potrebbe non essere possibile effettuare il ping del listener o connettersi a esso da un'applicazione.

Ad esempio, quando si tenta di connettersi a un listener di SQL Server usando SQLCMD, si verifica il timeout della connessione. Viene inoltre visualizzato un messaggio di errore simile al seguente:

Sqlcmd: Errore: Microsoft SQL Native Client: timeout di accesso scaduto.

Note

Questi sintomi sono in genere intermittenti o correlati al failover della risorsa del gruppo di disponibilità.

Lo screenshot seguente mostra un esempio di ciò che si verifica quando si tenta di eseguire il ping del listener per la disponibilità di aglisten. Lo screenshot mostra anche una connessione riuscita a SQL Server usando il SQLCMD comando quando si include il parametro -Mdi failover su più subnet .

Screenshot della finestra del prompt dei comandi quando si esegue il ping del listener per la disponibilità di aglisten.

Note

È possibile usare il SQLCMD comando insieme al -M parametro come illustrato nello screenshot per connettersi al listener.

Causa

Questo problema si verifica perché l'applicazione usa un provider di dati legacy che non supporta il nuovo MultiSubnetFailover parametro o non è configurato per l'uso di questo parametro.

Questo parametro è supportato nelle versioni più recenti del driver SQLClient incluso in .NET Framework 4 e nelle versioni successive di .NET Framework e viene nuovamente convertito in .NET Framework 3.5.

Note

Il PING comando è un semplice strumento di test della connettività che non supporta il nuovo parametro.

Risoluzione

È possibile usare una delle risoluzioni seguenti in base al caso:

  • Per risolvere questa situazione quando i provider di dati supportano il MultiSubNetFailover parametro , aggiungere il MultiSubNetFailover parametro al stringa di connessione e impostarlo su true.

  • Per risolvere questa situazione quando i client legacy non possono usare la MultiSubnetFailover proprietà , è possibile modificare il valore del RegisterAllProvidersIP listener su 0. A tale scopo, eseguire il comando seguente dall'interfaccia della riga di comando di Windows PowerShell:

    Import-Module FailoverClusters
    Get-ClusterResource <*Your listener name*>|Set-ClusterParameter RegisterAllProvidersIP 0
    

    Screenshot che mostra l'output di un esempio del comando in Windows PowerShell.

Note

Dopo aver impostato il RegisterAllProvidersIP valore su 0, l'indirizzo IP online corrente deve essere non registrato dal server DNS e l'indirizzo IP offline deve essere registrato nel server DNS quando si verifica un failover. Ciò può causare un ritardo di connessione per il failover successivo.

Ulteriori informazioni

Quando si tenta di connettersi a un listener definito in più subnet, l'operazione potrebbe non riuscire se il driver client tenta di connettersi usando uno degli indirizzi IP offline del listener.

Quando viene creato un listener, viene designato un indirizzo IP per ogni subnet univoca in cui è ospitata una replica del gruppo di disponibilità. Ad esempio, se viene creato un listener per un gruppo di disponibilità con repliche presenti in due subnet, nel listener vengono definiti due indirizzi IP. Un indirizzo viene usato da un'applicazione in grado di connettersi a un'istanza di SQL Server nella subnet 1 e l'altro indirizzo viene usato quando un'applicazione si connette a un'istanza di SQL Server nella subnet 2.

Dietro le quinte, il listener crea una risorsa del punto di accesso client del cluster Windows. Una delle relative proprietà è RegisterAllProvidersIP. Quando viene creato un listener, viene impostato su 1 e tutti gli indirizzi IP del listener vengono registrati nel server DNS. Questa configurazione consente di ridurre il tempo di riconnessione per i client.

Poiché il record DNS contiene tutti gli indirizzi IP, un client che tenta di connettersi al listener deve sapere come gestire questa situazione. Il MultiSubnetFailover parametro consente al driver client di provare le connessioni in parallelo a tutti gli indirizzi IP del listener. Senza il MultiSubnetFailover parametro , il driver client tenterà di connettersi in sequenza a tutti gli indirizzi IP per il listener. Le connessioni sequenziali possono causare un lungo timeout di accesso o timeout di accesso.

Note

Il problema menzionato in questo articolo riguarda anche gli ambienti SharePoint configurati per l'uso di una replica secondaria di sola lettura di un gruppo di disponibilità AlwaysOn. Per risolvere questo problema, eseguire qualsiasi delle azioni seguenti si applica alla versione di SharePoint:

Riferimenti