Délais de connection lors de l'utilisation de Multisubnetfailover = True

Récemment, j'ai découvert que les connections échouaient entre l'un de nos servers Web et un écouteur MSSQL AlwaysOn. L'écouteur a deux adresses IP car il couvre les sous-réseaux, donc nous spécifions Multisubnetfailover = true dans notre string de connection.

Lorsque vous tentez de vous connecter à l'écouteur, j'obtiens l'erreur suivante:

System.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement. This could be because the pre-login handshake failed or the server was unable to respond back in time. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=20991; handshake=0; ---> System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) at System.Data.SqlClient.SqlConnection.Open() at IRNXMLGateway.Controllers.IRNXMLGatewayController.GenericCall(Ssortingng methodCall) in CODELINE:line 376 ClientConnectionId:92074b33-176a-4006-b7c7-892e01a3eea7 

J'ai également essayé de me connecter en utilisant SSMS et j'ai rencontré le même problème de timeout.

Je suis capable de faire des connections avec succès en:

  • login directe à l'hôte sans l'auditeur
  • login directe à l'adresse IP de l'écouteur actuel
  • Augmentation du timeout de connection à 200 secondes
  • Suppression de l'option MultiSubnetFailover dans la string de connection

Je ne rencontre pas ce problème lors de la tentative de connection à partir d'autres servers. Il n'y a pas d'erreurs dans les journaux d'events SQL ou Windows pour aider à déterminer la cause des timeouts d'attente. La trace réseau montre la connection de connection correcte avec l'adresse IP actuelle de l'écouteur. Aucun server n'a de pare-feu ou d'antivirus activé. Webserver exécute l'édition web du server 2008, le server SQL exécute Windows Server 2012 et sql server 2012.

La situation est-elle la suivante? Vous disposez d'un pilote de filter TDI (Transport Driver Interface) actif installé sur le post de travail de l'application cliente.

Si c'est le cas, il existe un article de la Base de connaissances à MS sur ce problème.
http://support.microsoft.com/kb/2870437

Donc "je pense" j'ai été en mesure de résoudre ce problème. J'ai réinstallé .NET 4.5 et ai redémarré le server et maintenant les connections sont faites sans problème. Ma pensée actuelle est que celui qui a installé 4.5 à l'origine n'a pas suivi le redémarrage du système requirejs, laissant les choses dans un état étrange. Je vais continuer à surveiller ce server pendant quelques semaines pour voir si le problème se reproduit. J'apprécie toujours d'autres opinions sur ce qui a pu causer cela.

Nous avons donc exactement eu la même chose récemment et avons semblé coïncider avec le correctif mardi de MS pour septembre 2014. Comme correction temporaire, j'ai placé l'IP d'écoute "active" dans le file hosts afin qu'il soit toujours résolu localement et que tout fonctionne. Je suppose que je pourrais aussi avoir supprimé la 2ème adresse IP dans le cluster de basculement.

Telnet semble confirmer qu'il faut 21 secondes avant le timeout lors de la connection à l'auditeur, ce qui correspond à une search DNS sérielle des adresses IP de l'auditeur et à l'obtention de "la mauvaise". Toujours à la search d'une réponse finale, mais je vais certainement essayer la réinstallation de 4.5. NET comme je l'ai lu que la bibliothèque. NET expire après 15 secondes, DNS n'a donc jamais la chance d'envoyer la 2ème adresse IP au client.

C'est un problème côté client. Je l'ai juste eu lieu sur un Sql 2012 à partir d'une application client Windows 7. Le conseil que vous avez reçu plus tôt à propos de l'article de la KB était exact. Il m'a d'abord été fourni par un ingénieur de Microsoft pour corriger notre problème.

Si le problème est le même, vous pouvez créer une application de test qui boucle une connection. Définissez le timeout d'attente de connection = 6000 et affichez un countur de loops. Vous le verrez d'abord hésiter puis zoomer sur les itérations.

Installez le correctif KB recommandé.

Réexécutez l'application de test et vous ne devriez voir aucune hésitation.