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 -M
di failover su più subnet .
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 ilMultiSubNetFailover
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 delRegisterAllProvidersIP
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
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:
Per SharePoint 2007: viene classificato come applicazione legacy. Pertanto, Non è possibile configurare SharePoint 2007 per l'utilizzo del
MultiSubnetFailover
parametro . È invece necessario usare il comando di Windows PowerShell descritto nella sezione Risoluzione .Per SharePoint 2010: sono ora disponibili pacchetti di aggiornamento cumulativo che aggiungono il supporto per il
MultiSubnetFailover
parametro . Per altre informazioni sui pacchetti di aggiornamento, vedere l'articolo seguente: