Verbindungsprobleme beim Datenbankzugriff zwischen Windows Azure und SQL Azure

Saturday, January 28, 2012 8:26:02 AM (Mitteleuropäische Zeit, UTC+01:00)

Sql-AzureBei einer Webanwendung, dich gerade in ASP.NET entwickle, bin ich vor kurzem auf eine große Anzahl von Verbindungsproblemen zwischen Windows Azure (IIS) und SQL Azure gestoßen.

Die Webseite nutzt Windows Azure, AppFabric-Cache und SQL Azure. Alles lag im Rechenzentrum West-Europa.

Wie haben sich die Probleme geäußert und wann sind sie aufgetreten?

Beim Datenbankzugriff mit dem Entity Framework gab es folgende Exceptions:

  • Invalid attempt to read when no data is present.
  • The underlying provider failed on Open.
  • Calling 'Read' when the data reader is closed is not a valid operation.
  • An error occurred while reading from the store provider's data reader.
  • A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)
  • A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The semaphore timeout period has expired.)

Die Fehler sind sind aufgetreten, sobald die Webseite etwas stärker belastet wurde. Dies geschah immer dann, wenn die Webseite durch einen Bot (z.B. Google oder Bing) gecrawlt wurde. Eigentlich sollten solche geringen Lastschwankungen Windows Azure bzw. SQL Azure nicht weiter beeindrucken - dachte ich.

Mein erster Versuch die Fehler zu beheben, war die Größe der VM Instanz zu erhöhen. Leider brachte dies keine Besserung.
An meinem Code konnten diese Fehler nicht liegen, da die Webseite vor dem Umzug zu Azure schon einige Monate auf meinem eigenen Server fehlerfrei lief.
Ich schilderte diese Probleme dem Azure Support und war von der Antwort sehr überrascht. Der Support wusste von dem Problem und hatte auch einen Namen dafür parat: “Transient Conditions”. Ich wurde auf einen Artikel vom “Windows Azure Customer Advisory Team” hingewiesen, in dem folgendes zu lesen ist:

The database connections may also be dropped due to the variety of reasons related to network connectivity between the client and distant Microsoft data centers: quality of network, intermittent network faults in the client’s LAN or WAN infrastructure and other transient technical reasons.

Als Lösung wird der Einsatz des so genannten Transient Fault Handling Framework vorgeschlagen, das im wesentlichen nichts weiter macht, als den Datenbankzugriff zu überwachen. Im Fehlerfall wird der Datenbankzugriff einfach erneut versucht.

Ich habe mich aus mehreren Gründen gegen den Einsatz dieses Frameworks entschieden:

  • das Framework ist riesengroß und hat einige Abhängigkeiten
  • es ist schlecht dokumentiert
  • ich sehe nicht ein, Infrastruktur-Fehler im Code auszugleichen, wodurch die Ladegeschwindigkeit der Webseite sinken würde

Gerade zum letzten Punkt, der Performance, habe ich einige Versuche gemacht.
30 bis 50 Versuche um Daten zu lesen waren im Fehlerfall keine Seltenheit und das, obwohl Datenbank und IIS im selben Azure – Rechenzentrum (West-Europa) lagen. Die Performance der Webseite würde mit dieser Strategie deutlich in die Knie gehen.

Als nächstes habe ich versucht herauszufinden, ob man die Verbindungsprobleme nicht anders in den Griff bekommen kann.
Ich habe die Webseite wieder auf meinem eigenen Webserver gelegt, aber die Datenbank bei Azure gelassen, schon waren die Fehler weg!

Auch wenn die Webseite im Rechenzentrum Europa Nord liegt und die Datenbank in Europa West, gibt es keine Probleme. In dieser Konstellation läuft die Webseite jetzt einen Monat fehlerfrei.

Bin ich mit meinen Erfahrungen ein Einzelfall (Ich habe ja öfter mal Pech mit Server-Hardware), oder hat Microsoft hier noch massive Probleme?

Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war,
bitte "kicken" sie ihn.

Kick it on dotnet-kicks.de


Saturday, January 28, 2012 2:28:11 PM (Mitteleuropäische Zeit, UTC+01:00)
Hallo Jan,

von was für einer Last reden wir? Das Erscheinen eines Bots ist keine Belastungsspitze, zumal der Bot eigentlich nur als einfacher Userzugriff zählt.

>>Als Lösung wird der Einsatz des so genannten Transient Fault Handling Framework vorgeschlagen,

Die Lösung wäre total veraltet. Mit dem Transient Fault Handling Application Block aus dem Windows Azure Integration Pack for Enterprise Library 5.0 gibt es eine instrumentalisierte Variante. Mit dem Autoscaling Application Block (selbe Quelle),kannst Du Belastungen automatisch abfangen.

Kommen wir zum eigentlichen Problem. 90 % der Timeouts bei SQL Azure werden durch fehlerhafte Einstellungen beim SQL Azure Firewall hervorgerufen. Hast Du die Firewall mal überprüft?

Schöne Grüße
Oliver
Sunday, January 29, 2012 7:52:00 PM (Mitteleuropäische Zeit, UTC+01:00)
Hallo Oliver,

von Last kann man bei der Webseite noch nicht reden. Im Moment sind nicht mehr als 300 User pro Tag auf der Seite. Wieviel Seiten der Bot aufruft, kann ich nicht sagen aber auf jeden Fall sollte diese Last ohne weiteres von zwei Small Instanzen verkraftet werden.

Was soll man denn bei der Firewall falsch machen können?

Grüße,
Jan
Jan Welker
Monday, January 30, 2012 10:45:51 AM (Mitteleuropäische Zeit, UTC+01:00)
Hallo Jan,

300 User pro Tag (1 User alle 5 Minuten) ist gar nichts. Mit der Last auf der Seite hat dein Problem definitiv nichts zu tun. Außerdem würdest Du einen Throttling Error bekommen und keinen Timeout.

Der Kern deines Problems liegt meiner Ansicht nach in der folgenden Fehlermeldung:

A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

Diese Meldung sagt SQL Azure wehrt deine Query am Eingang ab. Alle anderen Fehler sind Folgeschäden.

Ok, ob es die Einstellung des SQL Azure Firewall sind, kann ich aus der Ferne nicht sagen, wäre aber eine mögliche Begründung. Vielleicht schaust Du dir mal folgenden TechNet Wiki Artikel an:

SQL Azure Connectivity Troubleshooting Guide
http://social.technet.microsoft.com/wiki/contents/articles/sql-azure-connectivity-troubleshooting-guide.aspx

Schöne Grüße
Oliver
Monday, January 30, 2012 5:41:28 PM (Mitteleuropäische Zeit, UTC+01:00)
Hallo Oliver,

danke, aber warum funktioniert es alles, wenn der Webserver irgendwo anders ist?
Egal ob in einem anderen Azure - Rechenzentrum oder auf meinem Webserver?
Die Fehler treten nur auf, wenn Datenbank UND IIS im Rechenzentrum West-Europa sind.

Jan
Jan Welker
Name
E-mail
(will show your gravatar icon)
Home page

Comment (Some html is allowed: a@href@title, strike) where the @ means "attribute." For example, you can use <a href="" title=""> or <blockquote cite="Scott">.  

Enter the code shown (prevents robots):

Live Comment Preview