1/50
Wprowadzenie do wysokiej dostępności (HA)
Wysoka dostępność (HA, High Availability) to zdolność systemu do nieprzerwanego działania przez długi czas, przy minimalnych przestojach. W dzisiejszym cyfrowym świecie, gdzie usługi muszą być dostępne 24/7, HA jest koniecznością. Celem projektowania systemów HA jest eliminacja pojedynczych punktów awarii (SPOF - Single Point of Failure) poprzez redundancję na każdym poziomie architektury. Dostępność mierzy się w procentach; „pięć dziewiątek” (99,999%) oznacza mniej niż 6 minut przestoju w skali całego roku.
Ilustracja dla slajdu 1
2/50
Czym jest dostępność?
Dostępność to metryka określająca, przez jaki procent czasu system jest sprawny dla użytkowników. To kluczowy wskaźnik jakości usługi (QoS), mający bezpośredni wpływ na satysfakcję klienta i zaufanie do dostawcy. Oblicza się ją jako stosunek czasu sprawnego działania (uptime) do całkowitego czasu w danym okresie. Wysoka dostępność wymaga starannego planowania, wdrożenia redundancji, mechanizmów automatycznego przełączania awaryjnego (failover) oraz proaktywnego monitorowania stanu wszystkich komponentów.
Ilustracja dla slajdu 2
3/50
SLA, SLO, SLI
Te trzy akronimy to fundament zarządzania niezawodnością. SLI (Service Level Indicator) to konkretna, mierzalna metryka, np. czas odpowiedzi. SLO (Service Level Objective) to wewnętrzny cel dla tej metryki, np. „99,9% żądań musi być poniżej 200 ms”. SLA (Service Level Agreement) to formalna umowa z klientem określająca gwarantowany poziom usług i konsekwencje jego niedotrzymania. Zespoły inżynierskie dążą do spełnienia SLO, które zazwyczaj są bardziej rygorystyczne niż SLA, by zapewnić niezbędny margines błędu.
Ilustracja dla slajdu 3
4/50
Architektury wysokiej dostępności
Budowa systemów HA opiera się na redundancji i automatyzacji. Istnieje kilka modeli: N+1 (jedna dodatkowa instancja zapasowa), N+M (wiele instancji zapasowych). Najbardziej niezawodne systemy wykorzystują architekturę rozproszoną geograficznie (multi-region), gdzie infrastruktura jest zduplikowana w niezależnych centrach danych. Chroni to przed katastrofami na dużą skalę, takimi jak awarie całych regionów sieciowych czy przerwy w dostawie prądu w dużych obszarach metropolitalnych.
Ilustracja dla slajdu 4
5/50
Active-active vs active-passive (Modele redundancji)
To dwa podstawowe modele redundancji. W konfiguracji active-passive tylko jedna instancja obsługuje ruch, a druga jest w trybie gotowości (standby) i przejmuje pracę dopiero w razie awarii. W modelu active-active wszystkie instancje jednocześnie obsługują żądania, co zapewnia nie tylko wysoką dostępność, ale i skalowalność, bo zasoby wszystkich maszyn pracują. Choć model active-active jest bardziej złożony w konfiguracji i synchronizacji danych, oferuje lepszą wydajność i krótszy czas przełączania.
Ilustracja dla slajdu 5
6/50
Rozkład obciążenia (Load balancing) – modele
Równoważenie obciążenia (load balancing) jest kluczem do HA. Load balancery warstwy 4 (transportowej) działają na poziomie IP i portów (np. TCP), co jest proste i wydajne. Load balancery warstwy 7 (aplikacyjnej) analizują treść żądania (np. ścieżki URL, nagłówki, ciasteczka HTTP), co pozwala na inteligentny routing do specyficznych usług. Dzięki temu można precyzyjniej zarządzać ruchem, realizować bezpieczne wdrożenia i optymalizować wykorzystanie zasobów serwerowych w zależności od rodzaju zapytania.
Ilustracja dla slajdu 6
7/50
Rodzaje równoważników obciążenia
Równoważenie obciążenia może być sprzętowe (wysoka wydajność, ale wysoki koszt i mała elastyczność) lub programowe (Nginx, HAProxy, usługi chmurowe typu AWS ELB). Programowe rozwiązania oferują ogromną elastyczność i łatwe skalowanie w poziomie. Istnieje też równoważenie po stronie klienta (client-side load balancing), gdzie aplikacja sama wybiera serwer z listy dostępnych. Każde podejście ma swoje zady i zalety w zależności od skali systemu, budżetu i wymagań co do czasu odpowiedzi.
Ilustracja dla slajdu 7
8/50
Skalowanie pionowe (Scale-up)
Skalowanie pionowe polega na zwiększaniu mocy pojedynczego serwera (więcej CPU, RAM, szybsze dyski). To najprostsza metoda, niewymagająca zmian w architekturze kodu. Ma jednak limity fizyczne i rosnące wykładniczo koszty. Największą wadą jest to, że nie poprawia ono dostępności – wciąż mamy pojedynczy punkt awarii (SPOF). Jeśli ten potężny serwer zawiedzie, usługa znika. Skalowanie pionowe stosuje się zazwyczaj w początkowej fazie projektu lub dla specyficznych baz danych, których nie da się łatwo rozproszyć.
Ilustracja dla slajdu 8
9/50
Skalowanie poziome (Scale-out)
Skalowanie poziome to dodawanie kolejnych, mniejszych serwerów pod load balancerem. To fundament nowoczesnych chmur, pozwalający na niemal nieograniczoną rozbudowę. Wymaga jednak, by aplikacja była „bezstanowa” (stateless), czyli nie przechowywała danych sesji lokalnie na dysku jednego serwera. Skalowanie poziome naturalnie buduje wysoką dostępność – awaria jednego serwera w grupie 10 czy 100 jest niemal niezauważalna dla użytkowników, a uszkodzoną maszynę można automatycznie wymienić na nową.
Ilustracja dla slajdu 9
10/50
Skalowanie aplikacji webowych
Skalowanie trójwarstwowej aplikacji wymaga podejścia do każdego poziomu osobno. Warstwa webowa (interfejs) i aplikacyjna (logika) są zazwyczaj bezstanowe i skalują się poziomo dość łatwo. Warunkiem jest delegacja stanu (np. sesji użytkownika) do zewnętrznego magazynu pamięci podręcznej (np. Redis). Największym wyzwaniem pozostaje warstwa danych (bazy danych), która wymaga bardziej zaawansowanych technik replikacji i synchronizacji, by zachować spójność informacji przy jednoczesnym wzroście liczby zapytań.
Ilustracja dla slajdu 10
11/50
Skalowanie baz danych
Skalowanie baz danych to trudny proces. Odczyty (read) skaluje się przez tworzenie replik (read replicas). Zapisy (write) są wyzwaniem, z którym radzi sobie sharding (dzielenie bazy na mniejsze partycje) lub przejście na rozproszone bazy NoSQL (np. Cassandra, MongoDB), zaprojektowane od podstaw pod skalowanie poziome. Każda z tych metod ma swoje kompromisy, opisane twierdzeniem CAP (Consistency, Availability, Partition tolerance), które mówi, że w systemie rozproszonym nie można zagwarantować wszystkich trzech cech naraz.
Ilustracja dla slajdu 11
12/50
Replikacja danych
Replikacja zapewnia HA i skalowalność odczytu. W modelu master-slave, serwer główny (master) obsługuje wszystkie zapisy, a zmiany są kopiowane na serwery zapasowe (slaves). Jeśli master ulegnie awarii, jeden z węzłów slave jest automatycznie „promowany” na nowego mastera. Replikacja może być synchroniczna (gwarantuje brak utraty danych, ale jest wolniejsza) lub asynchroniczna (szybsza, ale dopuszcza minimalną utratę danych przy awarii). Wybór zależy od krytyczności danych i wymagań co do czasu odpowiedzi aplikacji.
Ilustracja dla slajdu 12
13/50
Systemy kolejek wiadomości
Kolejki (np. RabbitMQ, Kafka) rozdzielają usługi, pozwalając na komunikację asynchroniczną. Usługa wysyła zadanie do kolejki i natychmiast wraca do pracy, nie czekając na przetworzenie danych. Inna usługa (konsument) pobiera zadania z kolejki we własnym tempie. Taka architektura zwiększa odporność: jeśli konsument ulegnie awarii, zadania czekają bezpiecznie w kolejce. Kolejki działają też jak bufor (tłumik), który chroni backend przed nagłymi skokami ruchu (np. podczas kampanii reklamowych czy „czarnych piątków”).
Ilustracja dla slajdu 13
14/50
Pamięć podręczna (Caching)
Caching to przechowywanie wyników ciężkich obliczeń lub zapytań do bazy w szybkiej pamięci (Redis, Memcached). Dzięki temu kolejne żądania o te same dane nie obciążają bazy danych, a użytkownik otrzymuje odpowiedź niemal natychmiast (milisekundy). To najtańszy i najskuteczniejszy sposób na poprawę skalowalności. Kluczem do sukcesu jest właściwa strategia unieważniania (invalidation) – musimy decydować, jak długo dane mogą być „nieświeże”, by nie serwować użytkownikom błędnych informacji (np. starych cen czy stanów magazynowych).
Ilustracja dla slajdu 14
15/50
Sieci dostarczania treści (CDN)
CDN (Content Delivery Network) to sieć serwerów rozproszona po całym świecie. Przechowuje ona kopie obrazów, filmów i skryptów blisko użytkownika (np. w Warszawie zamiast w USA). To drastycznie skraca czas ładowania strony i odciąża główny serwer, który nie musi wysyłać tych samych plików tysiące razy. CDN zapewnia też dodatkową warstwę ochrony przed atakami DDoS, rozpraszając zmasowany atak na setki swoich węzłów brzegowych (edge nodes), co czyni go niemal niemożliwym do zatrzymania.
Ilustracja dla slajdu 15
16/50
Mechanizmy przełączania awaryjnego (Failover)
Failover to automatyczny proces ratunkowy. Wymaga on systemu detekcji awarii (heartbeat) oraz metody przekierowania ruchu (np. wirtualne adresy IP lub zmiany w rekordach DNS). Kluczowe, by proces był szybki i nie wymagał interwencji ludzkiej w środku nocy. W systemach rozproszonych failover może dotyczyć pojedynczego kontenera, całego serwera lub całego kraju. Dobrze zautomatyzowany failover czyni awarię niezauważalną dla użytkownika końcowego, zachowując ciągłość transakcji biznesowych.
Ilustracja dla slajdu 16
17/50
Mechanizmy ochrony usugi (Watchdog)
Watchdog to strażnik monitorujący stan aplikacji. Aplikacja musi regularnie wysyłać do niego sygnał „żyję”. Jeśli sygnał nie dotrze w określonym czasie, watchdog uznaje, że system się zawiesił i podejmuje drastyczne, ale skuteczne działanie: zabicie procesu i jego restart lub restart całej maszyny. To prosta i skuteczna metoda na błędy typu „memory leak” (wyciek pamięci) czy „deadlocks” (zakleszczenia procesów), które po pewnym czasie paraliżują system, a których nie da się łatwo wyeliminować z kodu źródłowego.
Ilustracja dla slajdu 17
18/50
Sygnały życia (Heartbeat)
Heartbeat to sieć małych sygnałów („bicie serca”) wymienianych między węzłami klastra. Każdy węzeł co sekundę mówi pozostałym: „Nadal tu jestem i działam”. Brak sygnału oznacza awarię i triggeruje proces failover. Aby unikać błędnych decyzji wywołanych chwilową zadyszką sieci, heartbeat powinien mieć własne, dedykowane łącze lub korzystać z kilku niezależnych ścieżek komunikacji. To podstawa systemów klastrowych, pozwalająca na szybkie, oparte na faktach podejmowanie decyzji o wykluczeniu uszkodzonego elementu.
Ilustracja dla slajdu 18
19/50
Klastrowanie (Clustering)
Klaster to grupa serwerów współpracujących jako jedna jednostka. Klastry HA (High Availability) chronią przed awariami. Klastry Load Balancing rozdzielają pracę dla wydajności. Klastry obliczeniowe (HPC) łączą moc do ciężkich zadań. Zaletą klastrowania jest to, że administrator zarządza całą grupą, a systemy potrafią same wykrywać brakujące węzły i balansować obciążenie tak, by strata jednej maszyny nie była odczuwalna dla aplikacji. To najwyższy stopień organizacji infrastruktury technicznej.
Ilustracja dla slajdu 19
20/50
HA w środowiskach kontenerowych
Orkiestratory takie jak Kubernetes automatyzują wysoką dostępność. Obiekt ReplicaSet pilnuje, by zawsze działała zadana liczba kopii aplikacji. Jeśli kontener padnie, Kubernetes natychmiast uruchamia nowy na innym węźle. Zdrowie kontenerów sprawdzają „proby” (liveness i readiness probes). Dzięki temu system sam się naprawia (self-healing). Cała infrastruktura serwerowa (węzły) jest schowana za systemem abstrakcji, co pozwala administratorowi skupić się na deklarowaniu stanu docelowego (np. „chcę 5 instancji”), a nie na ręcznej naprawie każdej z nich.
Ilustracja dla slajdu 20
21/50
Kubernetes i wysoka dostępność
W pełni wysokodostępny klaster Kubernetes wymaga redundancji warstwy sterującej (control plane – minimum 3 bazy etcd i serwery API). Węzły robocze (workers) powinny być rozproszone w różnych strefach dostępności (Availability Zones). Jeśli zniknie cała strefa w chmurze (np. awaria centrum danych w Irlandii), Kubernetes automatycznie przeniesie kluczowe usługi do działającej strefy w Niemczech. To podejście „cloud-native”, gdzie odporność na awarie jest wpisana w samą strukturę systemu orkiestracji.
Ilustracja dla slajdu 21
22/50
Zarządzanie stanem (StatefulSets)
Bazy danych w kontenerach wymagają obiektów StatefulSet. Zapewniają one stabilne identyfikatory (np. baza-0, baza-1) i stałe dyski (Persistent Volumes). Dyski te „wędrują” za kontenerem – jeśli baza zostanie zrekonstruowana na innym serwerze, ten serwer automatycznie podłączy jej stary dysk z danymi. StatefulSets gwarantują też kolejność uruchamiania i wyłączania, co jest niezbędne w klastrach bazodanowych, gdzie kolejność ma znaczenie dla poprawności replikacji i uniknięcia uszkodzenia bazy.
Ilustracja dla slajdu 22
23/50
Skonfigurowanie HA dla usług krytycznych
Dla usług krytycznych HA musi być holistyczne. Redundancja musi dotyczyć każdego ogniwa: prądu, sieci, serwerów (load balancery), bazy danych i logiki. Nawet najlepszy klaster padnie, jeśli ma tylko jedną bramę wyjściową do Internetu. Każdy element musi mieć co najmniej jeden zapas (zasada mechanizmu 1+1). Niezbędne jest też monitorowanie samego mechanizmu HA – musimy wiedzieć, kiedy zapasowy serwer przestaje działać, by nie obudzić się w sytuacji, w której „zapas nie zadziałał, gdy był potrzebny”.
Ilustracja dla slajdu 23
24/50
Eliminacja pojedynczych punktów awarii (SPOF)
Identyfikacja i usuwanie SPOF-ów to podstawa inżynierii HA. Analizujemy ścieżkę od zasilacza w serwerze, przez kable sieciowe, switch, firewall, aż po dostawcę domeny. Jeśli awaria JEDNEGO elementu kładzie CAŁY system – to jest SPOF. Usuwamy go przez dublowanie (np. dwa zasilacze, dwa kable do różnych switchy, dwie niezależne bazy danych). To proces ciągły, bo nowe funkcje czy zmiany w infrastrukturze często wprowadzają ukryte SPOF-y, które trzeba proaktywnie eliminować na etapie projektowania.
Ilustracja dla slajdu 24
25/50
Analiza odporności systemu
Analiza odporności to sprawdzanie scenariuszy: „Co jeśli?”. Używa się metod takich jak FMEA (Failure Mode and Effects Analysis) do systematycznego spisywania zagrożeń i oceny ich skutków. Wynik to mapa ryzyka, która mówi, gdzie system jest najsłabszy. Taka analiza pozwala świadomie decydować: czy inwestujemy w drugi zapasowy zasilacz, czy akceptujemy ryzyko na tym poziomie. Odporność to nie brak awarii, ale świadome zarządzanie konsekwencjami ich wystąpienia i minimalizacja strat dla biznesu.
Ilustracja dla slajdu 25
26/50
Testy obciążeniowe
Testy obciążeniowe sprawdzają, czy system wytrzyma zakładany ruch (np. 10 000 użytkowników naraz). Pozwalają znaleźć „wąskie gardła” (bottlenecks) – elementy, które pierwsze spowalniają pracę. To jak testowanie mostu pod ciężkim transportem. Testy te są niezbędne przed dużymi wydarzeniami (kampanie, premiery). Pozwalają określić limit systemu, sprawdzić stabilność bazy danych oraz zweryfikować, czy automatyczne skalowanie (auto-scaling) faktycznie dodaje nowe serwery w odpowiednim czasie, zanim system zacznie odrzucać żądania.
Ilustracja dla slajdu 26
27/50
Testy przeciążeniowe (Stress testing)
Stress testing idzie o krok dalej – celowo „łamie” system. Sprawdzamy, co się stanie po przekroczeniu granic wytrzymałości (np. 10-krotny ruch). Celem jest upewnienie się, że system „umiera z godnością” – czyli nie gubi danych, nie psuje bazy i, co najważniejsze, potrafi sam wrócić do życia (graceful recovery), gdy obciążenie spadnie. To kluczowe, by uniknąć sytuacji „śmierci kaskadowej”, gdy jedna awaria trwale uszkadza system tak, że wymaga on ręcznej interwencji administratora przez wiele godzin.
Ilustracja dla slajdu 27
28/50
Testy wydajności (Load testing)
Load testing skupia się na mierzalnych celach (SLO). Sprawdzamy, czy pod typowym ruchem czas odpowiedzi (latency) mieści się w normie (np. 500 ms). To pozwala na planowanie zasobów (capacity planning) – wiemy, że 1 serwer uciągnie 200 osób, więc dla 1000 osób potrzebujemy 5 serwerów. Regularne testy wydajności po każdej zmianie w kodzie chronią przed „regresją wydajności”, gdy drobna poprawka dewelopera nagle 3-krotnie spowalnia działanie całego serwisu, co na produkcji przy dużym ruchu kończy się awarią.
Ilustracja dla slajdu 28
29/50
Benchmarking
Benchmarking to porównywanie wyników z innymi. Sprawdzamy, czy nasza baza danych działa tak szybko, jak podaje producent, lub czy nowa wersja PHP faktycznie przyspieszyła nasz kod. To pomaga podjąć decyzje biznesowe: „Czy opłaca się wydać 1000 zł więcej na serwer?”. Bez benchmarków działamy w ciemno, opierając się na marketingu dostawców. Rzetelne porównanie różnych typów maszyn wirtualnych czy różnych systemów bazodanowych pozwala na gigantyczne oszczędności przy zachowaniu nienagannej wydajności usług.
Ilustracja dla slajdu 29
30/50
Automatyczne skalowanie (Auto-scaling)
Auto-scaling to „magia” chmury. System sam dodaje serwery, gdy obciążenie CPU przekroczy np. 70%, i sam je usuwa, gdy ludzie wyjdą z pracy i ruch spadnie. To zapewnia elastyczność (usługa nie „padnie” pod nagłym ruchem) i oszczędność (nie płacimy za serwery, które stoją puste w nocy). Konfiguracja wymaga ustalenia progów (metrics) i limitów (min/max instancji), aby uniknąć „puchnięcia” rachunków przy ataku DDoS lub gwałtownego wyłączania serwerów przy chwilowym spadku metryk.
Ilustracja dla slajdu 30
31/50
Skalowanie Podów (HPA)
Horizontal Pod Autoscaler (HPA) to auto-scaler wewnątrz Kubernetesa. Monitoruje on użycie zasobów (CPU/RAM) przez kontenery i dynamicznie zmienia liczbę replik. Jeśli np. promocja w sklepie generuje gigantyczny ruch, HPA w sekundę zwiększy liczbę kontenerów z 10 do 50, rozkładając obciążenie. To pozwala na błyskawiczną reakcję na trendy, której człowiek nie byłby w stanie wykonać ręcznie. HPA umożliwia też skalowanie w oparciu o niestandardowe metryki, np. liczbę oczekujących wiadomości w kolejce.
Ilustracja dla slajdu 31
32/50
Zapasowe centra danych
Zapasowe centra danych (DR Site) to najwyższy poziom zabezpieczenia. Hot Site (gorący zapas) to gotowa kopia systemów, działająca równolegle, gotowa przejąć ruch w milisekundy. Warm Site (ciepły zapas) ma gotowy sprzęt i dane, ale wymaga chwili na uruchomienie aplikacji. Cold Site (zimny zapas) to tylko pusta hala z prądem – najtańszy, ale przywrócenie usług zajmie tygodnie. Wybór zależy od tego, ile firma straci w 1 dzień braku działania (analiza BIA - Business Impact Analysis).
Ilustracja dla slajdu 32
33/50
Odzyskiwanie po katastrofie (Disaster Recovery)
Disaster Recovery (DR) to plan na „koniec świata” (pożar, wojna, paraliż regionu). To nie tylko technika, ale procedury: kto ma klucze, kto zna hasła, jak powiadomić pracowników. Plan DR musi być spisany na papierze i regularnie testowany. Bez testu plan DR to tylko bajka – zazwyczaj okazuje się, że backupy są nieczytelne, nikt nie pamięta hasła do vaulta, a serwery zapasowe nie mają prądu. Prawidłowy proces DR to gwarancja przetrwania firmy w ekstremalnie trudnych warunkach rynkowych i losowych.
Ilustracja dla slajdu 33
34/50
Parametry RTO i RPO
RTO (Recovery Time Objective) to czas, w jakim musimy odzyskać działanie (np. „musimy wstać w 2h”). RPO (Recovery Point Objective) to data ostatnich danych, które możemy stracić (np. „możemy stracić dane z ostatnich 15 min”). Te dwa parametry dyktują cenę systemu – system z RTO i RPO bliskim zeru kosztuje fortunę, bo wymaga ciągłej, synchronicznej replikacji danych między kontynentami. Biznes musi zdecydować, na ile danych i czasu przestoju może sobie pozwolić przed bankructwem.
Ilustracja dla slajdu 34
35/50
Strategie odzyskiwania (Disaster Recovery)
Różne sytuacje wymagają różnych reakcji. Najprostsza to „Backup and Restore” (odzyskaj z taśmy/dysku). Szybsza to „Pilot Light” – baza danych replikuje się na żywo, ale serwery aplikacji są wyłączone. Jeszcze szybsza to „Warm Standby” (serwery działają na minimum). Najdroższa to „Multi-Site Active-Active” – wszystko działa naraz w dwóch miejscach. Wybór strategii to kompromis między kosztem utrzymania pustej infrastruktury a potencjalnymi stratami wynikającymi z długiego czasu naprawy (downtime).
Ilustracja dla slajdu 35
36/50
Kopia zapasowa i odtwarzanie
Backup to „świętość”. Zasada 3-2-1: 3 kopie danych, na 2 różnych nośnikach, 1 kopia w innej lokalizacji (poza biurem/chmurą). Kopia to nie tylko pliki, ale i obrazy całych serwerów (Snapshots). Najważniejsze to regularne TESTOWANIE odtwarzania. Administrator, który nie testuje backupów, tylko „wierzy”, że one działają. W dobie Ransomware (wyłudzeń danych), offline backup (odcięty od sieci) to jedyna pewna metoda na odzyskanie firmy po ataku hakerskim, który usuwa wszystkie dane online.
Ilustracja dla slajdu 36
37/50
Replikacja między centrami danych
Aby chronić dane przed katastrofą lokalną, musimy je replikować między centrami danych (DC). Replikacja może być na poziomie macierzy (storage), bazy danych lub aplikacji. Kluczowym ograniczeniem jest tu prędkość światła – im dalej centra od siebie, tym większe opóźnienie (latency). To wymusza stosowanie replikacji asynchronicznej (z pewnym opóźnieniem zapisu na zapasie), co oznacza ryzyko utraty kilku sekund danych w przypadku nagłej awarii łącza lub całego centrum głównego.
Ilustracja dla slajdu 37
38/50
Monitorowanie pod kątem wysokiej dostępności
W HA monitorujemy nie tylko czy serwer „żyje” (ping), ale czy usługa spełnia swoje zadanie. Monitorujemy zdrowie replikacji (replication lag), stan mechanizmów heartbeat i logi błędów load balancera. System monitoringu musi sam być wysokodostępny – jeśli padnie monitoring, administrator staje się „ślepy”. Kluczowe jest wczesne wykrywanie trendów (np. kończąca się pamięć), by zdążyć z interwencją, zanim mechanizm failover będzie musiał zadziałać, co zawsze niesie ze sobą pewne ryzyko chwilowej niestabilności.
Ilustracja dla slajdu 38
39/50
Alerty dostępności usług
Alerty muszą być mądre. Używamy monitoringu zewnętrznego (Black-box), sprawdzającego dostępność strony z Internetu (z różnych miast świata). Alert o niedostępności musi budzić ludzi („Critical Alert”), ale alert o 80% CPU o 3 w nocy powinien tylko zapisać się w logach do analizy rano. Przeładowanie administratorów nieistotnymi alarmami prowadzi do „alert fatigue” – gdy wystąpi prawdziwa awaria, zostanie ona zignorowana jako kolejny błąd konfiguracyjny lub „szum” w systemie monitorowania.
Ilustracja dla slajdu 39
40/50
Wykrywanie degradacji wydajności
Degradacja to „cicha śmierć” systemu. Strona niby działa, ale zamiast 1s ładuje się 15s. To wygania klientów szybciej niż brak strony. Systemy monitoringu (np. Prometheus) muszą śledzić percentyle (np. P99), by wykryć te spowolnienia. Analiza anomalii pozwala wykryć problem, zanim usługa całkowicie padnie. Często przyczyną degradacji jest „leaking” (wyciek) zasobów lub zapchanie łączy sieciowych, które narasta powoli, maskując się w średnich statystykach, co daje złudne poczucie bezpieczeństwa u administratora.
Ilustracja dla slajdu 40
41/50
Ograniczenie wpływu awarii (Circuit Breaker)
Mechanizm Circuit Breaker (bezpiecznik) chroni system przed reakcją łańcuchową. Jeśli usługa zewnętrzna (np. płatności) spowalnia, „otwieramy bezpiecznik” i natychmiast zwracamy błąd użytkownikowi, zamiast kazać mu czekać 30s. To ratuje nasze własne serwery przed zablokowaniem wszystkich wątków przez czekanie na coś, co i tak nie działa. Po pewnym czasie „zamykamy bezpiecznik”, by sprawdzić, czy usługa zewnętrzna już ozdrowiała. To kluczowa technika w budowaniu odpornych mikrousług, chroniąca system przed paraliżem kaskadowym.
Ilustracja dla slajdu 41
42/50
Wdrożenia kanarkowe (Canary deployments)
Wdrożenie „kanarkowe” to puszczanie nowej wersji kodu tylko na 1-5% ruchu. Monitoring sprawdza, czy ta mała grupa użytkowników ma błędy. Jeśli „kanarek przeżył” (brak błędów), zwiększamy ruch na nową wersję. To najbezpieczniejsza metoda aktualizacji dużych systemów. Jeśli w nowym kodzie jest błąd, ucierpi tylko garstka osób, a nie wszyscy klienci. Metoda ta pozwala na testowanie nowej logiki biznesowej na „żywym organizmie” przy minimalnym ryzyku dla wizerunku i przychodów firmy.
Ilustracja dla slajdu 42
43/50
Wdrożenia niebiesko-zielone (Blue-green)
Utrzymujemy dwa identyczne środowiska: Niebieskie (produkcja) i Zielone (testy nowej wersji). Gdy Zielone jest gotowe, jednym kliknięciem na load balancerze przełączamy CAŁY ruch na Zielone. Jeśli coś pójdzie nie tak – jednym kliknięciem wracamy na stare Niebieskie (Instant Rollback). To eliminuje stres przy aktualizacjach i zapewnia zerowy czas przestoju (Zero Downtime). Metoda ta wymaga jednak dwukrotnie większej infrastruktury, co podnosi koszty operacyjne, ale drastycznie skraca czas okien serwisowych.
Ilustracja dla slajdu 43
44/50
Aktualizacje kroczące (Rolling updates)
Rolling update to wymienianie serwerów/kontenerów jeden po drugim. Kubernetes wyłącza 1 stary pod, włącza 1 nowy, czeka aż będzie gotowy i przechodzi do następnego. Dzięki temu usługa cały czas działa (z 90% wydajnością podczas procesu). To standard w kontenerach. Jeśli nowy pod nie wstaje (błąd startu), proces jest przerywany, a stara wersja nadal obsługuje ruch. Pozwala to na uniknięcie katastrofalnych awarii przy wdrażaniu błędnego kodu, który uniemożliwia uruchomienie aplikacji (crash looping).
Ilustracja dla slajdu 44
45/50
Przykład architektury o wysokiej dostępności
Idealna architektura: Ruch z Internetu (CDN + Route53) trafia do Load Balancera (ALB), który rozrzuca go na serwery w 3 różnych strefach (AZ). Aplikacje są bezstanowe, a sesję trzymają w klastrze Redis. Dane trafiają do bazy (np. AWS Aurora) rozproszonej w 3 strefach, z automatycznym failoverem. Backupy są replikowane do innego regionu geograficznego. Taki system przeżyje awarię pojedynczego serwera, bazy, a nawet całego wielkiego centrum danych Amazonu, zachowując nienaganną dostępność dla użytkowników końcowych.
Ilustracja dla slajdu 45
46/50
Planowanie ciągłości działania (BCP)
BCP (Business Continuity Planning) to szerszy plan niż techniczne DR. Obejmuje: jak firma ma pracować bez Internetu? Gdzie mają się spotkać pracownicy? Jak zapłacić faktury, gdy system bankowy padnie? To analiza wpływu na biznes (BIA) i procedury awaryjne. Dobry plan BCP pozwala firmie przetrwać nawet miesiące chaosu rynkowego, skupiając się na najważniejszych funkcjach życiowych organizacji i stopniowym przywracaniu mniej istotnych procesów w miarę odzyskiwania stabilności.
Ilustracja dla slajdu 46
47/50
Koszty wysokiej dostępności
HA nie jest darmowe. Każda kolejna „dziewiątka” (z 99,9% na 99,99%) kosztuje 10x więcej. Wymaga to dublowania sprzętu, licencji, łączy i przede wszystkim czasu drogich ekspertów. Biznes musi wiedzieć: „Czy godzina przestoju kosztuje nas więcej niż utrzymanie zapasowego serwera?”. Często okazuje się, że dla mniejszych firm 99% (3.5 dnia przestoju rocznie) jest akceptowalne, podczas gdy dla banku 99.9% (9h przestoju) to już katastrofa grożąca utratą licencji lub gigantycznymi karami finansowymi.
Ilustracja dla slajdu 47
48/50
Automatyzacja infrastruktury
Aby HA było powtarzalne, musimy używać kodu do budowy serwerów (Infrastructure as Code - Terraform). Pozwala to na błyskawiczne odtworzenie całej infrastruktury w nowym regionie w razie katastrofy (DR). Ręczna konfiguracja serwerów przez „klikanie” to proszenie się o błędy i uniemożliwienie szybkiego powrotu po awarii. Dzięki IaC cała nasza serwerownia jest zapisana w plikach tekstowych na Git, co gwarantuje spójność, łatwość audytu oraz możliwość testowania zmian infrastrukturalnych na kopiach przed ich wdrożeniem.
Ilustracja dla slajdu 48
49/50
Podsumowanie
Wysoka dostępność i skalowanie to niekończąca się podróż, a nie cel. Wymaga to zmiany myślenia z „naprawiania serwerów” na „projektowanie systemów odpornych na awarie”. Kluczem jest redundancja, bezstanowość, automatyzacja i przede wszystkim – kultura testowania wszystkiego (od kodu po backupy). System idealny nie istnieje, ale dzięki opisanym technikom możemy budować usługi, które służą milionom ludzi bez przerwy, będąc fundamentem nowoczesnej gospodarki cyfrowej i zaufania użytkowników do technologii.
Ilustracja dla slajdu 49
50/50
Sesja pytań
Dziękuję za uwagę i wytrwałość. Przeszliśmy przez najbardziej zaawansowane tematy inżynierii usług sieciowych. Wiedza o tym, jak budować systemy, które się nie psują (lub psują w sposób kontrolowany), to jedna z najbardziej pożądanych kompetencji na rynku IT. Teraz jest czas na Państwa pytania – czy to o konkretne technologie (Kubernetes, Terraform, AWS), czy o strategie biznesowe. Zapraszam do dyskusji i dzielenia się spostrzeżeniami dotyczącymi skalowania Państwa własnych projektów studenckich i zawodowych.
Ilustracja dla slajdu 50