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ń) Zgodne z SQL Reporting; ten sam RDL Różne źródła danych CTP Role Azure Storage Azure Drive CDN SQL Azure SQL Azure Reporting Eleganckie udostępnianie lokalnych usług; Internet Services Bus Kontrola dostępu oparta o federacje. 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 AppFabric Azure Connect Management API Diagnostics API Automatyzacj a
Azure role i architektura Web Web Site Site (ASPX, (ASPX, ASMX, RoleWCF) ASMX, WCF) (ASPX, WCF) L B Worker Worker Service Role Internet Serwis (aplikacja) Kolejki L B Tabele Bloby Pojemnik Datacenter Windows Azure (>=1)
Pakiet, wdrożenie i środowisko
Wgrywanie usług Pisana Usługa usługa Model D N S L B Web Portal API, Vs.NET PowerShell DNS config Fabric Controller L B
Skalowanie usług Pisana usługa Usługa D N S Usługa Usługa Usługa Usługa L B Usługa Usługa Web Portal API, Vs.NET PowerShell Model Fabric Controller Usługa 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
Rack 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
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 Worker Role 0 Instance 0 SVC Worker Role 0 Instance 1 SVC Worker Role 0 Instance 2 SVC Worker Role 1 Instance 0 SVC Worker Role 1 Instance 1 SVC 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" xmlns:i="http://www.w3.org/2001/xmlschema-instance"> Ograniczona ClientLibrary <HostedService> Ale jest przykład do użycia patrz też demo dalej var <Url>https://management.core.windows.net/7212af99-206f-dem0-9334- 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> <HostedService> request.headers.add("x-ms-version:2009-10-01"); <Url>https://management.core.windows.net/7212af99-206f-dem0-9334- request.clientcertificates.add 380d0f841d0b/services/hostedservices/HelloWorld</Url> (X509Certificate2.CreateFromCertFile(@"C: \awesomedev.cer")); <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 Skalowanie = dodanie więcej 1) Otrzymanie zadania Web Role ASP.NET, WCF, itp. Worker Role main() { } 4) Prac a 2) Zadanie do kolejki 3) Pobranie zadania do wykonania Kolejka
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 db BE server 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 Ship Notify new validated shipped Producer Msg1 (Web Site) 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/pl- pl/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: tkopacz@microsoft.com