Tomasz Kopacz - Wzorce architektoniczne MS Azure
Transkrypt
Tomasz Kopacz - Wzorce architektoniczne MS Azure
WZORCE ARCHITEKTONICZNE Tomasz Kopacz Microsoft Agenda • • • • • • • • • (wstęp – krótko komponenty Windows Azure) Anatomia pakietu i wdrożenia Co daje API Azure Wewnętrzna komunikacja w Azure Zarządzanie programowe działaniem Azure Fabric Kilka ciekawych pomysłów – Tomcat, VHD, Windows HPC – Dynamiczna wymiana logiki – Obsługa złych komunikatów Skalowanie – Prosta kolejka – Skalowalny licznik – Kolejka z poganianiem WCF-em Kolejne pomysły Ostateczny cel - samoskalowanie Azure - od strony funkcjonalnej • Logika (Worker) • Web (IIS) • Load Balancer • Tryb administracyjny • VM Role (W2008R2) • Remote Desktop • Kolejki, Blob (Page / Block), Tabele • Pojemnik (brak ograniczeń rozmiaru) • BLOB sformatowany jako NTFS i podmontowany do roli • Wydajność: 87MB / s do 400 MB/s i więcej (cache!) • Content Distribution Network • Sieć dodatkowych datacenter do przechowywania blobów najbliżej klienta • Baza SQL w chmurze • (3 repliki + rozkładanie obciążeń) Role Azure Storage Azure Drive CDN SQL Azure • Eleganckie udostępnianie lokalnych usług; Internet Services Bus • Kontrola dostępu oparta o federacje. Azure AppFabric • Zgodne z SQL Reporting; ten sam RDL • Różne źródła danych • CTP SQL Azure Reporting • Tunel IPSEC over HTTP • Dołączenie lokalnej infrastruktury do chmury • Scenariusz: Lokalny SQL • Zarządzanie instancjami w Azure • Logowanie, monitorowanie, liczniki wydajności itp.. • Automatyczne utrzymanie serwisów, failover, Azure Connect Management API Diagnostics API Automatyzacj a Azure – role i architektura Web Site Web Site Web (ASPX, (ASPX, ASMX, WCF) Role ASMX, WCF) (ASPX, WCF) Worker Worker Service Role L B Serwis (aplikacja) Internet Kolejki L B Tabele Bloby Pojemnik Datacenter Windows Azure (>=1) Pakiet, wdrożenie i środowisko Wgrywanie usług Pisana Usługa Model usługa D N S L B Web Portal API, Vs.NET PowerShell config DNS Fabric Controller L B Skalowanie usług Pisana usługa Usługa D N S Usługa Usługa Usługa L B Web Portal API, Vs.NET PowerShell Usługa Usługa Usługa Usługa Model Fabric Controller L B Monitorowanie usługi i przywracanie po awarii Pisana usługa D N S Usługa Usługa L B Usługa Usługa Web Portal API, Vs.NET PowerShell Model Fabric Controller L B Architektura Fabric Controller • FC to rozproszona, stanowa aplikacja działająca na węzłach (blade) i rozproszona pomiędzy „fault domains” – Instalowana przez “Narzędziowy” Fabric Controller – Jeden działa jako główny, a inne są synchronizowane – Działa „rolling upgrade” i serwisy nawet gdy FC padnie Węzły Rack Provisioning węzła • • • • • Włączenie węzła PXE-boot z Maintenance OS Agent formatuje dysk i pobiera Host OS Host OS startuje, uruchamiane Sysprep /specialize, reboot FC podłącza się z “Host Agent” Node Wgrywanie serwisu • • • • Proces analizuje model usługi – Określa potrzebne zasoby – Tworzy obraz roli Alokacja komputerów i zasobów sieciowych Przygotowanie węzłów – Wgranie obrazów ról na węzły – Stworzenie maszyn wirtualnych – Uruchomienie maszyn wirtualnych i ról Konfiguracja sieci – Dynamiczny adres IP (DIPs) przypisany do blade – Virtual IP (VIPs) zaalokowany i zmapowany na DIP – Przeprogramowanie load balancer by pozwalał na dostęp do serwisu Zasady alokacji zasobów dla serwisu • • Cel: zaalokować zasoby zgodnie z twardymi wymaganiami – Wymaganie skalowalności: liczba instancji – Wymagania HW : CPU, Pamięć, Pojemnik, Sieć – Wymagania hostowania (OS, VM) – Fault domains – Update domains Cel drugorzędny: Zgodność z miękkimi wymaganiami – Wybiera alokacje gdzie prościej obsłużyć OS/hypervisor (różne czasy deploymentu) – Optymalizacja względem odległości (sieć) Przykład RoleEnvironment i okolice • WebRole dziedziczy z RoleEntryPoint RoleEnvironment • • • OnStart() – Wołane przez Fabric przy starcie, pozwala zainicjalizować instancję roli. – Do Fabric / LB zwracany jest status Busy aż metoda zwróci true. • False - restart OnStop() Method – Wołane gdy rola jest zamykana. Run() – Główna logika; zwykle pętla w Worker Role – W WebRole – rzadko używana, ale…. Konfiguracja • • • Konfiguracja usługi – Serviceconfiguration.csdef – Model – ServiceConfiguration.cscfg – Dane przekazywane do instancji RoleEnvironment.GetConfigurationSettingValue() Nie używać web.config – jego aktualizacja wymaga wgrania nowej wersji – Nie można „podmienić” jednego pliku… Czy kod działa w ramach Fabric? 01 Jak wygląda API Azure ze strony ról Wewnętrzna komunikacja w Azure i typy końcówek Input endpoints • • • Udostępniają usługę WCF publicznie. Rejestrowany w Azure load balancer. – On nie jest Sticky! Dowolna liczba HTTP, HTTPS, i TCP. – UDP – na razie nie Internal endpoints • • • • • Udostępnia usługę WCF innym wewnętrznym instancjom. NIE są obsługiwane przez Azure load balancer. Dowolna liczba HTTP, HTTPS, TCP. Zwykle używane jako P2P. Uwaga na – Zmieniające się adresy / restarty ról Model końcówek Internet LB SVC SVC SVC Worker Role 0 Instance 0 Worker Role 0 Instance 1 Worker Role 0 Instance 2 SVC SVC SVC Worker Role 1 Instance 0 Worker Role 1 Instance 1 Worker Role 1 Instance 2 02 Komunikacja między instancjami Kilka uwag o Load Balancer • • • • Stateless, ale – Do 1 minuty jest stałe połączenie z określoną rolą Czyli jeżeli uda nam się zapewnić „podtrzymywanie” połączenia klient – Azure częściej niż 1 minuta, to: – Można używać concurency, sesji itp.. • Nie można – np. Singletona w WCF! – Nowi klienci będą rozkładani zgodnie z LB Podtrzymywanie – Operacja typu „ping” • Zwykle ładnie zamykane we własnym zachowaniu w WCF Przyszłość – Prawdopodobnie ten czas będzie konfigurowalny Zarządzanie Service Management API • Pozwala zrobić prawie to samo co portal https://windows.azure.com/ Ograniczenia • • • • Nie ma danych billingowych – one są poza Azure Nie da się tworzyć subskrypcji Nie da się wgrać certyfikatu do Management API Nie da się tworzyć projektów storage/compute • Da się wgrać kod do istniejącego projektu API bazuje na REST <HostedServices xmlns="http://schemas.microsoft.com/windowsazure" • Ograniczona ClientLibrary xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> – Ale jest przykład do użycia – patrz też demo dalej <HostedService> <Url>https://management.core.windows.net/7212af99-206f-dem0-9334var request = (HttpWebRequest)WebRequest 380d0f841d0b/services/hostedservices/Svc1</Url> .Create("https://management.core.windows.net/7212af99-206f-dem0-9334-380d0f841d0b/ <ServiceName>Svc1</ServiceName> services/hostedservices"); </HostedService> request.Headers.Add("x-ms-version:2009-10-01"); <HostedService> request.ClientCertificates.Add <Url>https://management.core.windows.net/7212af99-206f-dem0-9334(X509Certificate2.CreateFromCertFile(@"C: \awesomedev.cer")); 380d0f841d0b/services/hostedservices/HelloWorld</Url> <ServiceName>HelloWorld</ServiceName> var responseStream = request.GetResponse().GetResponseStream(); </HostedService> <HostedService> var services = XDocument.Parse(new StreamReader(responseStream).ReadToEnd()); <Url>https://management.core.windows.net/72…41d0b/services/hostedservices/TaxEva sionPlanningTool</Url> <ServiceName>TaxEvasionPlanningTool</ServiceName> </HostedService> </HostedServices> Możliwości (skrót) • • • • • • • • • Usuwanie / wgrywanie nowego pakietu Zmiana konfiguracji – (pliku cscfg). – W tym liczby instancji Lista projektów hostowanych Lista projektów storage Zdrowie poszczególnych instancji Krótka historia zdrowia instancji Śledzenie operacji asynchronicznych po stronie Azure Management Services Konfiguracja diagnostyki (zdalna!) … 03 Management API - strona WWW Kilka ciekawych pomysłów Tomcat w Worker Role newProc.StartInfo.UseShellExecute = false; newProc.StartInfo.RedirectStandardOutput = true; newProc.StartInfo.EnvironmentVariables.Remove("CATALINA_HOME"); newProc.StartInfo.EnvironmentVariables.Add("CATALINA_HOME", tomcatLocation.Substring(0, tomcatLocation.Length - 1)); newProc.StartInfo.EnvironmentVariables.Remove("JRE_HOME"); newProc.StartInfo.EnvironmentVariables.Add("JRE_HOME", tomcatLocation.Substring(0, tomcatLocation.Length - 1) + @"\jre1.5.0_19"); newProc.StartInfo.FileName = tomcatLocation + @"bin\startup.bat"; newProc.EnableRaisingEvents = false; newProc.Start(); sr = newProc.StandardOutput; returnDetails = sr.ReadToEnd(); Trace.TraceInformation("Information", returnDetails); 04 Króciutkie demo - TOMCAT Azure Drive Azure Drive + Rola • • • • Azure Drive = PAGE BLOB sformatowany jako NTFS Montowany w roli i widziany jako dysk! Czyli – Wgrywamy aplikację i plik EXE – Mówimy roli „uruchom EXE” Warto pamiętać: Nie można zapisać stanu w VM Role / Web Role / Worker Role. Ale jeżeli aplikacja zapisze stan serwisu na zewnątrz (np. do dysku VHD) – będzie on przechowany pomiędzy ew. aplikacjami 05 VHD i okolice Windows HPC + Azure Klasyczne Windows HPC Windows HPC + Windows Azure 2 przykładowe tryby pracy Aplikacja WCF SOA Klasyczne uruchamianie zadań Zarządzanie spójne – z poziomu jednej konsoli Windows HPC + Azure • • • • • Microsoft HPC Pack 2008 R2 SP1 VM Role z zainstalowanym HPC Pack (do uruchamiania aplikacji MPI) – Albo – odpowiednie skrypty do normalnych ról Pootwierane porty do działania MPI, nadzoru itp. (reszta działa) Więcej informacji: – Tutaj (przegląd możliwości; beletrystyka) – Tutaj technicznie (krok po kroku jak skonfigurować) Skalowanie Kolejki - koncepcja 1) Otrzymanie zadania Skalowanie = dodanie więcej Web Role Worker Role ASP.NET, WCF, itp. main() { … } 2) Zadanie do kolejki 3) Pobranie zadania do wykonania Kolejka 4) Prac a Pooling – klasyczny • • Większość kolejek odpytywana w pętli Proces niezawodny (idempotent) Pooling z back-off • Back-off – Pusty przebieg zmniejsza częstotliwość odpytywania – Sukces – z powrotem na 1. 08 „Prawie klasyczna kolejka” Blokady w Windows Azure Wyzwanie – skalowalny licznik… • • • • Problem: jeden fragment kodu na raz w wielu wątkach i instancjach. Przykład: Licznik który można zwiększać z dowolnej liczby instancji – (Myśleć o przycisku „Like”) – Strona pokazująca aktualną wartość licznika – Przycisk „zwiększ” Pierwsza idea: – (lock – jest w ramach jednej instancji) – Własne blokady • Na Azure Table (np. Primary Key, Row Key określają nazwę blokady) • W Azure Blob (może być jeden blob o danej nazwie w pojemniku) • SQL Azure – normalnie jak w bazie relacyjnej Auuu… Wydajnośc – boli (no bo serializujemy de facto wszystkie operacje) Rozwiązanie • • • • Każda instancja ma własny wiersz w którym zapisuje licznik Count to suma wszystkich składników Zaleta: brak blokad Wada wolniej Count – Ale – nieznacznie wolniej!!! 09 Blokady Globalny, skalowalny licznik Hmm. Wymiana logiki Dynamiczne wczytywanie typów • • • .NET zawiera rozbudowany mechanizm refleksji Można: – Do BLOBa zapisać assembly (plik DLL) z klasą o znanym interfejsie – Rola znając interfejs, wczytuje takie assembly – Tworzy nowy obiekt – I wywołuje odpowiednie funkcje Skrót postepowania z kawałkami kodu: byte[] rawAssembly = assemblyBlob.DownloadByteArra(); Assembly pluginAssembly = Assembly.Load(rawAssembly); AppDomain.CurrentDomain.SetData(PLUGIN_ASSEMBLYNAME, pluginAssem bly); 06 Dynamiczne wczytywanie typów Komunikaty powodujące wyjątki • • • Wyzwanie – co robić gdy obsługa komunikatu powoduje wyjątek – Zwykle –dla danej kombinacji wartości algorytm uruchamiany powoduje wyjątek – (Np. dzielenie przez zero) W naturalny sposób komunikat za jakiś czas ponownie pojawi się w kolejce (natura Azure Queue) – Przypomnienie, prawidłowa obsługa komunikatu: • Wyjmij • Wykonaj (jeżeli wyjątek – komunikat nie będzie skasowany i za chwilę ponownie będzie widoczny) • Skasuj Rozwiązanie: Śledzenie komunikatów powodujących wyjątek. Po wyjęciu, patrzymy na msg.DequeueCount – Jak większe niż xxx, do innej kolejki / innego pojemnika – bo wiadomo że kilka razy worker obsługując dany komunikat „padł”. 07 Obsługa Poison Message Szybsza kolejka Idea – szybka i oszczędna kolejka • • • Azure Queue – zapewnia odporność na awarie – Ale – wymaga poolingu • Który troszkę kosztuje – Np. co 1 sekunda = 2.6784$ (kolejkę * worker * wątek) / miesiąc WCF – Szybka komunikacja pomiędzy endpointami poszczególnych instancji – Ale nie wiemy czy na pewno instancja • Odbierze • Nie padnie (awaria sprzętu) Połączenie – WCF wysyła komunikat że warto sprawdzić kolejkę – Kolejka jest wtedy odpytywana np. co minutę – Koszt: 0.04464$ na (kolejkę * worker) / miesiąc – (dodatkowo – zwrotnie komunikat WCF o zakończeniu operacji) Co z naprawdę długimi operacjami? • • • • Kolejka przechowuje informacje do 7 dni Ale, komunikat może być niewidoczny przez maksimum 2 godziny – I to też za długo – bo w przypadku prawdziwej awarii, komunikat ponownie będzie przetworzony po 2 godzinach… Jeżeli proces liczony powyżej tego terminu, to należy: – Wyjąć wiadomość z kolejki – Włożyć do tabeli (na przykład) – Przy przetwarzaniu, w pętli sprawdzać czy w tabeli jest wartość… Lepiej – NIE MIEĆ OPERACJI JEDNOSTKOWYCH TRWAJĄCYCH WIĘCEJ NIŻ 7 DNI Uproszczony diagram sekwencji 10 Szybka i oszczędna kolejka Trochę slajdów i pomysłów Kolejka przy zakupach online BE server db BE server server server server server DNS Długie kolejki • • • Kolejka zbiera komunikaty podczas gdy konsument jest offline. Raz dziennie konsument się uruchamia i idzie spać po przetworzeniu komunikatów. Użyteczne do budowania systemów ESB z zewnętrznymi dostawcami – Jedna duża „paczka” a nie wiele małych Kolejki sterowane stanami • • • Rozbić złożony proces na stany Każdy stan to oddzielny proces, z oddzielną kolejką. Tak samo wieloetapowe czynności – Różne kolejki – ID ciągu operacji – … Kolejka i długa operacja Big Worker Verify Ship Notify „new‟ Producent (Web Site) „Completed‟ Lepiej rozbić na podetapy Verify „new‟ Producer Msg1 Msg (Web Site) Ship „validated‟ Notify „shipped‟ „Completed‟ Samoskalowanie 13 Samoskalująca się aplikacja Web (BUG = KOSZTOWNE) Co się naprawdę dzieje: Klient, load test Co się naprawdę dzieje… Azure – ServiceWatcher (zwiększamy o 3) A jak się uspokoi… Zmniejszamy o jeden Warto zerknąć też: http://msdn.microsoft.com/plpl/library/windows-azure-automatycznie-skalujaca-sieaplikacja-w-chmurze (dokładnie, krok po kroku opisane jak taki system można pisać) Inne tematy • • Sesja i stan – Windows Azure AppFabric Cache • Współdzielony ramdysk do wynajęcia Chmura hybrydowa – Windows Azure Access Control Services • Autoryzacja + federacja – Windows Azure Access Service Bus • Komunikacja z pośrednikiem + biblioteka kliencka – Scenariusze » udostępnianie usługi zza NAT » przechowywanie komunikatów w chmurze – Windows Azure Connect = VPN over HTTP – (Technicznie: połączenie chmury z własnymi serwerami) – Scenariusz: lokalne usługi infrastrukturalne do chmury » Np.- dołączenie instancji do domeny Podsumowanie • • • • • Azure to platforma programistyczna w chmurze – Platform as a Service Jak każda platforma ma swoje cechy Ich poznanie pozwala budować dowolnie skalowalne aplikacje Tak naprawdę – niewiele się to różni od pisania „zwykłych” skalowalnych aplikacji A na pewno – nie da się pisać inaczej aplikacji które mają działać w skali Internetu – Myśleć o systemach o obciążeniu Twitter / Facebook / Digg itp. PYTANIA? Też mailem: [email protected]