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

Trzy Pojęcia, Na które Warto Znać Się

Witamy

Systemy rozproszone awaryjnie w schematach. Gdy nauczysz się tych schematów, każdy raport poawaryjny stanie się ćwiczeniem rozpoznawczym zamiast zagadki.

Trzy pojęcia obejmują większość tego, co ważne w analizie awarii produkcyjnych:

Jedno punkty awaryjne (SPOF): komponent, którym awaria powoduje wyłączenie większego systemu. Często ukryte: serwer DNS, na którym wszyscy polegają; certyfikat, przeciwko którym wszystko odnawia się; główny serwer bazy danych.

Kaskadowa awaria: awaria jednego komponentu wyzwala kolejną, która wyzwala kolejną. Powolny serwer bazy danych powoduje timeouty w warstwie API, co powoduje powtarzane próby, co obciąża dalej bazę danych, co powoduje więcej timeoutów. Wybuch się rozprzestrzenia.

Promień eksplozji: ile systemu wyłącza się, gdy jeden element się awaryjnie wyłączy. Wybory architektoniczne wiążą lub nie wiążą promień. SPOF ma nieograniczony promień eksplozji. Usługa z tarczą awaryjną ma ograniczony promień.

Po zakończeniu tej lekcji będziesz mógł:

- Zidentyfikować SPOF w architekturze przy inspekcji

- Rozpoznawać schematy kaskadowych awarii: burza gromowa, ulewne deszcze prób, kolejka śmierci

- Przeczytać rzeczywisty czasogram i oddzielić wyzwalacz od ukrytej wady, która wyzwalacz wywołał

- Pisać bezwzględne punkty działania, które docelują systemami zamiast ludźmi, obejmując zapobieganie / wykrywanie / odzyskiwanie

- Myslić o tarczach awaryjnych & obwodach przerywających jako narzędziach ograniczających promień eksplozji

Spot the Single Point of Failure

Layered Architecture Inspection

Consider a small web architecture:

- DNS: api.example.com -> single nameserver IP 203.0.113.10 hosted by one DNS provider

- CDN: single CDN vendor in front of api.example.com

- Ingress: two reverse proxy machines behind a load balancer

- Backend: six API replicas in two availability zones (three per zone)

- Database: one primary + one read replica, in the same availability zone

- Cache: Redis cluster, three nodes spread across the same two availability zones

Question: which components are SPOFs? Hint: SPOFs are not always the obvious 'single machine' kind. A cluster of three machines all in one availability zone is a SPOF for that zone's failure.

Identify at least three SPOFs in this architecture. For each one, name what fails when it fails, & propose a concrete change that would remove the SPOF (without rewriting the application).

Trzy Klasyczne Schematy Kaskadowe

Awarie Przechodzą Przez Zależności

Schemat 1: Burza heroldów. Zasób udostępniony (cache, blokada, baza danych) ulega awarii lub restartuje. Każdy klient, który na niego zależał, ponawia próbę jednocześnie. Fala zasypania przeciąża coś, co podniesione jest z powrotem; powtarzające się próby nakładają się szybciej niż rekonstrukcja może je wchłonąć; rekonstrukcja nigdy się nie zakończy.

Schemat 2: Burza powtórzeń. Usługa w dół zwalnia. Wyższe usługi, zamiast zawodzić, powtarzają próby. Powtarzające się próby mnożą pierwotny ładunek. Slowing usługi zwalnia dalej, wywołując więcej powtórzeń. Ostatecznie ładunek przekracza nawet zdrową wersję usługi.

Schemat 3: Śmierć kolejki. Kolejka przetwarzająca otrzymuje szybciej niż przetwarza. Kolejka rośnie nieskończenie. Pamięć wyczerpuje się; konsumenci zawodzą; restartują; znajdują większą kolejkę; zawodzą ponownie.

Wspólny wątek: mała perturbacja początkowa wyzwala pętlę zwrotnej wiązania. Odpowiedź systemu wzmacnia awarie zamiast tłumić je.

Mechanizmy Tłumienia

Powtarzające się cofanie z zakłóceniami eksponenialnymi. Klienci, którzy powtarzają próby, czekają dłużej każdorazowo, z losowym przesunięciem. Zapobiega synchronizacji fal powtórzeń.

Przerwa obwodowa. Wywołujący śledzi stopy awarii w dół. Po przekroczeniu progów, wywołujący przestaje wywoływać na okres ostudzenia i natychmiast zawodzi własne żądania zamiast.

Zabezpieczenie przed przeciążeniem. Odosobnienie zasobów na zależność. Pula połączeń A dla bazy danych, oddzielona pula połączeń B dla cache. Powolna baza danych nie może zagłodzić wszystkich połączeń; wywołania cache kontynuują.

Odrzucanie obciążenia. Gdy jest przeciążony, odrzucają żądania na krawędzi zamiast przyjmować i powoli zawodzić. 429 w 1 ms jest lepsze niż 500 w 30 sekund.

Wsteczne naciskanie. Powoli producenci, gdy konsumenci nie mogą utrzymać kroku. Kolejki stają się związane; nadawcy blokują; pierwotne źródło pracy odczuwa tarcie.

Awaria kaskadowa: wyzwalacz -> wzmacnianie -> kolaps, z mechanizmami tłumienia

Diagnoza Kaskady

Wzmacnianie zespołu API osłabia się podczas rutynowego przełączania bazy danych. Schemat czasowy:

- 14:00:00 — operator promuje bazę danych rezerwową. Oczekiwana niedostępność: ok. 10 sekund.

- 14:00:08 — główna niedostępność. Błędy połączenia z baza danych zaczynają się pojawiać w warstwie API.

- 14:00:08 — warstwa API ponawia próby (domyślna konfiguracja: 5 prób, bez cofania, co 100 ms).

- 14:00:11 — rezerwowa baza danych jest promowana i akceptuje nowe połączenia.

- 14:00:11 — warstwa API otwiera tysiące nowych połączeń z bazą danych jednocześnie (każdy egzemplarz repliki × każde żądanie konkurencyjne × każda ponowna próba).

- 14:00:13 — nowa główna baza danych wyczerpuje pulę połączeń; nowe połączenia odrzucone.

- 14:00:13-14:05:00 — repliki warstwy API wyczerpują pulę połączeń, rzucają wyjątki, zawodzą, restartują się, powtarzają.

- 14:05:00 — operator ręcznie zatrzymuje ruch dla warstwy API; baza danych stabilizuje się.

- 14:10:00 — stopniowe przywrócenie ruchu kończy się. Całkowite wyjście z działania: ok. 10 minut (w zamierzeniu 10 sekund).

Zidentyfikuj wzorzec łańcuchowy w grze, nazwij mechanizmy tłumienia, które miałyby zapobiec temu (co najmniej dwa), & wyjaśnij, dlaczego przełączenie z głównego na rezerwowy (zamierzone jako 10-sekundowy przeskok) zamiast tego spowodowało wyjście z działania o długości 10 minut.

SERVFAIL DNS: Dwa Zgubne Wady

Prawdziwe Sprawozdanie z Wypadku

Następujące jest zsanitowaną wersją rzeczywistego incydentu. Nazwy firm zamienione, IP anonimizowane; kształt, czasoskład, a także nauki są prawdziwe.

Podsumowanie

Strona example.com zwracała SERVFAIL z wszystkich publicznych serwerów DNS przez około 3-4 godziny. Pozostałe 46 stref na tym samym serwerze DNS nie zostało dotkniętych. Przyczyna: dwa wzajemnie się nasilające wady.

1. Dostawca A (drugie tłumaczenie DNS) dodał nowy wewnętrzny IP synchronizacji, który nie był w allow-axfr-ips liście dopuszczalnych.

2. Strefa example.com miała kilkuletni konflikt CNAME naruszający RFC (demo.example.com miało zarówno CNAME, jak i MX/TXT rekordy na tym samym etykiecie), co spowodowało odrzucenie strefy przez dostawcę A na żywym AXFR.

Schemat czasowy (UTC)

- ok. 15:00 — Dostawca A dodaje nowy IP synchronizacji wewnętrznej 198.51.100.42 do swojej infrastruktury

- 15:02 — pierwsze AXFR-out denied dla 198.51.100.42 pojawia się w logach głównego DNS (brak ostrzeżeń tego sygnału)

- ~18:00 — osiągnięty okienek wygaśnięcia SOA; Wendor A usuwa strefę example.com z cache

- ~18:30 — wykrywane zewnętrznie SERVFAIL

- ~19:45 — zidentyfikowana przyczyna

- 20:00 — 198.51.100.42 dodany do allow-axfr-ips; główny zrestartowany

- 20:05 — wysłane NOTIFY; AXFR inicjowany; strefa Wciąż SERVFAIL (konflikt CNAME)

- 20:07 — check-zone odkrywa 1 błąd: konflikt CNAME na demo.example.com

- 20:09 — CNAME zastąpiony rekordem A; sprawdzanie strefy czyste (0 błędów)

- 20:10 — wysłane NOTIFY; AXFR zakończony; Vendor A zaczyna obsługiwać strefę

- 20:11 — dig @8.8.8.8 example.com A zwraca poprawny adres IP — ROZWIĄZANE

Dlaczego tylko example.com?

Wszystkie 47 stref dzieli tę sama DNS primary. Blok IP AXFR wpłynął na wszystkie strefy. Ale tylko example.com miał konflikt CNAME i tylko example.com potrzebował świeżego AXFR w chwili, gdy został nałożony zakaz. Inne strefy już odświeżyły się przed zakazem lub jeszcze nie musiały.

Skryty wada

Konflikt CNAME na demo.example.com istniał przez lata. Działało to, ponieważ główny serwował strefę z swojej bazy danych (leniwy wobec naruszeń RFC) i Vendor A służył dane z zapisu w pamięci przed wprowadzenie naruszenia. Gdy Vendor A usunął swoją pamięć cache i potrzebował świeżych danych, naruszenie wysunęło się na powierzchnię.

Spowodowanie

Vendor A w ciszy dodał nowy adres synchronizacji. Primary nie zawierał go w swoim zezwoleniu. AXFR odmówiono. Trzy godziny później (okienek wygaśnięcia SOA) Vendor A usunął strefę. Skryta wada wysunęła się na powierzchnię, gdy system próbował odzyskać.

Zapisz Bezkarnych Zadań Działaniowych

Bezkarny: Celuj w Systemy, a Nie w Ludzi

Bezkarny element działający nazwać musi coś, co system powinien zrobić inaczej, a nie coś, co osoba powinna zrobić inaczej. 'Szkolenie operatora' jest winne. 'Dodaj automatyczne sprawdzenie, które to zatrzyma przed wdrożeniem' jest bezkarny.

Dobrze napisane bezkarne elementy działające gromadzą się w trzech wymiarach:

- Profilaktyka: spraw, aby złe rzeczy były trudniejsze lub niemożliwe

- Wykrywanie: zauważyć je wcześniej, jeśli się zdarzy

- Odzyskiwanie: ograniczyć szkody, gdy się zdarza

Każdy element powinien nazwać (1) konkretne zmiany systemowe, (2) zespół właścicielski i (3) wymiar, który służy.

Napisz trzy bezkarne zadania działające, które adresują powyższą analizę DNS-SERVFAIL. Rozdziel je między profilaktykę / wykrywanie / odzyskiwanie (po jednym na każdym wymiarze). Każde element musi nazwać konkretne zmiany systemowe i zespół właścicielski. NIE doceluj żadnej osoby jako przyczynę.

Kompartmenty, które toną bez statku

Zaciągane z inżynierii okrętowej

Okręty mają ściany wodoszczelne: pionowe ściany, które dzielą kadłub na kompartmenty. Jeden kompartment może zatopić się bez zatopienia statku; kolejny może nie działać bez wpływu na resztę.

Systemy rozproszone korzystają z tego samego słowa & tej samej idei.

Szyby wodoszczelne wzorca: izoluj zasoby na zależność. Usługa, która dzwoni do trzech różnych API zależności używa trzech oddzielnych pul połączeń, trzech oddzielnych pul wątków, trzech oddzielnych budżetów powtarzania. Jedna zależność downstream, która jest wolna lub się awanturuje, nie może używać zasobów przypisanych dla innych dwóch.

Bez szyb wodoszczelnych: jedna wolna zależność wyczerpuje wspólną pulę wątków; wywołania do innych zależności czekają na wątki; cała usługa staje się niedostępna.

Z szybami wodoszczelnymi: jedna wolna zależność wyczerpuje swoją własną pulę; wywołania do niej szybko się nie udają; wywołania do innych zależności kontynuują się normalnie; promieniowanie eksplozji jest związane z zależnością, która się awanturuje.

Zawory obwodowe

Wzorzec zaworu obwodowego: zabezpieczenie stanu, które otacza zależność downstream i śledzi szybkość awarii. Trzy stany:

- Zamknięty (normalny): wywołania przechodzą. Błędy są policzane.

- Otwarty (zawiony): gdy przekroczona jest próg awarii (np. 50% błędów w ciągu ostatnich 30 sekund), zawór się otwiera. Wywołania natychmiast się nie udają, nie próbując zależności. Zabezpiecza to wywołującego przed marnotrawieniem pracy; zabezpiecza to zależność przed otrzymywaniem obciążenia podczas jej niestrawności.

- Półotwarty (testujący): po okresie ostygania, zawór pozwala na mały procent wywołań. Jeśli się udają, zamyka z powrotem do normalnego stanu. Jeśli nie, znowu się otwiera na kolejne ostyganie.

Kluczowe odkrycie: zawór obwodowy zapobiega marnotrawieniu wysiłków podczas znanych okresów niestrawności & daje zależnościom szansę na odzyskanie bez ciągłego obciążenia.

Szyby wodoszczelne ograniczają promieniowanie eksplozji. Zawory obwodowe zapobiegają utrzymaniu się eksplozji.

Ogranicz promieniowanie eksplozji

Twój serwis API komunikuje się z czterema usługami docelowymi: Usługa Użytkownika, Usługa Rekomendacji, Usługa Powiadomień oraz API płatności trzeciej strony. Zespół słyszał, że "Usługa Rekomendacji bywa trochę niestała" i chce się upewnić, że gdy zawodzi, reszta systemu działa zdrowo.

Obecnie serwis korzysta z jednej wspólnej puli 200 wątków oraz jednej wspólnej puli połączeń HTTP. Wszystkie cztery usługi docelowe rywalizują o te zasoby. Brak obwodów przeciwprężnych.

Zaprojektuj bulkhead + zawór obwodowy dla tej usługi API. Bądź szczegółowy: jak podzielisz pulę wątków / połączeń między czterema zależnościami, jakie progów zaworu obwodowego są odpowiednie dla niestabilnej usługi Suggestion, a co powinien robić API front-end, gdy usługa Suggestion jest otwarta?

Zaprojektuj recenzję trybu awaryjnego

Synteza

Nauczyłeś się wykrywać SPOFs przez inspekcję, rozpoznawać wzorce łańcuchowych błędów, oddzielać wyzwalacz od ukrytego błędu podczas czytania postmortem, pisać bezwzględne działania w zakresie profilaktyki, wykrywania i naprawy, oraz ograniczać zasięg eksplozji dzięki odcinkom, obwodom przeciwprężnym i stopniowej degradacji.

Zastosuj wszystkie pięć.

Twój zespół wkracza z nową usługą search.example.com, która zależy od trzech usług docelowych: głównego indeksu wyszukiwania (index.example.com), usługi analizy (analytics.example.com) oraz usługi rekomendacji (recs.example.com). Zespół chce, żebyś przeprowadził 'recenzję trybu awaryjnego' przed uruchomieniem.

Oto recenzję trybu awaryjnego, którą prowadzisz. Włącz: jak zidentyfikowałbyś SPOFs (jedna technika), jak zapobiegłbyś łańcuchowym błędom między usługą wyszukiwania a jej trzema usługami docelowymi (dwa wzorce), jedno konkretne działanie dla usługi rekomendacji (o której zespół uznał, że jest najmniej niezawodna) oraz jakie monitorowanie będzie wymagane przy starcie.

Gdzie ta kurs idzie dalej

Gdzie ta kurs idzie dalej

Teraz możesz zauważyć SPOF, zrozumieć łańcuchowy błąd, czytać postmortem produktywnie, pisać bezwzględne działania i ograniczać zasięg eksplozji dzięki zaprojektowanym rozwiązaniom.

Ostatnia lekcja w tym kursie (cs_distsys_observability_and_capacity) nauczania, jakie warto pomiarów, aby dowiedzieć się, że problem występuje przed użytkownikami. Sprawdzanie stanu systemu, wersje punktów końcowych, cztery złote sygnały na poziomie proxy oraz jak decyzje o zdolnościach awaryjnych są związane z danymi obserwacyjnymi.

Lekcja towarzysząca: geometry_of_failure_modes_and_blast_radius wyjaśnia międzywęź centrality (który węzeł grafu jest butelką) i min-cut (górna granica promieniowania wybuchowego).

Brawo. Naprzód.