Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Migration von Anwendungen in die Cloud

Migration von Anwendungen in die Cloud

Eine ASP.NET MVC Anwendungen wird nach Windows Azure migriert. Die notwendigen Schritte werden erläutert

Dariusz Parys

October 21, 2011
Tweet

More Decks by Dariusz Parys

Other Decks in Programming

Transcript

  1. MIGRATION VON ANWENDUNGEN IN DIE CLOUD Dariusz Parys Technical Strategist

    Web Platform Microsoft Deutschland GmbH 28.03 – 08.04.2011 Slide 1
  2. INHALT DIESER SESSION • Architektur Azure-basierter Cloud Services • Beispiel:

    Kassenverwaltung • Migration des Beispiels • Weitere Szenarien Slide 2
  3. ARCHITEKTUR AZURE-BASIERTER CLOUD SERVICES Cloud Service LB http://myApp.cloudapp.net Worker Role

    Worker Role 2 Worker Role 1 Web Role Web Role Windows Azure Storage (Table, Blob, Queue) SQL Azure Internet Services
  4. LEISTUNG VON PAAS UND ARCHITKTURENTSCHEIDUNGEN Cloud Service LB http://myApp.cloudapp.net Worker

    Role Worker Role 2 Worker Role 1 Web Role Web Role Windows Azure Storage (Table, Blob, Queue) SQL Azure Internet Services Verteilung der Anwendungslogik Optimierung der Instanzenzahl Koppelung der Rollen Traffic über RZ- Grenzen hinweg Persistenz Hoch-Verfügbarkeit
  5. HOCHVERFÜGBARKEIT > Herausforderung: > Ausführungsort eines Cloud Service kann zur

    Laufzeit wechseln und lokale Daten können vernichtet werden, z.B. bei > Hardware-Ausfall / Host Update > Guest OS-Upgrade > Lösung: > Korrekte Persistenzoptionen verwenden > Architekturmuster verwenden (s.u.) > Lose Koppelung z.B. über ein Bus System (AppFabric Service Bus) > Vermeidung von „Shutdown“-Code > Einsatz von Queues für asynchrone Kommunikation (Azure Queues)
  6. PERSISTENZ IN WINDOWS AZURE SQL Azure WA Tables WA Queues

    WA Blobs WA Drives Lokales FS Tabellen mit Schema Key-Value Nachrichten Blobs flexibel flexibel Informationstyp Ja, 3-fach Ja, 3-fach Ja, 3-fach Ja, 3-fach Ja, 3-fach Nein Redundanz Ja Ja Ja Ja Ja Nein Toleranz gegen Instanzausfall Sehr gut, flexible Keys Gut, ein Key Nein Nein Nein Nein Zugriffs- optimierung Hoch Hoch Hoch Hoch Hoch Sehr hoch Datendurchsatz TDS REST REST REST NTFS NTFS Schnittstelle Datenbank- Maximalgröße Tatsächlicher Speicher Tatsächlicher Speicher Tatsächlicher Speicher Tatsächlicher Speicher Keine Speicherkosten Keine Pro Transaktion Pro Transaktion Pro Transaktion Pro Transaktion Keine Zugriffskosten Relationale Datenbank • Session- Persistenz • Massendaten mit einem Schlüssel Asynchrone Kommunikatio n (z.B. zwischen Rollen) Ablage von großen Binärdaten (z.B. Dokumente, Multimedia) Einsatz von Frameworks, die ein Dateisystem benötigen Caching von Daten Typisches Einsatz- szenarien Alternativen für die Datenspeicherung
  7. SZENARIO FÜR DIESE SESSION • Eine zentrale Kassenverwaltung mit Anbindung

    an ein Lagersystem. Aktualisierungen durch Kassensoftware in den Filialen • Technisch: • ASP.NET MVC 2 • Entity Framework 4 • Workflow Foundation 4 • IIS 7 Slide 7
  8. ARCHITEKTUR DER ANWENDUNG Slide 8 Lager Buchungen Store Central (ASP.NET

    MVC) WebService Kasse Filialleiter SQL Server IIS Browser Windows Forms
  9. Store Central (ASP.NET MVC) WebService MIGRATION DER ARCHITEKTUR Slide 10

    Kasse Filialleiter Browser Windows Forms SQL Azure Buchungen Lager SQL Azure Windows Azure Workflow Queue
  10. MIGRATIONSSCHRITTE • Datenbank Schema und Daten migrieren • MVC Projekt

    als Web Role hinzufügen • Diagnostic hinzufügen • Workflow in Worker Role hinzufügen • Deployment Slide 11
  11. DATENBANK BENUTZER • Integrated Security  Nein • Umstellung des

    Connection Strings • Anlegen eines dedizierten Benutzers für die Datenbank Slide 13
  12. DATENBANK SCHEMA MIGRIEREN • Entity Framework  „Generate Database From

    Model“ • SQL Server Management Studio  Generate Scripts Slide 14
  13. DATENBANK BENUTZER ANLEGEN Slide 17 CREATE LOGIN posuser WITH PASSWORD

    = 'passwort' CREATE USER pos FOR LOGIN posuser WITH DEFAULT_SCHEMA = dbo; EXEC sp_addrolemember N'db_owner', N'pos'; In der Master-Datenbank In der Ziel-Datenbank
  14. EF CONNECTIONSTRING ANPASSEN Slide 18 Data Source=(local)\sqlexpress; Initial Catalog=POSCentral; Integrated

    Security=True; Pooling=False; MultipleActiveResultSets=True Bisher Data Source=sxz382mwst.database.windows.net; Initial Catalog=POSCentral; User Id=posuser; Password=pass@word1; Pooling=False; MultipleActiveResultSets=False Neu
  15. MVC PROJEKT IN WEB ROLE UMWANDELN • Visual Studio 2010

    in Admin Mode starten • Hinzufügen der Azure Assembly Referenzen • Microsoft.WindowsAzure.Diagnostics • Microsoft.WindowsAzure.ServiceRuntime • Microsoft.WindowsAzure.StorageClient • Hinzufügen einer WebRole Klasse • Einstiegspunkt für Windows Azure • Konfiguration der Einstellungen • z.B. Wieviele Instanzen, Welches Betriebssystem, etc... • Starten der Anwendung in der Emulation Slide 21
  16. WEBROLE.CS Slide 22 public class WebRole : RoleEntryPoint { public

    override bool OnStart() { // eigener Initialisierungscode return base.OnStart(); } }
  17. EMULATION != CLOUD • Logging ist Essentiell • Manche Fehler

    treten nur in der Produktivumgebung auf • z.B. fehlende Assemblies im Global Assembly Cache Slide 26
  18. EMULATION != CLOUD • Das sollte man auf jeden Fall

    beobachten • IIS 7 • Tracing • Crash Dumps • Windows Event Logs • Performance Counter • Zusätzliche Konfiguration und Initialisierungscode nötig Slide 27
  19. IIS 7 LOGS Slide 28 <system.webServer> <tracing> <traceFailedRequests> <add path="*">

    <traceAreas> <add provider="ASPNET" areas="Infrastructure,Module,Page,AppSer vices" verbosity="Verbose" /> <add provider="ISAPI Extension" verbosity="Verbose" /> <add provider="WWW Server" areas="Authentication,Security,Filte r,StaticFile,CGI,Compression,Cache,RequestNotifications,Module" verbosity=" Verbose" /> </traceAreas> <failureDefinitions statusCodes="400-599" /> </add> </traceFailedRequests> </tracing> </system.webServer> web.config
  20. TRACE LISTENER Slide 29 <system.diagnostics> <trace> <listeners> <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceL istener,

    Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics"> <filter type="" /> </add> </listeners> </trace> </system.diagnostics> web.config
  21. INITIALISIERUNGSCODE Slide 30 var wadConnectionString = "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"; var storageAccount =

    CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingV alue(wadConnectionString)); var roleInstanceDiagnosticManager = storageAccount.CreateRoleInstanceDiagnosticManager( RoleEnvironment.DeploymentId, RoleEnvironment.CurrentRoleInstance.Role.Name, RoleEnvironment.CurrentRoleInstance.Id); DiagnosticMonitorConfiguration config = DiagnosticMonitor.GetDefaultInitialConfiguration(); WebRole – OnStart()
  22. INITIALISIERUNGSCODE II Slide 31 config.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1D); config.Logs.ScheduledTransferLogLevelFilter = LogLevel.Undefined;

    Windows Azure Logs config.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(1D); IIS 7 Logs + Failed Request Logs config.DiagnosticInfrastructureLogs.ScheduledTransferLogLevelFilter = LogLevel.Warning; config.DiagnosticInfrastructureLogs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1D); Infrastructure Logs
  23. INITIALISIERUNGSCODE III Slide 32 config.WindowsEventLog.DataSources.Add("System!*"); config.WindowsEventLog.DataSources.Add("Application!*"); config.WindowsEventLog.ScheduledTransferPeriod = TimeSpan.FromMinutes(1D); Windows

    Event Logs var procTimeConfig = new PerformanceCounterConfiguration(); procTimeConfig.CounterSpecifier = @"\Processor(*)\% Processor Time"; procTimeConfig.SampleRate = TimeSpan.FromSeconds(1.0); config.PerformanceCounters.DataSources.Add(procTimeConfig); Performance Counter
  24. INITIALISIERUNGSCODE IV Slide 33 Crash Dumps CrashDumps.EnableCollection(true); Setzen der neuen

    Konfigurationeinstellungen roleInstanceDiagnosticManager.SetCurrentConfiguration(config);
  25. DIE OS VERSIONEN UND LOGGING • Windows Server 2008 SP2

    • Windows Server 2008 R2 Slide 34 <ServiceConfiguration serviceName="AzurePOSCentral" xmlns="http://schemas.microsoft.com/ServiceHosting /2008/10/ServiceConfiguration" osFamily="1" osVersion="*"> ServiceConfiguration.cscfg <ServiceConfiguration serviceName="AzurePOSCentral" xmlns="http://schemas.microsoft.com/ServiceHosting /2008/10/ServiceConfiguration" osFamily="2" osVersion="*"> ServiceConfiguration.cscfg
  26. Slide 35 Copy Logs Bug mit Windows Server 2008 R2

    Workaround von Christian Weyer
  27. ZERTIFIKATE • Für das Deployment aus einem Tool benötigt man

    ein Management Zertifikat • Für die Remote Desktop Verbindung benötigt die Rolle den Private Key des Management Zertifikat  Verschlüsselung von Credentials Slide 39
  28. INTELLITRACE AKTIVIEREN BEIM DEPLOYMENT AUS VISUAL STUDIO 2010 • Intellitrace

    lässt sich beim Deployment aktivieren • Nachträgliches Post-Mortem Debugging der einzelnen Rollen Slide 40
  29. LAGERBESTANDVERWALTUNG IN WORKER ROLE AUSLAGERN • Neues Worker Role Projekt

    hinzufügen • Die WF4 Aktivität in die Worker Role packen • WebRole.cs Code hinzufügen • Web Role Implementierung des WCF Dienstes anpassen Slide 45
  30. MIT QUEUES ARBEITEN Slide 46 var storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString"); queueStorage

    = storageAccount.CreateCloudQueueClient(); CloudQueue queue = queueStorage.GetQueueReference("bills"); queue.CreateIfNotExist(); Queue anlegen CloudStorageAccount.SetConfigurationSettingPublisher( (configName, configSetter) => { configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)); }); Notwendiger Code um Konfigurationen lesen zu können
  31. MIT QUEUES ARBEITEN II Slide 47 public override void Run()

    { Trace.WriteLine("WarehouseRole entry point called", "Information"); var queue = queueStorage.GetQueueReference("bills"); while (true) { var message = queue.GetMessage(); if (message != null) { // WF4 hier aufrufen } queue.DeleteMessage(message); } Thread.Sleep(10000); Trace.WriteLine("Working", "Information"); } Worker wartet auf Arbeit
  32. MIT QUEUES ARBEITEN III Slide 48 public void Transfer(POSBill bill)

    { ... var queue = queueStorage.GetQueueReference("bills"); var message = new CloudQueueMessage(builder.ToString()); queue.AddMessage(message); ... } Web Role verschickt Rechnung über die Queue
  33. WEITERE SZENARIEN + BEISPIELE • Silverlight • Rein Silverlight benötigt

    nur Blob Storage • Rein SL + OData  Blob Storage + SQL Azure • Web Plattformen (Php, Java, Ruby und node.js) • Acceleration Kits • Startup Tasks <http://blog.smarx.com/posts/windows-azure-startup-tasks- tips-tricks-and-gotchas> • Native Anwendungen • C++ lässt sich einfach integrieren • Beispiel auf http://blogs.msdn.com/b/dparys/archive/2009/12/08/verteiltes- rechnen-mit-windows-azure-und-c.aspx • <http://things.smarx.com/> Slide 50