Jak stworzyć wysokodostępne środowisko w chmurze: load balancery, autoscaling i projekt sieci

0
55
3/5 - (4 votes)

Nawigacja:

Cel biznesowy wysokodostępnego środowiska w chmurze

Intencją wdrożenia wysokodostępnego środowiska w chmurze jest utrzymanie działania kluczowych systemów nawet wtedy, gdy zawodzą pojedyncze komponenty: serwery aplikacyjne, baza danych, cała strefa dostępności lub elementy sieci. Chodzi o praktyczne pogodzenie trzech osi: dostępności, kosztów i złożoności operacyjnej.

Co wiemy? Nawet najlepiej zaprojektowana infrastruktura nie osiągnie 100% dostępności, a każda „dodatkowa dziewiątka” kosztuje nieproporcjonalnie więcej. Czego nie wiemy na starcie? Jakie konkretnie kompromisy zaakceptuje biznes, gdy przyjdzie zapłacić rachunek za nadmiarowość, testy awaryjne i utrzymanie.

Frazy kluczowe, które opisują ten obszar: architektura wysokiej dostępności w chmurze, load balancer warstwy 4 i 7, autoscaling poziomy i pionowy, projekt sieci w wielu strefach dostępności, health check i mechanizmy failover, wzorce HA dla mikroserwisów, sesje użytkowników a równoważenie obciążenia, tolerancja awarii i chaos engineering, infrastruktura jako kod i HA, monitoring SLI SLO SLA.

Programista w okularach pracuje nad projektem chmurowym przy komputerze
Źródło: Pexels | Autor: cang hai

Czym jest wysoka dostępność w środowisku chmurowym

Dostępność a niezawodność – podobne, ale nie to samo

Wysoka dostępność (High Availability, HA) w środowisku chmurowym oznacza zdolność systemu do nieprzerwanego świadczenia usług z akceptowalnym poziomem przerw. System może być zbudowany z elementów, które czasem zawodzą, ale całość jest tak zaprojektowana, by użytkownik końcowy tych awarii prawie nie odczuł.

Niezawodność dotyczy pojedynczych komponentów – serwera, dysku, łącza. Im wyższa niezawodność każdego elementu, tym rzadziej dochodzi do awarii. W praktyce jednak znacznie skuteczniejsza jest strategia: zakładamy awarie, ale projektujemy redundancję i szybkie przełączanie (failover). Chmura publiczna jest wprost zbudowana na tej filozofii.

Dostępność mierzy się zwykle jako procentowy czas, w którym usługa działa poprawnie w zadanym okresie (np. miesiąc, rok). Niezawodność – jako prawdopodobieństwo, że dany komponent będzie działał bezawaryjnie przez określony czas. Architekt projektujący środowisko w chmurze operuje jednym i drugim, ale na poziomie systemu liczy się łączny efekt odczuwany przez użytkownika.

Jak biznes definiuje wysoką dostępność: RTO, RPO i akceptowalne przerwy

Wymagania biznesowe rzadko brzmią „potrzebujemy 99,95% dostępności”. Częściej przyjmują postać zdań w rodzaju: „zamówienia online muszą przechodzić nawet w czasie awarii centrum danych” albo „system sprzedaży może nie działać maksymalnie 15 minut w ciągu miesiąca”. Z tego da się wyprowadzić bardziej techniczne parametry.

Dwa podstawowe wskaźniki to:

  • RTO (Recovery Time Objective) – maksymalny akceptowalny czas przywracania usługi po awarii. Jeśli RTO wynosi 5 minut, architektura musi umożliwiać automatyczne lub bardzo szybkie przełączenie na zapasowe zasoby.
  • RPO (Recovery Point Objective) – maksymalna akceptowalna utrata danych, mierzona w czasie. RPO = 0 oznacza, że żadna transakcja nie może zginąć. RPO = 5 minut dopuszcza utratę części danych z ostatnich minut.

Z RTO i RPO wynika, jak agresywnie trzeba stosować replikację danych, synchronizację między regionami, backup i mechanizmy failover. Na przykład architektura wysokiej dostępności w chmurze dla systemu płatności online będzie inna niż dla bloga firmowego, bo inne są parametry tolerowane przez biznes.

Modele dostępności i znaczenie „dziewiątek”

Dostępność bywa opisywana liczbą tzw. dziewiątek. Każda dodatkowa dziewiątka znacząco ogranicza dopuszczalny czas niedostępności w skali roku.

Poziom dostępnościOznaczenieOrientacyjny czas niedostępności w roku
99%dwie dziewiątki~3,65 dnia
99,9%trzy dziewiątki~8,8 godziny
99,99%cztery dziewiątki~52 minuty
99,999%pięć dziewiątek~5 minut

Im wyżej na tej skali, tym trudniej i drożej. Trzy dziewiątki da się osiągnąć w większości projektów przy sensownych kosztach, o ile zastosuje się load balancery, replikację w wielu strefach dostępności i monitoring SLI/SLO/SLA. Pięć dziewiątek to już domena krytycznych systemów z wieloma warstwami redundancji, testami awaryjnymi i mocnymi procedurami operacyjnymi.

Obietnice dostawców chmury: SLA a realna infrastruktura

Dostawcy chmury deklarują poziomy SLA dla poszczególnych usług: maszyn, baz danych, load balancerów, storage’u. Typowo dla instancji w pojedynczej strefie dostępności jest to rząd 99,5–99,9%. Dla rozwiązań rozproszonych w wielu strefach – więcej.

Fakty:

  • SLA dotyczy usługi, nie całego systemu. Np. wysoka dostępność load balancera nie oznacza jeszcze wysokiej dostępności twojej aplikacji i bazy.
  • SLA to obietnica zwrotu części kosztów (kredyty), a nie gwarancja braku przerw.
  • Architekt nie ma wglądu w wewnętrzną infrastrukturę chmury. Dochodzą do niego tylko abstracted services, metryki i komunikaty o incydentach.

Z tego powodu projekt sieci w wielu strefach dostępności i świadome użycie load balancerów oraz autoscalingów staje się kluczowe. Architekt nie kontroluje sprzętu dostawcy, ale decyduje, jak rozproszyć obciążenie, dane i punkty wejścia do systemu.

Podstawowe wzorce architektury HA w chmurze

Redundancja pozioma i pionowa – dlaczego „więcej” nie zawsze znaczy „lepiej”

Redundancja to fundament wysokiej dostępności. Można ją budować na dwa sposoby:

  • Skalowanie pionowe (vertical) – zwiększanie zasobów pojedynczej instancji: więcej CPU, RAM, szybsze dyski. Dobre do szybkiej poprawy wydajności, ale stwarza silny pojedynczy punkt awarii. Jeśli ten serwer padnie, cała usługa znika.
  • Skalowanie poziome (horizontal) – zwiększanie liczby instancji tej samej aplikacji i rozkładanie ruchu przez load balancery. Bardziej sprzyja HA, bo awaria jednej instancji tylko częściowo zmniejsza pojemność systemu.

Architektura wysokiej dostępności w chmurze zwykle opiera się na skalowaniu poziomym. Jednak sam fakt, że działają „trzy maszyny zamiast jednej”, nie gwarantuje sukcesu. Trzeba zapewnić:

  • brak lokalnego stanu na instancji (np. sesje użytkowników poza RAM-em serwera),
  • spójne deploymenty (rolling update zamiast jednoczesnej zmiany na wszystkich),
  • sensowne progi autoscalingu, by nie zabrakło instancji w szczycie.

Zdarza się w praktyce, że zespół „dla bezpieczeństwa” uruchamia kilka dużych maszyn w jednej strefie dostępności, ale bez load balancera, bez wspólnego systemu sesji i bez replikacji bazy. Na papierze jest redundancja, w rzeczywistości pozorna.

Identyfikacja pojedynczych punktów awarii (Single Point of Failure)

Single Point of Failure (SPOF) to komponent, którego awaria zatrzymuje cały system. W środowiskach chmurowych typowe SPOFy to:

  • Baza danych – pojedyncza instancja bez replikacji i automatycznego failoveru.
  • DNS – jeden dostawca lub jedna strefa, brak redundantnego rozwiązania.
  • Load balancer – własny LB w jednej maszynie, zamiast usługi rozproszonej lub klastra.
  • Storage – pojedynczy dysk lub bucket w jednym regionie bez kopii.
  • Komponenty sieciowe – jeden NAT gateway, jeden VPN gateway.

Praktyczna checklista poszukiwania SPOF:

  • Wypisz wszystkie elementy toru żądania użytkownika: od DNS, przez load balancer, aż po bazę danych.
  • Sprawdź, dla każdego z nich: czy istnieje co najmniej drugi, równorzędny komponent w innej strefie / innym AZ?
  • Zweryfikuj, czy ruch i dane mogą automatycznie przełączyć się na zapas (bez ręcznej ingerencji).
  • Przetestuj scenariusz awarii – czy przełączenie faktycznie działa i w jakim czasie.

Często jednym z najtrudniejszych SPOF jest proces deploymentu i konfiguracja. Jeśli tylko jedna osoba rozumie całą infrastrukturę, awaria tej osoby (choćby urlop czy choroba) również staje się zagrożeniem. Tu wchodzą do gry infrastruktura jako kod (IaC) i dobre procedury operacyjne.

Różne warstwy aplikacji i ich potrzeby HA

W klasycznej architekturze trójwarstwowej oraz w mikroserwisach każda warstwa ma inne wymagania co do wysokiej dostępności:

  • Warstwa prezentacji (frontend, API gateway) – musi być dostępna i elastyczna wydajnościowo. Łatwo ją skalować poziomo, zwykle jest bezstanowa. Load balancery warstwy 7 odgrywają tu kluczową rolę.
  • Warstwa logiki biznesowej (backend, mikroserwisy) – wymagania bardziej złożone: komunikacja między usługami, kolejkowanie, odporność na błędy sieci. Wzorce HA obejmują circuit breakers, retry z backoffem, bulkhead.
  • Warstwa danych (bazy, cache, storage) – najtrudniejsza część. Replikacja, sharding, backup, odzyskiwanie po awarii. Tutaj ramach HA trzeba akceptować kompromis między spójnością a dostępnością (CAP theorem).

Przykładowo: front może zostać odtworzony w innym regionie z infrastruktury jako kod w ciągu kilku minut. Baza relacyjna z setkami gigabajtów danych i złożonym schematem – już niekoniecznie, jeśli nie przygotowano replikacji między regionami.

Regiony i strefy dostępności jako minimalny poziom separacji

Dostawcy chmury organizują infrastrukturę w regiony (oddzielone geograficznie lokalizacje) i strefy dostępności (Availability Zones, AZ) – osobne centra danych w obrębie regionu. Projekt sieci w wielu strefach dostępności korzysta z faktu, że awaria jednej AZ nie powinna zwykle wpływać na inne.

Minimalny rozsądny poziom separacji dla środowisk o umiarkowanych wymaganiach HA to:

  • instancje aplikacyjne rozproszone na co najmniej dwie AZ w ramach jednego regionu,
  • load balancer rozproszony, obsługujący wiele AZ,
  • baza danych w trybie Multi-AZ lub z mechanizmem replikacji i automatycznym failoverem.

Dla wyższych wymagań HA (i odporności na katastrofy regionalne) sięga się po architekturę multi-regionową: dane i usługi powielone w dwóch lub więcej regionach, z globalnym load balancingiem. Koszty i złożoność rosną, ale rośnie też odporność na incydenty w skali regionu.

Metalowa konstrukcja na tle nieba z chmurami, nowoczesna architektura
Źródło: Pexels | Autor: 🇻🇳🇻🇳Nguyễn Tiến Thịnh 🇻🇳🇻🇳

Rola load balancerów: typy, funkcje i zastosowania

Load balancer w ujęciu sieciowym i aplikacyjnym

Load balancer to pośrednik, który przyjmuje ruch od klientów i rozkłada go na wiele backendów (instancji). W chmurze jest to zwykle zarządzana usługa, która skaluje się automatycznie i jest sama w sobie wysokodostępna.

Podstawowa terminologia:

  • Backend pool / target group – grupa instancji (serwerów) obsługujących ruch.
  • Listener – punkt nasłuchu na określonym porcie i protokole (np. TCP:443, HTTP:80).
  • Health check – mechanizm sprawdzania zdrowia backendów, zwykle poprzez okresowe żądania HTTP/TCP.

Load balancer jest elementem spinającym autoscaling z architekturą wysokiej dostępności. Dzięki niemu dodawanie i usuwanie instancji nie wymaga zmian po stronie klientów – ruch trafia zawsze na ten sam endpoint LB, a on sam decyduje, do których backendów go rozdzielić.

Load balancer warstwy 4 vs 7 – kiedy który wybrać

Load balancery można podzielić na dwie główne kategorie:

  • Load balancer warstwy 4 (L4) – operuje na poziomie TCP/UDP. Kieruje ruch na podstawie adresów IP i portów, nie analizuje zawartości pakietów. Jest prostszy, szybszy, lepiej nadaje się do protokołów innych niż HTTP/HTTPS.
  • Load balancer warstwy 7 (L7) – działa na poziomie protokołu aplikacyjnego, np. HTTP/HTTPS. Może routować ruch w zależności od URL, nagłówków, ciasteczek, hosta. Umożliwia zaawansowane funkcje: terminację TLS, WAF, przepisywanie ścieżek, A/B testy.

Praktyczne zastosowania:

  • API REST, aplikacje webowe, mikroserwisy HTTP – zwykle korzystają z load balancerów warstwy 7.
  • Architektury zewnętrzne i wewnętrzne: edge LB, wewnętrzny LB, service mesh

    Load balancer nie zawsze jest jeden. W rozbudowanych środowiskach chmurowych stosuje się kilka warstw równoważenia ruchu, każdą z innymi zadaniami.

  • Load balancer brzegowy (edge / public) – wystawiony do Internetu, zakończenie TLS, WAF, ochrona DDoS, podstawowe reguły routingu po hostach i ścieżkach. To on bywa wpisany w DNS jako główny punkt wejścia do aplikacji.
  • Load balancer wewnętrzny (internal) – dostępny tylko z prywatnych adresów w VPC. Kieruje ruch między warstwami (np. frontend → backend, backend → serwisy wspólne). Ogranicza ekspozycję usług na świat i porządkuje zależności.
  • Service mesh / proxy sidecar – lżejsza, rozproszona forma równoważenia ruchu na poziomie mikroserwisów. Każda instancja ma lokalnego „mini-LB” (proxy), który zna topologię usług z centralnej płaszczyzny sterowania i potrafi przełączać ruch między replikami.

Co to zmienia z perspektywy wysokiej dostępności? Edge LB zapewnia odporność na skoki ruchu i awarie pojedynczych AZ, ale nie widzi niuansów między mikroserwisami. Z kolei service mesh pozwala wprowadzać precyzyjne reguły routingowe, retry, timeouts i circuit breakers w samej warstwie sieciowej, bez zmian w kodzie.

W praktyce widać układy trójstopniowe: DNS globalny → publiczny LB multi-AZ → wewnętrzne LB lub mesh w klastrze Kubernetes. Każda warstwa dostarcza inne mechanizmy odporności, ale też dodaje złożoność. Dlatego najpierw warto odpowiedzieć na pytanie: które awarie chcemy łagodzić w której warstwie?

Zaawansowane funkcje load balancerów: health checki, TLS, WAF, canary

Większość zarządzanych load balancerów w chmurze oferuje zestaw funkcji, które bezpośrednio wpływają na dostępność i odporność systemu.

  • Health checki – LB cyklicznie sprawdza backendy. W prostym wariancie jest to ping TCP, w bardziej dojrzałym: dedykowany endpoint HTTP (np. /health). To miejsce na zakodowanie lokalnej logiki: serwis może być „zdrowy”, gdy baza jest osiągalna, kolejki nie są przepełnione, a zależne API zewnętrzne działa. Architekt decyduje, co znaczy „gotowy do przyjmowania ruchu”.
  • Terminacja TLS – rozszczepienie szyfrowania na krawędzi. Połączenie klienta kończy się na load balancerze, a dalej do backendów ruch może być przekazywany w postaci odszyfrowanej (w prywatnej sieci) lub ponownie zaszyfrowany. Ułatwia to rotację certyfikatów i offloaduje CPU na brzeg.
  • WAF (Web Application Firewall) – filtruje ruch HTTP pod kątem znanych wzorców ataków, limituje nietypowe żądania. Chroni aplikację, ale przy zbyt agresywnych regułach może obniżyć dostępność (fałszywe pozytywy). W projektowaniu HA trzeba uwzględnić scenariusze, w których WAF jest w trybie obserwacji, a nie blokady twardej.
  • Routowanie warunkowe i canary – część ruchu (np. 1–5%) może być kierowana na nową wersję usługi. Jeśli metryki się pogorszą, ruch wraca na starą wersję. Dobrze skonfigurowany LB pozwala ograniczyć wpływ błędnych wdrożeń na całą populację użytkowników.

Tu kluczowa jest obserwowalność: load balancer staje się centralnym punktem zbierania metryk (czas odpowiedzi, kody HTTP, błędy na backendach). Gdy coś idzie nie tak, te dane podpowiadają, czy winowajcą jest aplikacja, sieć, czy może sama konfiguracja LB.

Algorytmy równoważenia obciążenia i zarządzanie sesjami

Najpopularniejsze algorytmy rozkładu ruchu

Load balancer potrzebuje strategii decydowania, który backend obsłuży kolejne żądanie. Dostawcy chmury udostępniają kilka klasycznych algorytmów.

  • Round robin – kolejne połączenia trafiają na backendy w pętli: serwer 1, 2, 3, znowu 1, 2, 3. Prosty i przewidywalny, dobry przy zbliżonych parametrach instancji i podobnym czasie trwania żądań.
  • Weighted round robin – odmiana, w której serwery dostają wagi. Mocniejsze maszyny przyjmują większą część ruchu. Przydaje się, gdy grupa backendów ma zróżnicowaną liczbę CPU lub różne generacje instancji.
  • Least connections / least outstanding requests – ruch kierowany jest do backendu z najmniejszą liczbą aktywnych połączeń lub obsługiwanych aktualnie żądań. Dobrze sprawdza się przy dużym zróżnicowaniu czasu obsługi – np. wolniejsze, „ciężkie” operacje nie blokują tak mocno całej puli.
  • Hash-based (np. hash IP, hash nagłówka) – wybór backendu zależy od wyniku funkcji skrótu (np. adres IP klienta, ID użytkownika). Umożliwia deterministyczne kierowanie ruchu do tych samych instancji bez klasycznego „lepienia” sesji.

Z perspektywy HA wybór algorytmu może przesądzić o tym, czy jedna instancja „spali się” pod ciężarem długotrwałych zapytań, podczas gdy inne będą prawie bezczynne. Co wiemy? Statyczne rozkłady (round robin) są prostsze, ale mniej adaptacyjne. Czego nie wiemy, dopóki nie zmierzymy? Jak bardzo zróżnicowane są żądania użytkowników w naszej konkretnej aplikacji.

Sticky sessions (session affinity) – kiedy pomagają, kiedy przeszkadzają

W wielu systemach klienci muszą trafiać na „ten sam” backend przez pewien czas – np. z powodu sesji HTTP trzymanej w RAM. Load balancery oferują wtedy session affinity, czyli „lepienie” klienta do instancji.

Najczęstsze mechanizmy:

  • Cookie-based – LB ustawia ciasteczko identyfikujące backend; każde kolejne żądanie z tym cookie trafia na tę samą maszynę.
  • Source IP affinity – mapa IP klienta → backend. Odpowiednie przy protokołach nieniosących ciasteczek, słabsze przy użytkownikach za wspólnym NAT-em.

Sticky sessions rozwiązują problem bezstanowości w krótkim horyzoncie, ale wprowadzają kilka konsekwencji:

  • utrudniają równy rozkład obciążenia – część backendów jest „przyklejona” do ciężkich użytkowników, podczas gdy nowe instancje długo pozostają niedociążone,
  • komplikują autoscaling – zamknięcie instancji oznacza utratę części sesji i wylogowania użytkowników,
  • utrudniają rolling update – trzeba brać pod uwagę „dociągnięcie” istniejących sesji do końca, często przez drain mode lub connection draining.

Dlatego w projektach nastawionych na wysoką dostępność celem jest najczęściej bezstanowość warstwy aplikacyjnej. Sesje lądują w zewnętrznym cache (Redis, Memcached) lub są zaszyte w tokenach (JWT). Load balancer może wtedy kierować każde żądanie na dowolny backend, a zniknięcie jednej instancji nie zrywa relacji z użytkownikiem.

Connection draining i graceful shutdown

Load balancery w chmurze oferują zwykle mechanizm connection draining (czasem: deregistration delay). Chodzi o to, by instancja, która ma zostać usunięta, nie była „ucięta” w trakcie obsługi żądań.

Typowy przebieg:

  1. Instancja jest oznaczona jako wycofywana (np. przez autoscaler albo operację manualną).
  2. LB przestaje kierować na nią nowe żądania, ale istniejące połączenia mogą się jeszcze zakończyć w zadanym czasie (np. 300 sekund).
  3. Po upływie limitu lub po zakończeniu wszystkich żądań instancja jest wyrejestrowana i może zostać zamknięta.

To prosty element układanki, który realnie wpływa na odczuwaną dostępność: użytkownik nie widzi komunikatu błędu tylko dlatego, że autoscaler zdecydował się właśnie zredukować liczbę maszyn po szczycie ruchu.

Timeouty, retry i ochrona przed „burzą retry”

Zaawansowane load balancery potrafią nie tylko przekazywać ruch, ale też ponawiać niektóre żądania (retry) po stronie infrastruktury. W teorii brzmi to dobrze: krótkotrwały błąd jednego backendu nie jest widoczny dla użytkownika. W praktyce zbyt agresywne retry w połączeniu z niewłaściwymi timeoutami potrafią pogorszyć sytuację.

Kluczowe parametry to:

  • Read/idle timeout – ile LB czeka na odpowiedź backendu, zanim uzna ją za nieudaną,
  • Liczba prób retry – ile razy można spróbować innej instancji,
  • Backoff – czy retry są wykonywane natychmiast, czy z opóźnieniem.

Scenariusz, który często ujawnia się dopiero w testach chaos engineering: awaria bazy spowalnia wszystkie backendy, one odpowiadają coraz później, LB generuje retry, które dokładają dodatkowy ruch, co jeszcze bardziej przeciąża system. To tzw. „burza retry”. Rozwiązaniem jest spójna polityka timeoutów i retry między LB a aplikacją, plus mechanizmy ograniczania ruchu (rate limiting, circuit breakers).

Inżynier przy komputerze projektujący infrastrukturę w chmurze
Źródło: Pexels | Autor: ThisIsEngineering

Autoscaling – jak, kiedy i według czego skalować

Rodzaje autoscalingu: poziomy, pionowy, predykcyjny

W chmurze autoscaling to główny mechanizm zarządzania pojemnością systemu. Występują trzy podstawowe podejścia:

  • Skalowanie poziome (horizontal autoscaling) – dodawanie lub usuwanie instancji. To najczęstszy wariant, bo wpisuje się w architekturę bezstanową i dobrze współpracuje z load balancerami.
  • Skalowanie pionowe (vertical autoscaling) – automatyczna zmiana typu instancji na większy lub mniejszy. Zwykle wiąże się z restartem maszyny, więc nie jest tak płynne. Stosowane raczej w bazach danych lub systemach, które trudno zrównoleglić.
  • Skalowanie predykcyjne – dostosowywanie pojemności na podstawie prognoz (np. cykliczne godziny szczytu w e-commerce). Wymaga historycznych danych i modeli, ale pozwala wyprzedzać skoki ruchu.

Większość dostawców oferuje mechanizmy autoscalingu ściśle powiązane z load balancerami: nowe instancje po starcie są automatycznie rejestrowane w grupie docelowej, a stare – usuwane z zachowaniem connection draining.

Metryki wykorzystywane do skalowania

Decyzja „dodać czy odjąć instancję” nie może zapadać losowo. Autoscaler opiera się na metrykach. Najczęściej używane to:

  • CPU i pamięć – gdy średnie zużycie CPU w grupie przekracza próg (np. 60–70%) przez określony czas, dodawana jest nowa instancja. Analogicznie przy spadku.
  • Liczba żądań na instancję / RPS – skalowanie w oparciu o ruch. Dobre, gdy aplikacja ma przewidywalny koszt obsługi jednego żądania.
  • Opóźnienie (latency) – gdy czas odpowiedzi przekracza próg, może to być sygnał do skalowania. Ten wskaźnik lepiej odzwierciedla odczucia użytkownika, ale bywa trudniejszy do ustabilizowania.
  • Długość kolejek – w systemach z kolejkami (SQS, Pub/Sub, Kafka) klasyczny pattern polega na skalowaniu workerów w zależności od liczby nieprzetworzonych wiadomości.

Architekt decyduje, które metryki są dla danej aplikacji sygnałem przeciążenia, a które są tylko szumem (np. krótkie piki CPU w aplikacji cache’ującej odpowiedzi mogą nie wymagać skalowania).

Progi, histereza i minimalna liczba instancji

Źle ustawiony autoscaling potrafi być sam w sobie źródłem niestabilności. Drobna fluktuacja metryk wywołuje skalowanie w górę, po chwili w dół, i tak w kółko. Taki „ping-pong” jest kosztowny i psuje dostępność.

Standardowe środki zaradcze:

  • Histereza – różne progi dla skalowania w górę i w dół (np. skaluj w górę powyżej 70% CPU, skaluj w dół poniżej 40%).
  • Okno czasowe – metryka musi utrzymać się powyżej progu przez co najmniej kilka minut, by wywołać akcję.
  • Minimalna i maksymalna liczba instancji – dolny limit chroni przed zbyt agresywnym „oszczędzaniem”, górny – przed lawinowym wzrostem kosztów przy błędnej konfiguracji lub ataku.

W systemach krytycznych spotyka się też rezerwę na czarną godzinę: stała liczba instancji ponad to, co wynikałoby z czystej optymalizacji kosztowej. Koszt rośnie, ale w zamian zespół zyskuje bufor na nagłe skoki ruchu lub degradację części AZ.

Skalowanie zależne od harmonogramu i zdarzeń biznesowych

Nie każdy skok obciążenia da się wytłumaczyć metrykami technicznymi. Część szczytów ma charakter czysto biznesowy: kampania marketingowa, premiera produktu, okres rozliczenia podatkowego.

Dlatego obok skalowania reaktywnego pojawia się skalowanie według harmonogramu:

Łączenie skalowania reaktywnego z harmonogramem

Skalowanie według kalendarza uzupełnia dane z metryk technicznych, ale nie zastępuje ich. W praktyce dobrze sprawdza się podejście mieszane:

  • bazowy profil pojemności z harmonogramu – np. w dni robocze 8:00–22:00 wyższa minimalna liczba instancji, w nocy niższa,
  • nadbudowany autoscaling reaktywny – który w razie nietypowego ruchu i tak reaguje na CPU, RPS lub opóźnienia.

Takie połączenie ogranicza liczbę „niespodzianek”: jeśli marketing zaplanuje akcję mailową, zespół inżynierski może podnieść bazowy poziom instancji, a resztę zostawić logice skalowania. Co wiemy? Że część ruchu jest przewidywalna. Czego nie wiemy? Jak zareagują użytkownicy – dlatego backup w postaci reaktywnego autoscalingu pozostaje potrzebny.

Oddzielnym przypadkiem są zdarzenia jednorazowe: transmisja na żywo, migracja klientów na nową wersję produktu. Tam typowy wzorzec to ręczne „przepompowanie” grupy autoscalingowej: tymczasowe zwiększenie limitów i minimalnej liczby instancji, połączone ze wzmocnionym monitoringiem i gotowym planem odwrotu.

Autoscaling a limity dostawcy i architektura downstream

Ruch aplikacji nie kończy się na warstwie web. Każda decyzja autoscalera wpływa na bazy danych, cache, kolejki, systemy zewnętrzne. Gdy web potroi liczbę instancji, baza nie stanie się nagle trzy razy szybsza – wręcz przeciwnie, łatwo przekroczyć jej granice.

Dlatego przy projektowaniu skalowania pojawia się kilka pytań kontrolnych:

  • jaką realną pojemność ma baza danych i inne kluczowe usługi,
  • jakie limity API narzucają zewnętrzni dostawcy (płatności, wysyłka SMS, narzędzia analityczne),
  • czy istnieje mechanizm ochronny po stronie backendów (rate limiting, kolejki, circuit breaker).

Autoscaler bez tych ograniczeń może w dobrej wierze przyspieszyć przeciążenie. Stąd popularny wzorzec: web skaluje się szeroko i szybko, natomiast warstwa danych ma znacznie bardziej konserwatywne limity i wspierana jest przez cache oraz kolejki asynchroniczne.

Testowanie autoscalingu i „game days”

Konfiguracja autoscalera często powstaje „na sucho” – w oparciu o intuicję i ogólne zalecenia. Dopiero praktyczne testy pokazują, czy progi, okna czasowe i histereza działają zgodnie z założeniami.

Najbardziej użyteczne są:

  • testy obciążeniowe – symulacja rzeczywistego ruchu (również skokowego) z obserwacją, jak szybko i do jakiego poziomu rośnie liczba instancji oraz jak reagują usługi zależne,
  • „game days” – zaplanowane sesje, podczas których zespół intencjonalnie podnosi i obniża limity, wyłącza część instancji, odcina pojedynczą AZ i patrzy, jak zachowuje się system.

Celem nie jest wymuszenie perfekcyjnej konfiguracji, lecz zbudowanie wiedzy: w jakim czasie od szczytu ruchu pojemność faktycznie rośnie, przy jakich metrykach widać pierwsze objawy degradacji i jak reaguje autoscaler w parze z load balancerem.

Projekt sieci dla wysokiej dostępności: VPC, podsieci, wiele AZ

VPC jako granica izolacji

W chmurach publicznych wirtualna sieć (VPC) jest podstawową jednostką izolacji. To w jej ramach definiowane są podsieci, tablice routingu, bramy internetowe i prywatne połączenia z innymi systemami. Z punktu widzenia wysokiej dostępności VPC pełni kilka ról:

  • umożliwia separację środowisk (produkcja, staging, test) w taki sposób, by awarie lub błędne konfiguracje w jednym z nich nie wpływały na pozostałe,
  • pozwala na kontrolę przepływu ruchu między warstwami (publiczna, aplikacyjna, danych) przez zapisy w tablicach routingu i listach kontroli dostępu,
  • ułatwia integrację z on-premise przez VPN lub łącza dedykowane (Direct Connect, ExpressRoute), co bywa elementem planu ciągłości działania.

Wiele organizacji buduje osobne VPC dla każdej dużej aplikacji lub domeny biznesowej, zamiast jednego „wspólnego” VPC. Ogranicza to blast radius – błąd w konfiguracji nie rozlewa się na wszystkie systemy.

Podsieci publiczne i prywatne

Kolejnym poziomem podziału są podsieci. W środowiskach o podwyższonych wymaganiach bezpieczeństwa i dostępności pojawia się klasyczny podział:

  • podsieci publiczne – z trasą do bramy internetowej; umieszcza się tam zwykle wyłącznie warstwę wejściową: load balancery, ewentualnie proxy lub bastion hosty,
  • podsieci prywatne – bez bezpośredniego dostępu z internetu; tam działają serwery aplikacyjne, bazy danych, cache i inne komponenty wewnętrzne.

Dostęp z prywatnych podsieci na zewnątrz realizowany jest zazwyczaj przez NAT gateway lub instancje NAT, co ogranicza wektor ataku. Z punktu widzenia dostępności istotne jest, by:

  • podsieci publiczne i prywatne były zdefiniowane w każdej używanej strefie dostępności (AZ),
  • komponenty krytyczne (np. NAT gateway, firewall, appliance) miały redundancję w wielu AZ, a nie tylko w jednej.

Jeśli NAT gateway istnieje tylko w jednej strefie, jej awaria może pośrednio zablokować aktualizacje i połączenia wychodzące wszystkich backendów, nawet jeśli same instancje są zdrowe.

Wielostrefowość (multi-AZ) jako standard

W dojrzałych wdrożeniach chmurowych rozkład zasobów na wiele stref dostępności (AZ) jest domyślny. Każda AZ to osobne centrum danych (lub ich grupa), z oddzielnymi źródłami zasilania i łączami sieciowymi. Co to daje z perspektywy wysokiej dostępności?

  • odporność na awarię pojedynczego DC – nawet jeśli jedna AZ przestanie odpowiadać, ruch może zostać przekierowany do pozostałych,
  • lepsze SLA niektórych usług zarządzanych – wiele baz danych, cache czy systemów kolejkowych oferuje klastry rozproszone po AZ,
  • krótkie opóźnienia wewnątrz regionu – w porównaniu z ruchem między regionami, co ułatwia synchronizację.

Praktyczna konsekwencja: każdy komponent, który ma być wysoce dostępny, powinien mieć instancje w co najmniej dwóch AZ, z równomiernym rozkładem ruchu. Dotyczy to zarówno grup autoscalingowych, jak i baz danych z replikacją synchroniczną lub pół-synchroniczną.

Projekt podsieci i adresacji IP

Adresacja IP nie brzmi jak temat związany z dostępnością, ale błędny plan może ograniczyć możliwość skalowania lub rekonfiguracji. Wiele zespołów odkrywa to dopiero wtedy, gdy trzeba dołożyć kolejne dziesiątki instancji, a zakres adresów się kończy.

Bezpieczna praktyka to:

  • rezerwacja szerszych bloków CIDR dla VPC niż wynikałoby z bieżących potrzeb (np. /16 zamiast /24),
  • podział przestrzeni na symetryczne podsieci per AZ – np. po kilka podsieci prywatnych i jedną publiczną w każdej strefie,
  • zaplanowanie marginesu na przyszłe rozszerzenia – dodatkowe podsieci dla nowych usług, stref DMZ, rozdzielenie ruchu batch od interaktywnego.

Podział według funkcji (web, aplikacja, dane, systemy pomocnicze) ułatwia później egzekwowanie polityk bezpieczeństwa i routingu. Jednocześnie zachowanie spójności między AZ zmniejsza liczbę wyjątków w konfiguracji.

Routing, tablice tras i punkty centralne

Tablice routingu decydują, jak pakiety przemieszczają się między podsieciami, bramami internetowymi, NAT-em i ewentualnymi połączeniami VPN. W kontekście wysokiej dostępności problemem stają się centralne punkty przełączania ruchu:

  • pojedyncza tablica routingu, do której przyczepione są wszystkie podsieci,
  • jeden wirtualny appliance pełniący rolę firewalla lub routera,
  • jedno połączenie VPN bez redundancji.

Gdy takie elementy zawodzą, skutki obejmują całe VPC. Dlatego projektując trasy, inżynierowie dążą do:

  • rozproszenia funkcji routingu i filtracji (np. kilka firewalli w różnych AZ, z odrębnymi trasami),
  • zastosowania wysokodostępnych bram dostawcy chmury, zamiast samodzielnie utrzymywanych instancji z oprogramowaniem sieciowym, jeśli to możliwe,
  • redundantnych połączeń z siecią on-premise – co najmniej dwa tunele VPN lub połączenia fizyczne, najlepiej zakończone w różnych lokalizacjach.

Istotne jest również regularne testowanie scenariuszy awaryjnych: co się dzieje, gdy jedna z bram przestaje odpowiadać, jak szybko przełącza się ruch, czy aplikacje „nad” siecią faktycznie to tolerują.

Warstwa bezpieczeństwa: grupy bezpieczeństwa i ACL a dostępność

Grupy bezpieczeństwa (security groups) oraz listy kontroli dostępu (NACL) sterują przepływem ruchu na poziomie pakietów. Ich głównym celem jest bezpieczeństwo, ale błędna konfiguracja przekłada się na dostępność – usługa jest „niedostępna”, bo ruch zostaje odrzucony lub w ogóle nie dociera.

Typowe błędy to:

  • zbyt wąskie reguły – brak otwarcia portów między podsieciami dla protokołów replikacji baz danych, health-checków load balancera czy systemów monitoringu,
  • brak aktualizacji reguł przy dodawaniu nowych podsieci lub AZ,
  • zależność od konkretnych adresów IP zamiast identyfikacji na podstawie tagów, ról lub grup bezpieczeństwa.

W środowiskach, które mają się dynamicznie skalować, reguły sieciowe powinny być możliwie deklaratywne i odnosić się do klas zasobów (np. „instancje w roli web mogą łączyć się z instancjami w roli db na porcie X”), a nie do pojedynczych IP. Dzięki temu nowe instancje w innych AZ automatycznie dziedziczą odpowiednie uprawnienia, bez ręcznej ingerencji.

Wieloregionowość: HA ponad granicami regionu

Rozproszenie zasobów po wielu AZ w jednym regionie zabezpiecza przed awarią pojedynczego centrum danych. Czasem to za mało – organizacja chce być odporna także na problemy całego regionu chmurowego. Tu pojawia się architektura multi-region.

Najczęściej spotykane warianty to:

  • aktywny–pasywny – jeden region obsługuje cały ruch, drugi jest w gotowości; dane są replikowane asynchronicznie, a przełączenie ruchu odbywa się przez zmianę DNS lub konfiguracji globalnego load balancera,
  • aktywny–aktywny – oba regiony obsługują ruch równolegle; wymaga to spójnej strategii replikacji danych i rozwiązywania konfliktów.

Stawka jest wyższa: rośnie złożoność replikacji, koordynacji zmian i testowania scenariuszy failover. W zamian organizacja otrzymuje odporność na awarie o większej skali oraz możliwość kierowania użytkowników do „najbliższego” regionu z punktu widzenia opóźnień.

Globalne load balancery i DNS w architekturze wieloregionowej

Jeżeli aplikacja działa w więcej niż jednym regionie, potrzebna jest warstwa, która rozdzieli ruch pomiędzy nie. W praktyce używa się do tego:

  • globalnych load balancerów – usług dostawcy lub zewnętrznych, które potrafią kierować ruch HTTP/HTTPS na wiele endpointów regionalnych z różnymi strategiami (geo-routing, latency-based, failover),
  • zaawansowanego DNS – rekordy typu „failover” lub „latency-based routing”, które wskazują różne adresy IP w zależności od stanu zdrowia regionu lub lokalizacji użytkownika.

Elementem krytycznym staje się health-check na poziomie regionu. Jeśli jest zbyt prosty (np. ping do pojedynczego endpointu), system może przedwcześnie uznać region za martwy lub przeciwnie – utrzymywać ruch w regionie, który de facto nie jest w stanie obsługiwać żądań biznesowych. Zespół musi zdecydować, jaki sygnał oznacza „region zdrowy”: odpowiedź aplikacji, dostęp do bazy, a może wynik testowego przepływu transakcji.

Połączenia hybrydowe i rola sieci on-premise

W wielu firmach środowisko chmurowe nie jest samodzielną wyspą. Kluczowe systemy – ERP, systemy finansowe, bazy danych klientów – nadal działają w centrach danych on-premise. Wtedy wysoką dostępność w chmurze ogranicza często jakość i redundancja połączeń hybrydowych.

Do dyspozycji są zwykle dwa główne mechanizmy:

  • VPN – tańszy i szybszy w uruchomieniu, zależny od internetu i podatny na jego fluktuacje,
  • łącza dedykowane (Direct Connect, ExpressRoute) – bardziej przewidywalne, ale wymagające czasu na wdrożenie i droższe.

Najczęściej zadawane pytania (FAQ)

Co to jest wysoka dostępność w chmurze i czym różni się od niezawodności?

Wysoka dostępność w chmurze (High Availability, HA) oznacza zdolność systemu do ciągłego świadczenia usług z krótkimi, akceptowalnymi przerwami. System może składać się z komponentów, które czasem zawodzą, ale całość jest tak zaprojektowana, by użytkownik praktycznie nie odczuł awarii pojedynczych elementów.

Niezawodność odnosi się do pojedynczych komponentów – serwera, dysku, łącza. Im są trwalsze, tym rzadziej się psują. HA zakłada coś przeciwnego: sprzęt i usługi kiedyś zawiodą, więc kluczowa jest redundancja, automatyczny failover i szybkie przełączanie ruchu. Co wiemy z praktyki? Łatwiej i taniej jest projektować pod awarie, niż próbować je całkowicie wyeliminować.

Jakie poziomy dostępności (dziewiątki) mają realny sens biznesowy?

Popularne poziomy to: 99% (~3,65 dnia niedostępności rocznie), 99,9% (~8,8 godziny), 99,99% (~52 minuty) i 99,999% (~5 minut). Każda dodatkowa „dziewiątka” drastycznie zwiększa koszt i złożoność projektu – od dodatkowych stref dostępności, przez wielokrotne backupy, po rozbudowane procedury operacyjne.

W większości firm realnym kompromisem koszt/korzyść jest poziom 99,9% lub 99,99%. Pięć dziewiątek pojawia się głównie w systemach krytycznych: płatności, bezpieczeństwo, medycyna. Czego często nie wiemy na starcie? Jak duża przerwa jest faktycznie akceptowalna biznesowo i ile firma jest gotowa za jej skrócenie zapłacić.

Jak load balancer wpływa na wysoką dostępność aplikacji w chmurze?

Load balancer rozkłada ruch między wiele instancji aplikacji. Jeśli jedna z nich przestaje odpowiadać, ruch jest kierowany do pozostałych. W praktyce oznacza to, że awaria pojedynczego serwera nie zatrzymuje całej usługi, a jedynie czasowo zmniejsza jej przepustowość.

W chmurze stosuje się zwykle load balancery warstwy 4 (TCP/UDP) i warstwy 7 (HTTP/HTTPS). Warstwa 7 pozwala np. na inteligentne routowanie po URL czy nagłówkach. Kluczowe są poprawne health checki – jeśli są zbyt „łagodne”, load balancer zbyt długo wysyła ruch na martwą instancję; jeśli zbyt agresywne, może odcinać zdrowe serwery przy krótkich skokach opóźnień.

Autoscaling poziomy a pionowy – co lepiej wybrać dla wysokiej dostępności?

Autoscaling pionowy zwiększa zasoby jednej maszyny (CPU, RAM), natomiast autoscaling poziomy dodaje nowe instancje tej samej aplikacji i rozkłada ruch między nie. Z perspektywy HA drugi wariant jest z reguły korzystniejszy, bo nie opiera się na jednym, „napompowanym” serwerze jako krytycznym punkcie.

Modele można łączyć, ale fundamentem wysokiej dostępności powinien być skalowalny, poziomy klaster bez lokalnego stanu (sesje poza RAM-em, dane na współdzielonym storage lub w bazie, konfiguracja z repozytorium). Typowy błąd: powiększanie pojedynczego serwera do granic możliwości zamiast dołożenia kilku mniejszych za load balancerem.

Jak projekt sieci w wielu strefach dostępności zwiększa HA?

Rozłożenie infrastruktury na wiele stref dostępności (AZ) zmniejsza ryzyko, że awaria jednego centrum danych unieruchomi całą aplikację. W praktyce oznacza to uruchamianie instancji aplikacji, baz danych (lub ich replik), load balancerów i komponentów sieciowych w co najmniej dwóch AZ w tym samym regionie.

Kluczowe elementy takiego projektu to m.in.: rozłożenie maszyn w wielu subnetach, multi-AZ dla bazy danych, redundantne bramy (NAT/VPN), a także mechanizmy automatycznego failoveru i testowane scenariusze przełączeń. Bez faktycznego przetestowania awarii jednej strefy projekt jest tylko teoretycznie wysokodostępny.

Jak określić RTO i RPO dla systemu w chmurze i co z nich wynika?

RTO (Recovery Time Objective) to maksymalny czas przywracania usługi po awarii, a RPO (Recovery Point Objective) to maksymalny akceptowalny czas utraty danych. Dla sklepu internetowego RTO może wynosić kilkanaście minut, dla systemu płatności – sekundy. RPO = 0 oznacza brak tolerancji na utratę jakichkolwiek transakcji.

Te parametry przekładają się bezpośrednio na wybór technologii: synchronizacja danych vs. replikacja asynchroniczna, backupy co kilka godzin vs. ciągłe log shipping, single-region vs. multi-region. Co wiemy na pewno? Im niższe RTO/RPO, tym droższa i bardziej skomplikowana staje się architektura oraz procesy operacyjne.

Jak wykryć i wyeliminować pojedyncze punkty awarii (SPOF) w chmurze?

Praktyczny sposób to przejście całego „toru żądania” użytkownika: DNS → load balancer → sieć → aplikacja → baza danych → storage. Dla każdego elementu trzeba odpowiedzieć na kilka prostych pytań: czy istnieje drugi, równorzędny komponent w innej strefie lub regionie? Czy ruch i dane przełączą się na niego automatycznie? Czy takie przełączenie było realnie testowane?

Typowe SPOFy to pojedyncza baza danych bez replikacji, jeden dostawca DNS, własny load balancer na pojedynczej maszynie, jeden NAT gateway czy pojedynczy bucket z krytycznymi plikami w jednym regionie. W wielu firmach krytycznym, ale pomijanym SPOFem jest także sam proces deploymentu – awaria narzędzia lub błędny rollout potrafi wyłączyć cały system równie skutecznie jak pad dysku.

Kluczowe Wnioski

  • Wysoka dostępność w chmurze oznacza projektowanie systemu z założeniem awarii pojedynczych komponentów (serwerów, baz, stref dostępności), tak by użytkownik końcowy odczuł je minimalnie, zamiast próbować zbudować infrastrukturę „niezawodną w 100%”.
  • Kluczowe parametry biznesowe to RTO i RPO: określają, jak długo system może nie działać i ile danych wolno utracić, a z nich wynikają decyzje o replikacji, backupie, synchronizacji między regionami i scenariuszach failoveru.
  • Każda dodatkowa „dziewiątka” dostępności (z 99% do 99,9%, 99,99% itd.) drastycznie podnosi koszty i złożoność operacyjną, więc celem nie jest maksymalna liczba dziewiątek, lecz poziom adekwatny do wartości danego systemu dla biznesu.
  • SLA dostawcy chmury dotyczy pojedynczych usług (np. maszyn wirtualnych, baz danych, load balancerów), a nie całego rozwiązania – zwrot kosztów za niedotrzymane SLA nie usuwa ryzyka przerwy w działaniu krytycznej aplikacji.
  • Architekt ma ograniczony wgląd w fizyczną infrastrukturę chmury, ale kontroluje sposób rozproszenia obciążenia i danych: poprzez projekt sieci w wielu strefach dostępności, użycie load balancerów warstwy 4/7, autoscaling oraz mechanizmy health check i failover.
  • Redundancja pionowa (dokładanie zasobów do jednego serwera) poprawia wydajność, ale utrwala pojedynczy punkt awarii; wysoka dostępność wymaga przede wszystkim redundancji poziomej – wielu instancji, które można skalować i wymieniać bez zatrzymywania usługi.