Il timeout si verifica quando ci si connette a un listener Always On in un ambiente multi subnet

Questo articolo consente di risolvere il problema che si verifica quando ci si connette a un listener del gruppo di disponibilità SQL Server Always On 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 Web 2012, SQL Server 2012 Enterprise Core
Numero KB originale: 2792139

Sintomi

Dopo aver configurato il listener del gruppo di disponibilità per un gruppo di disponibilità Always On 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, il timeout della connessione. Inoltre, viene visualizzato un messaggio di errore simile al seguente:

Sqlcmd: Errore: Microsoft SQL Native Client: timeout dell'accesso scaduto.

Nota

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 effettuare 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 multi subnet .

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

Nota

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

Nota

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

Risoluzione

È possibile usare una delle soluzioni seguenti in base al caso specifico:

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

  • Per risolvere questo problema 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 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.

Nota

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. Questo potrebbe 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 che può 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 punto di accesso client del cluster Windows. Una delle relative proprietà è RegisterAllProvidersIP. Quando viene creato un listener, questo valore è impostato su 1 e tutti gli indirizzi IP del listener vengono registrati nel server DNS. Questa configurazione offre tempi di riconnessione ridotti 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 tempo di accesso lungo o timeout di accesso.

Nota

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

Riferimenti