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]