English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

gość
1 / ?
powrót do lekcji

Witaj

Witaj

Flota na skalę webową zawiera wiele maszyn. W dowolnym momencie niektóre są zdrowe, niektóre się uruchamiają, niektóre są w trakcie wygaszania, a niektóre są cicho uszkodzone. Flota przetrwała to, ponieważ każda maszyna na żądanie odpowiada na dwa proste pytania:

- /health — czy jestem obecnie w stanie obsługiwać rzeczywiste żądania?

- /version — jaki kod uruchamiam?

Oraz punkt końcowy metryk (zwykle /metrics), który udostępnia liczniki i wskaźniki do pobierania przez narzędzia monitorujące.

Ta lekcja uczy, jak projektować te punkty końcowe, aby faktycznie odzwierciedlały rzeczywistość, co oznaczają cztery złote sygnały na poziomie proxy oraz jak obserwowane dane wpływają na decyzje dotyczące pojemności.

Po zakończeniu lekcji będziesz w stanie:

- Zaprojektować punkt końcowy /health, który wykrywa rzeczywiste awarie ścieżki, a nie tylko żywotność procesu

- Zaprojektować punkt końcowy /version, który pozwala zweryfikować, czy wdrożenie zostało wykonane

- Zastosować cztery złote sygnały (opóźnienie, ruch, błędy, nasycenie) na poziomie proxy

- Powiązać obserwowane metryki nagłego wzrostu z decyzjami dotyczącymi pojemności: kiedy skalować w górę, kiedy opróżniać węzły, kiedy eskalować alert

- Rozumieć SLO oraz tempo zużycia budżetu błędów jako dyscyplinę operacyjną stojącą za pytaniem „jak bardzo nam to przeszkadza?”

Dwa rodzaje sprawdzania stanu zdrowia

Liveness vs Readiness

Liveness: czy proces w ogóle działa? Wykorzystywane przez orkiestratory (Kubernetes, systemd) do decydowania, czy należy ponownie uruchomić proces.

Readiness: czy proces jest gotowy do obsługi rzeczywistego ruchu w tej chwili? Wykorzystywane przez równoważniki obciążenia do decydowania, czy należy wysyłać żądania.

To są różne pytania. Proces, który działa, ale nie może połączyć się z bazą danych, jest aktywny, ale niegotowy. Proces, który się uruchamia, jest aktywny, ale jeszcze niegotowy.

Shallow vs Deep Health Checks

Shallow: zwraca {"status": "ok"}, jeśli obsługa HTTP działa. Trywialne. Wykrywa tylko zatrzymanie procesu.

Deep: faktycznie testuje rzeczywistą ścieżkę żądania. Sprawdza, czy pula połączeń z bazą danych może zwrócić połączenie, czy cache jest osiągalny, czy zależności w dół łańcucha odpowiadają. Wykrywa awarie funkcjonalne, których nie wykryją sprawdzenia typu shallow.

Kompromis: głębokie sprawdziany są droższe (każdy z nich jest w zasadzie syntetycznym żądaniem) & mogą powodować kaskadowe awarie (jeśli sprawdzian zdrowia każdej repliki obciąża bazę danych, wolna baza danych oznacza, że wszystkie repliki stają się niezdrowe, co usuwa je z rotacji, co z kolei usuwa całą przepustowość).

Najlepsza praktyka: płytki sprawdzian dla liveness (szybki, tani, bez zależności zewnętrznych) & głębszy sprawdzian dla readiness (wyniki w pamięci podręcznej, ograniczany przepustowością, aby nie obciążać usług dół łańcucha).

Endpoints wersji

/version zwraca commit git, czas budowania & nazwę usługi. Po wdrożeniu wykonujesz curl https://service.example.com/version & potwierdzasz, że zwrócony commit odpowiada temu, który wysłałeś. Jeśli nie, wdrożenie nieudolnie się nie powiodło.

Bez /version stare wdrożenie może wyglądać na udane & ukrywać się przez godziny.

Minimalny kształt odpowiedzi: {"service": "my-api", "git_commit": "abc1234", "build_time": "2026-05-19T10:00:00Z"}.

Load balancer zespołu jest skonfigurowany tak, aby usuwać replikę z rotacji po 3 kolejnych nieudanych sprawdzianach zdrowia. Ich obecny `/health` natychmiast zwraca `{"status": "ok"}`. Zespół jest zaskoczony, gdy podczas incydentu każda replika nadal pokazywała się jako zdrowa, mimo że żadna replika nie mogła połączyć się z bazą danych. Zaprojektuj lepszy sprawdzian readiness, który wykryłby awarię bazy danych, & wyjaśnij jedno konkretne ryzyko, które wprowadza Twój nowy projekt.

Opóźnienia, Ruch, Błędy, Nasycenie

Cztery liczby pokrywają większość operacji

Z książki Google SRE. Cztery sygnały, które mierzysz na każdym poziomie usługi. Jeśli dobrze zinstrumentujesz te cztery, wykryjesz większość problemów produkcyjnych, zanim zrobią to użytkownicy.

Opóźnienie (Latency): jak długo trwa obsługa żądania? Raportuj rozkłady, a nie tylko średnie. p99 (99. percentyl opóźnienia) ma większe znaczenie niż średnia, ponieważ to opóźnienia w ogonie (tail latency) są postrzegane przez użytkowników jako „wolność”. Usługa ze średnim opóźnieniem 50 ms i p99 wynoszącym 5 000 ms ma realny problem, którego większość użytkowników nigdy nie zauważy, ale 1% najbardziej dotkniętych osób odczuje go zdecydowanie.

Ruch (Traffic): ile żądań na sekundę? Łączna liczba żądań, per endpoint, per kod statusu, per region. Baza jest znana; alarmuj przy anomalii (nagły spadek = problem z wejściem; nagły wzrost = nagły ruch lub atak).

Błędy (Errors): wskaźnik nieudanych żądań. Rozróżniaj błędy 4xx (błędy klienta, nie Twoja wina) od błędów 5xx (błędy serwera, Twoja wina). Śledź wskaźnik błędów jako procent ruchu, a nie jako wartości bezwzględne, aby alarmy działały niezależnie od poziomu obciążenia.

Nasycenie (Saturation): jak bardzo obciążony jest system? Wykorzystanie CPU, pamięć, głębokość puli połączeń, długość kolejki. To wskaźnik wyprzedzający. Nasycenie rośnie, zanim opóźnienia lub błędy się pogorszą. Warstwa (tier) przy 90% nasycenia jest o jedną złą minutę od załamania kolejki.

W przypadku warstwy proxy

Każdy sygnał manifestuje się na warstwie brzegowej (edge layer):

- Opóźnienie na proxy: czas ręcznego uścisku TLS, czas połączenia z górnym węzłem (upstream), łączny czas żądania-odpowiedzi. Mierzone osobno, ponieważ dotyczą różnych części ścieżki.

- Ruch na proxy: łączna liczba żądań/sek, rozkład per backend (gorący backend wskazuje na nierównomierność w równoważeniu obciążenia), rozkład per kod statusu.

- Błędy na proxy: 4xx od klientów (Twoi użytkownicy trafiający na błędne końcówki), 5xx od backendów (Twoje usługi zawieszają się), błędy wewnętrzne proxy (502 = backend niedostępny, 504 = przekroczony limit czasu backendu).

- Nasycenie na proxy: liczba sesji TLS, głębokość puli połączeń do góry (upstream), CPU samego proxy (kończenie TLS jest obciążające dla CPU).

Wskazówka: nagły wzrost 502 przy niskiej opóźnieniu backendu oznacza, że backend rozłącza się przed wysłaniem odpowiedzi (reset połączenia, awaria, OOM). Wzrost 504 oznacza, że backend jest wolny, ale nadal odpowiada. Czytaj kod błędu; mówi on, gdzie znajduje się źródło awarii.

Cztery złote sygnały na jednej tablicy: opóźnienia, ruch, błędy, nasycenie

Czytanie sygnałów

Twoja tablica pokazuje następujące dane z ostatnich 10 minut:

- Ruch: w przybliżeniu stabilny na poziomie 800 żądań/s (brak nagłego skoku)

- Opóźnienia: p50 stabilne na poziomie 40 ms, p99 wzrosło z 200 ms do 2 500 ms w ciągu 5 minut i nadal rośnie

- Błędy: wskaźnik 4xx stabilny na poziomie 0,3% (normalne tło); wskaźnik 5xx wzrósł z 0,1% do 1,2% (głównie 504 Gateway Timeout)

- Nasycenie: CPU backendu wzrósł z 45% do 78% w ciągu tych samych 5 minut; CPU proxy stabilny na poziomie 30%

Zdiagnozuj, co się dzieje. Jaki jest najbardziej prawdopodobny tryb awarii, jakie jedno lub dwa dodatkowe pomiary potwierdziłyby lub obaliły Twoją hipotezę oraz jakie działanie podjąłbyś w ciągu kolejnych 5 minut, jeśli trend się utrzyma?

Kiedy skalować, kiedy opróżniać, kiedy eskalować alert

Decyzje dotyczące pojemności wymagają wyzwalaczy

Obserwacja metryk jest łatwa. Dyscypliną jest wiedza, kiedy należy podjąć na ich podstawie działania.

Skaluj w górę, gdy: nasycenie przekroczy utrzymujący się próg (np. CPU backendu >70% przez 5 minut), lub głębokość kolejki wzrośnie powyżej wartości docelowej, lub opóźnienie p99 przekroczy SLO. Wyzwalacz powinien zadziałać, zanim coś się zepsuje, a nie w momencie awarii.

Opróżnij replikę, gdy: jest ona konsekwentnie wolna / błędna, podczas gdy inne repliki są zdrowe (jedna rozgrzana replika często wskazuje na problem na poziomie hosta, a nie aplikacji), lub podczas wdrażania nowej wersji, lub podczas eleganckiego wycofywania repliki.

Eskaluj alert do człowieka, gdy: SLO jest przekraczane szybciej, niż budżet błędów może to wytrzymać, lub wyzwalacz nasycenia zadziała, a autoskalowanie nie zdołało go pochłonąć, lub pojawi się wzorzec kaskadowy (wzrost zarówno wskaźnika błędów, jak i wskaźnika ponowień).

Nie eskaluj alertu, gdy: pojedyncza zła minuta rozwiązuje się sama, lub zadania wsadowe w tle powodują oczekiwane okresowe wahania, lub szum przekracza próg (próg jest nieprawidłowy, a nie system).

SLO i tempo zużycia budżetu błędów

SLO (service level objective, czyli cel poziomu usługi) definiuje akceptowalną wydajność: „wskaźnik sukcesu >= 99,9% w oknie 28-dniowym”. Uzupełnieniem (0,1%) jest budżet błędów.

Tempo zużycia (burn rate): jak szybko zużywasz budżet błędów. Jeśli zużyjesz 10% budżetu w 1 godzinę, tempo jest 240 razy szybsze niż zrównoważone (1 godzina to 1/672 z 28-dniowego okna; zużycie 10% w tym oknie = 10% × 672 = 6720% prognozowane dla całego okna, przy dozwolonych tylko 100%).

Alerty oparte na tempie zużycia w wielu oknach czasowych: alarmuj, gdy zarówno krótkie okno (5 minut przy tempie 14,4x), jak i długie okno (1 godzina przy tempie 6x) zużywają budżet szybciej niż tempo zrównoważone. Wykrywa zarówno nagłe awarie, jak i powolne pogarszanie się wydajności.

Dlaczego to ma znaczenie dla pojemności: usługa działająca przy SLO 99,9% z 1% zapasu może pochłonąć drobne wahania. Usługa na poziomie 99,93% (ledwo spełniająca SLO) jest o jeden zły dzień od naruszenia limitu. Decyzje dotyczące pojemności powinny dążyć do komfortowego marginesu SLO, a nie do minimum, które go spełnia.

Decyzja dotycząca pojemności pod obserwacją

Twoja usługa ma SLO wynoszące 99,9% udanych żądań w ciągu 28 dni. Obecny stan z monitoringu z ostatniej godziny:

- Wskaźnik sukcesu: 99,5% (utrzymywany przez 30 minut)

- CPU backendu: średnio 82% w całej flocie (cel: 70%)

- Opóźnienie p99: 800 ms (cel SLO: <500 ms)

- Ruch: 1400 żądań/s, wzrost z poziomu bazowego 1000 żądań/s (40% powyżej normy; trend nadal rośnie)

- Autoskalowanie: skonfigurowane tak, aby dodawać repliki, gdy CPU przekracza 80% przez 5 minut; obecnie trwa proces skalowania w górę, który doda 3 repliki w ciągu ~90 sekund

Podjęcie trzech decyzji: (1) czy to incydent wymagający natychmiastowego wezwania człowieka (paging), (2) czy należy podjąć jakiekolwiek natychmiastowe działania poza odczekaniem na zakończenie autoskalowania oraz (3) jak Twoja decyzja wyglądałaby inaczej, gdyby trend ruchu był płaski zamiast rosnącego? Uzasadnij każdą z nich.

Zaprojektuj plan obserwowalności wdrożenia

Synteza

Teraz możesz zaprojektować /health, które wykrywa rzeczywiste awarie, /version, które pozwala weryfikować wdrożenia, dashboardy czterech sygnałów złotych na poziomie proxy oraz progi pojemności powiązane z tempem zużycia SLO.

Zastosuj wszystkie cztery.

Twoja drużyna wdraża search.example.com (usługę wyszukiwania z lekcji o trybach awarii). Drużyna chce wdrożyć obserwowalność, która wykrywa problemy, zanim zrobią to użytkownicy, wraz z jasną macierzą decyzji o eskalacji lub jej braku. SLO: 99,9% udanych żądań, p99 opóźnienia < 300 ms, w oknie 28-dniowym.

Zaprojektuj plan obserwowalności wdrożenia. Obejmij: (1) co zwracają `/health` i `/version` dla każdego replikatu backendu oraz dla każdego proxy, (2) które dashboardy czterech złotych sygnałów byłyby wymagane na poziomie proxy oraz na poziomie backendu, (3) przy jakich progach autoskalowanie wywołuje skalowanie w górę oraz (4) przy jakich progach otrzymuje alert (page) człowiek (użyj tempa zużycia SLO, gdzie to stosowne).

Zakończenie kursu

Zakończenie kursu

Ukończyłeś/aś wszystkie pięć lekcji:

- Proksy i źródła: kształt warstwy brzegowej, którego używa niemal każdy publiczny serwis webowy

- Be Stanowe Skalowanie Poziome: dlaczego warstwa bezstanowa mnoży się tanio i jak ją rozmiarować

- Rozdzielenie Ruchu Przyjmującego i Wysyłającego: dlaczego jeden serwer staje się dwoma oraz tryb awarii, który to wymusza

- Tryby Awarii i Zakres Wpływu: punkty pojedynczej awarii (SPOF), kaskady, postmortemy, beznagannego działania pozycje

- Obserwowalność i Pojemność (ten temat): co mierzyć, aby problemy ujawniły się, zanim zrobią to użytkownicy

Główna oś: system rozproszony w skali webowej nie jest magią. To mały zestaw wzorców (proksy odwrotny, repliki bezstanowe, rozdzielenie ruchu przyjmującego/wysyłającego, grodzie i wyłączniki obwodu, cztery sygnały złote) skomponowanych z rozwagą. Gdy rozpoznasz te wzorce, zobaczysz je w każdej architekturze produkcyjnej.

Lekcje towarzyszące: pięć lekcji o geometrii-* przekształca ten sam materiał w teorię grafów i geometrię. Pasują one dobrze w dowolnej kolejności.

Bardzo dobrze.