Nachtrag Technical Summit Berlin / TechEd Barcelona

Vielen Dank an alle Teilnehmer der TechEd 20143 in Barcelona die den gemeinsamen Vortrag von Mario Szpuszta und mir zum WP_20141027_010Thema “Architecting Globally Available and Scalable Solutions on Microsoft Azure” als  einen der Besten Vorträge im Architektur Track gewählt haben. Vielen Dank dafür!

Das Recording des Talks ist mittlerweile auf Channel9 publiziert worden. Für alle die dieses Jahr nicht nach Barcelona zur TechEd kommen konnten, aber Interesse an dem Vortrag haben, findet sich das Recording hier.

Auf dem diesjährigen Technical Summit in Berlin konnte ich aus meiner täglichen Arbeit berichten.  Im Detail gig es um sWP_20141111_016 “Internet  of Things und Big Data in der Praxis: ein Kundenszenario aus der Produktion”. Das Recording incl. des Decks findet sich ebenfalls mittlerweile auf Channel9. Auch hier vielen Dank an alle die den Vortrag besucht haben und in die Top 10 der Veranstaltungsvorträge gewählt haben.

EchEd Europe 2014 – Architecting Globally Scalable Solutions

 TechEd2014

Mario Szpuszta und ich haben auf der diesjährigen TechEd Europe im Vortrag “Architecting Globaly Scalable Solutions” das Toolset an Produkten und Services von Microsoft Azure vorgestellt, mit dem globale, skalierende und ausfallsichere Applikationen in Microsoft Azure entwickelt und betrieben werden können.

Die horizontale Verteilung von Compute Workload (Scale Out) kann sehr einfach durch die Verwendung mehrere statusloser Compute Instanzen gelöst werden. Werden Statusinformationen auf den Instanzen benötigt, kann dies ebenfalls sehr elegant über Services wie z. B. Azure Cache gelöst werden. Hierbei sollte der auf Redis basierende Azure Cache verwendet werden.

Interessant wird es, wenn auch der Data Tier skalieren soll bzw. muss, weil der eingehende Workload nicht mehr von einem einzigen Datenbank Server verarbeitet werden kann. Die Aufrüstung des Servers mit mehr Speicher, HDD bzw. mehr Prozessoren (Scale Up) stellt hierbei i. d. R. nur eine zeitlich begrenzte Lösung dar. Vielmehr sollte auch das Datenbanksystem die eingehende Last auf mehrere Server (virtuell oder physikalisch) verteilen. Azure SQL Database Elastic Scale kann hierbei verwendet werden, um diese Last auf mehrere sog. Shards zu verteilen.

Die notwendigen Binaries um mit Azure SQL Database Elastic Scale zu arbeiten können via Nuget einfach in eigene Projekte eingebunden werden: 

install-package Microsoft.Azure.SqlDatabase.ElasticScale.Clientimage
 

Eine detaillierte Einführung in die Funktionalität stellt Microsoft in der Azure Dokumentation zur Verfügung.  Ebenfalls steht ein End-To-End Beispiel zum Download über den Visual Studio Project Wizzard zur Verfügung. Einfach unter “Online” – “Samples” nach “Elastic Scale” suchen und eines der Beispiele auswählen. Ein Utility zum migrieren von Azure SQL Federation Datenbanken auf Azure SQL Database Elastic Scale wird hierbei ebenso angeboten wie Beispiele für die Verwendung von Entity Framework und “bekannten” ADO.NET SqlCommands.

Im Überblick betrachtet stellt Azure SQL Database Elastic Scale die folgenden Komponenten / Funktionalitäten zur Verfügung:

  1. Funktionalität zur Anlage und Verwaltung einer “Global Shard Map” (GSM). Vereinfacht ausgedrückt ist die GSM eine Sammlung von Tabellen in einer Datenbank welche ConnectionStrings zu Daten Shards speichert. D. h. die GSM weiß, welche Daten in welchem Shard zu finden sind.
  2. Um die GSM als Bottleneck auszuschließen werden deren Informationen auch in den jeweiligen Daten Shards gespeichert (Local Shard Map) sowie in der Client Library gecached. image 
  3. Für den reinen Datenzugriff oder auch Data Dependent Routing genannt stehen Methoden die auf einzelne Daten Shards und auch Shard übergreifende Queries erlauben zur Verfügung. Zu beachten ist im speziellen bei Shard übergreifenden Queries dass es sich hierbei um eine Fan Out Query auf alle Shards handelt. Die Ergebnisse der einzelnen Queries werden in der Client Library ähnlich wie mit einem “Union All” zu einer Rückgabe kombiniert. 

Einige Code Snippets um Azure Elastic Scale zu verwenden finden sich in meinem GitHub Repository. Interessant ist im speziellen der Aufbau der Connection Strings zur GSM Datenbank und den lokalen Shards. Für die Verbindung zur GSM Datenbank (GetGsmConnectionString()) ist der Name der Datenbank (Initial Catalog) mit anzugeben. Die Connection Strings zu den jeweiligen Daten Shards sind jedoch ohne Name der Datenbank zu erstellen.

47         internal static string GetGsmConnectionString()
48         {
49             return new SqlConnectionStringBuilder
50             {
51                 InitialCatalog = Configuration.EsDataBase,
52                 DataSource = Configuration.EsServerName,
53                 UserID = Configuration.EsUserId,
54                 Password = Configuration.EsPassword,
55                 IntegratedSecurity = false,
56                 ApplicationName = "GlobalyScalable",
57                 ConnectTimeout = 30
58             }.ToString();
59         }
60

61         internal static string GetShardConnectionString()
62         {
63             return new SqlConnectionStringBuilder
64             {
65                 UserID = Configuration.EsUserId,
66                 Password = Configuration.EsPassword,
67                 IntegratedSecurity = false,
68                 ApplicationName = "GlobalyScalable",
69                 ConnectTimeout = 30,
70             }.ToString();
71         }
 

MS Azure und der integrierte Load Balancer bzw. “Bring your own LoadBalancer”

Um die von Microsoft Azure zur Verfügung gestellte 99,95% SLA für die Verfügbarkeit von Cloud Servicen oder Virtuellen Maschinen zu erreichen, müssen immer zwei oder mehr Instanzen des Services bzw. der VM betrieben werden. Die setzt jedoch auch voraus, dass der in Windows Azure kostenfrei und “automatisch” zur Verfügung gestellte Load Balancer verwendet wird.

Der Azure Load Balancer arbeitet auf Layer 4, dem Transport Layer des OSI Modells. D. h. er arbeitet auf individuellen Streams von TCP bzw. UDP Traffic und kalkuliert einen Hash basierend auf dem eingehenden Verkehr. Hierzu werden folgende Werte des eingehenden Traffic verwendet: image

    1. Source IP Adresse
    2. Destination IP Adresse
    3. Protocol Type (TCP/UDP)
    4. Source Port
    5. Destination Port

Dies führt zu einer zufälligen Verteilung von eingehenden Traffic auf die verfügbaren Server bzw. Cloud Services. Sollte der Client eine Verbindung schließen und wieder zur gleichen Zieladresse aufbauen erfolgt dies i. d. R. mit einem neuen Source Port. Dadurch wird eine neuer, unterschiedlicher Hash ermittelt und der Traffic wird ggf. auf einen anderen Server im Set der load balanced Server verteilt. Der Load Balancer ermöglicht auch die Konfiguration des TCP Idle Timeout. Dadurch können offene aber inaktive Verbindungen (Stichwort Long-Polling) nach einem bestimmten Zeitintervall unterbrochen werden. Dieser wert kann zwischen 4 und 30 Minuten variieren.

Sollte dieses Verhalten für einen eigenen Service bzw. Server nicht gewünscht sein, kann der Azure eigenen Load Balancer umgangen werden. Seit Frühjahr 2014 bietet Azure eine neue Service Tier “Basic” an. Diese Tier hat eine ähnliche  Konfiguration wie die “Standard” Gegenstücke, wird aber zu einem deutlichen geringeren Preis und ohne Bereitstellung des Azure Load Balancers angeboten. Gedacht sind diese Tiers hauptsächlich als Entwicklungs-, und Testumgebungen bei denen i. d. R. auch kein Load Balancing benötigt wird.

Basic Tier Hoch Verfügbarkeit

imageNur weil die “Basic” Tier keinen Load Balancer anbietet, heißt das nicht, dass nicht die gleiche SLA wie für die Standard Tier (99,95%) erreicht werden kann. Um die Voraussetzungen für die SLA zu erreichen müssen zwei oder mehr Instanzen in das gleiche Availability Set deployed werden. Zusätzlich kann nun auf diesen Instanzen ein eigener Load Balancer, der den speziellen Anforderungen des eigenen Cloud Service entspricht, installiert werden.

Video Aufzeichnungen der DWX 2014 zum Download verfügbar

imageViele die auf der diesjährigen DWX 2014 in Nürnberg mit dabei waren haben sich sicherlich gefragt, warum in jedem Raum im  Hintergrund so viel Technik vorgehalten wurde. Dieses Jahr wurden die Sessions zum Ersten mal aufgezeichnet und stehen nun im Shop der dotnetpro zum Download zur Verfügung. Wer also vor Ort nicht alle Vorträge besuchen konnte, hat nun die Möglichkeit dies nachzuholen .

Freundlicherweise hat mir die dotnetpro einen Satz von 9 Vouchers für den kostenfreien Download aller aufgezeichneten Sessions zur Verfügung gestellt. Der Voucher hat einen Wert von 236,81 €. Sollte jemand die Möglichkeit zum Download nutzen wollen, kann er sich einfach bei mir melden, frei nach dem Prinzip First Come – First Serve.

Developer Week 2014

WP_20140714_006

Auch dieses Jahr hatte ich wieder das Vergnügen, bei der Developer Week 2014 mit zwei Azure Vorträgen zum Erfolg beizutragen.

Der Vortrag “Architecting The Cloud” hatte zum Ziel ein Bewusstsein dafür zu schaffen, dass nicht einfach alle Herausforderung bezüglich Skalierung und Betriebssicherheit bei einem Lift-&-Shift von existierenden Systemen in die Cloud automatisch gelöst und adressiert sind. Vielmehr gibt es doch etliche Herausforderungen die in der Architektur berücksichtigt werden müssen wenn man einen ausfallsicheren Dienst in der public oder private Cloud betreiben möchte. Nach dem Vortrag sollten Begriffe wie Failure Point bzw. Failure Mode, Availability Plan und Life Cycle Model und deren Einsatz bei der Architektur eines Cloud Services bekannt sein. Das Deck was ich zur Präsentation benützt habe findet sich hier.

WP_20140714_005Im zweiten Vortrag drehte sich alles um das Debugging in der Cloud. Gerade die Verwendung von Visual Studio bietet viele Möglichkeiten einen Cloud Service oder eine einfache WebSite zu debuggen. Die Möglichkeiten reichen hierbei von:

 

 

Development Debugging

  1. Remote Desktop, RDP “on the fly” (Cloud Service)
  2. Remote Debutgging (Cloud Service / WebSite)
  3. Intellitrace (CloudService)

Production Debugging

  1. Azure Diagnostics Framework (Cloud Service)
  2. Intellitrace “on the fly” (Cloud Service)
  3. Online Configuration (WebSite)

Wer den Vortrag mit Hilfe der Powerpointfolien nachvollziehen möchte, findet diese hier.

Debugging im Zeichen der Cloud

imageDer erste Cloud Service ist mit Hilfe von Visual Studio sehr schnell entwickelt und in Windows Azure zur Verfügung gestellt. Auch das debuggen in der lokalen Entwicklungsumgebung ist altbekannt und stellt uns vor keine besonderen Herausforderungen. Sobald es jedoch zu einer Fehlermeldung im Live-Betrieb kommt ist guter Rat teuer. Wie kann das Problem eingegrenzt und behoben werden? Auf welchen der möglicherweise vielen Instanzen eines Cloud Services kam es zu dem Fehler und warum tritt der Fehler nur hier auf?

Auf dem diesjährigen DotNetDay Franken in Nürnberg konnte ich im Rahmen eines Vortrages Methoden und Tools vorstellen die das Debuggen von Cloud Services ermöglichen. Die Slides zum Vortrag finden sich hier.

Windows Azure Compute / Storage / Services

Zusammen mit Marco Richardson konnte ich am Mittwoch den 26.02.2014 die vielfältigen Services von Windows Azure der Cloud Plattform von Microsoft bei der .NET Usergroup Stuttgart vorstellen.

Cloud Computing ist in aller Munde, aber welcher Cloud Service kann bzw. soll für welche Anforderung eingesetzt werden? Der Vortrag gab einen Überblick über die von Windows Azure zur Verfügung gestellten Services und zeigt anhand einer End-To-End Lösung, wie diese praxisnah und sinnvoll eingesetzt werden können.

Im Vortrag gingen wir über die klassische Präsentation und Auflistung von Funktionen hinaus und haben auf Basis des VidPACK Framework den praxisnahen Einsatz der jeweiligen Services demonstriert.

Das Deck des Vortrages kann hier geladen werden. Das VidPACK Template mit allen Source Code Beispielen findet sich auf meinem GitHUB Account.

VidPACK Framework–Das VoD / Live-Streaming Template

VidPACK Framework - support your usergroups!

VidPACK das Template hinter der offiziellen dotnet Day Franken App im Windows Store.

In Zusammenarbeit mit Marco Richardson und dem Team der Dodneddern ist ein App-Projekt entstanden, um die Sessions des Dotnet Day Franken noch einmal hautnah miterleben zu können. Die App des Dotnet Day Franken kann aus dem Windows Store geladen und installiert werden.

auch für weitere Apps) bildet das VidPACK Framework.Das Framework stellt Visual Studio Projekte (C#) und Templates für die App Entwicklung (C# / XAML) zur Verfügung die einfach in Windows Azure betrieben werden können. Rückgrat der Video Streaming Funktionen von VidPACK sind die Windows Azure Media Services. Für Push Nachrichten wird der Windows Azure Notification Hub verwendet.

Auf dieser Basis können Videos als Stream für alle gebräuchlichen Client Plattformen zur Verfügung gestellt werden. HLS, Smooth Streaming usw. steht ohne Probleme zur Verfügung. Plattformübergreifende Push-Nachrichten an z. B. iOS, Android und Windows Geräte ist ebenfalls kein Problem. Das VidPACK Backend kann ebenfalls plattformübergreifend verwendet werden. So wurde Oktober 2013 während eines Hackathons in Nürnberg ein iOS Client entwickelt. Das VidPACK Framework steht zum Download zur Verfügung und kann als Basis für eigene Projekte verwendet werden.

Gerade für Usergroups stellt sich oftmals die Frage, wie die qualitativ hochwertigen und mit viel Aufwand organisierten monatlichen Vorträge auch für Interessierte die an dem Treffen nicht teilnehmen können zur Verfügung gestellt werden können. VidPACK stellt hierfür eine komplette Lösung zur Verfügung. VidPACK beinhaltet eine Win8.1 App, ein zugehöriges Backend mit Zugriff auf eine SQL Server Datenbank, eine Desktop Maintenance Applikation sowie die Kommunikaiton aller Komponenten untereinander zur Verfügung. Der Source Code kann von meinem GitHUB Account geladen werden.

VidPACK konzentriert sich bewusst auf die Entwicklung der Apps sowie des Backends um eine einfache Adaption eines eigenen UI bzw. eines Corporate CIs zu unterstützen.

VidPackRawHub

Details über die Verwendung und Adaption von VidPACK können auf dem Blog von Marco Richardson nachgelesen werden.

vidPACK im Einsatz bei der UG Regensburg

Cloud Computing ist in aller Munde, aber welcher Cloud Service kann bzw. soll für welche Anforderung eingesetzt werden?

Zusammen mit Marco Richardson von der conplement AG aus Nürnberg konnte ich am Mittwoch den 22.01.2014 einen Überblick über die von Windows Azure zur Verfügung gestellten Services geben. Der Vortrag ging über die klassische Präsenation und Auflistung von Cloud Diensten mit deren Funktionalität bzw. Vor-, und Nachteilen hinaus. Anhand eines “Real-World“ Beispiel wurde eine Win8.1 App, ein zugehöriges Backend mit Zugriff auf eine SQL Server Datenbank, eine Desktop Maintenance Applikation sowie die Kommunikation aller Komponenten untereinander vorgestellt.

Das Quick Start Template vidPACK  welches die Basis der App sowie des Backend darstellt wurde bereits von der .NET User Group Franken eingesetzt, um eine Win8.1 App zur Verfügung zu stellen, die das VoD Archiv des DotNetDay Franken zugänglich macht. Alle Komponenten stehen im Source Code auf Github zur Verfügung und können als Basis für eigene Projekte und Applikationen verwendet werden. Um den Code auszuführen sollten die Backend Komponenten als auch die Datenbank lokal installiert und danach in die entsprechenden Azure Dienste publiziert werden.

Die Slides des Vortrages finden sich hier.

Windows Azure Mobile Services–Zugriff auf eine existierende Datenbank

Herausforderung

Häufig sieht man sich bei der Verwendung von Windows Azure Mobile Services der Herausforderung gegenüber auf bereits existierende Datenbanken bzw. Tabellen zugreifen zu müssen. Auch wenn es auf den ersten Blick keine Möglichkeit gibt diese Anforderungen mit den Bordmitteln der Windows Azure Mobile Services umzusetzen ist dies doch einfach zu realisieren.

image

Im Reiter “CONFIGURE” des Mobile Service kann unter anderem auch die Azure SQL DB, auf die im Rahmen des Mobile Service zugegriffen werden soll, ausgewählt werden. Durch Klick auf “Change Database” kann eine bereits existierende Datenbank ausgewählt werden. Hierbei sollte man aus Performance Gründen darauf achten, dass sich die existierende Datenbank im gleichen Rechenzentrum wie der Mobile Service befindet.

Hat man die Verbindung zur gewünschten Datenbank konfiguriert, stellt sich die Problematik, dass der Azure Mobile Service i. d. R. nicht auf die existierenden Tabellen zugreifen kann. Dies ist darin begründet, dass der Mobile Service die Tabellen in einem bestimmten Schema voraussetzt. Das Schema ist dabei identisch mit den Namen des Mobile Service. Existierende Tabellen sind jedoch i. d. R. dem Schema dbo zugeordnet und damit ist auch kein Zugriff auf diese Tabellen möglich.

image

Das Problem zeigt sich deutlich, wenn man beim Azure Mobile Service eine Tabelle mit gleichem Namen wie eine bereits existierende anlegt. Im nebenstehenden Beispiel existiert eine Tabelle DownloadItem bereits in der Datenbank und ist dem Schema dbo zugeordnet. Nach Anlage einer gleichnamigen Tabelle über die Mobile Services wird statt auf die existierende Tabelle zuzugreifen eine neue Tabelle unter dem Schema des Mobile Service angelegt. Im Beispiel ist das RobEichMobileService.DownloadItem.

Schema Änderung

Theoretisch wäre es möglich, das Schema der existierenden Tabellen mit dem T-SQL ALTER SCHEMA möglich.

ALTER SCHEMA RobEichMobileService TRANSFER dbo.DownloadItem

Dadurch ist der Zugriff auf die Tabelle vom Mobile Service möglich, jedoch existierende Applikationen welche die Tabelle ansprechen müssen geändert werden, um auf die Tabelle mit dem geänderten Schema zugreifen zu können. Aus diesem Grund ist der Weg via ALTER SCHEMA zwar möglich, kann in der Praxis jedoch i. d. R. nicht eingesetzt werden.

 
View
 
Um auf die existierenden Tabellen zugreifen zu können, kann innerhalb der Datenbank ein View angelegt werden, der als Schema den Namen des Mobile Service aufweist. Der View selbst kann wiederum auf die existierenden Tabellen zugreifen.
 
   1: CREATE VIEW RobEichMobileService.DownloadItem

   2: AS

   3: SELECT * FROM dbo.DownloadItem

 
Von Seiten des Mobile Service kann nun einen neue “Tabelle” mit Namen <<DownloadItem>> angelegt werden. Es wird jedoch keine neue Tabelle angelegt, vielmehr wird der existierende View verwendet. Der Zugriff auf die existierende Tabelle ist dadurch möglich.