Przejdź do głównej zawartości

Odzyskiwanie po awarii wspomagane przez AI

Twój główny region właśnie zgasł w trakcie wdrożenia. Kanał on-call płonie, status page nadal świeci na zielono, bo nikt go nie zaktualizował, a kierownictwo chce ETA, którego nie masz. Twój runbook to strona w Confluence ostatnio edytowana czternaście miesięcy temu, która odwołuje się do hosta Postgresa wycofanego z użycia na wiosnę.

Odzyskiwanie po awarii to ten jeden obszar, gdzie „dokumentację napiszemy później” po cichu zamienia się w „straciliśmy sześć godzin i sporą porcję danych klientów”. Dobra wiadomość: powolne, żmudne części DR — pisanie precyzyjnych runbooków PITR, tworzenie eksperymentów chaosu, które faktycznie weryfikują Twoje RPO, i przekuwanie chaotycznej osi czasu incydentu w bezwinny post-mortem — to dokładnie to, w czym narzędzia AI do kodowania są dobre, o ile zakotwiczysz je w prawdziwych narzędziach i utrzymasz człowieka przy bramce zatwierdzania.

  • Gotowy prompt do wklejenia, który zamienia Twój stos technologiczny w runbook odzyskiwania do punktu w czasie (PITR) dla Postgresa z jawnymi celami RTO/RPO i weryfikacją łańcucha WAL
  • Schedule w Chaos Mesh, który co tydzień ubija pod główny bazy danych i weryfikuje failover w ramach 5-minutowego RPO — wygenerowany, a nie wklepywany z pamięci
  • Trójnarzędziowy przepływ pracy (Cursor / Claude Code / Codex) do trzymania artefaktów DR w kontroli wersji i ich ponownej walidacji w CI
  • Prompt, który tworzy bezwinny post-mortem na podstawie Twoich rzeczywistych logów i osi czasu
  • Krótką listę trybów awarii, które po cichu rozwalają plany DR, oraz sposób na ich wyłapanie zanim zrobi to katastrofa

Każdy artefakt DR poniżej zależy od dwóch liczb dla każdego poziomu usług: RTO (jak długo do przywrócenia usługi) i RPO (ile danych możesz sobie pozwolić stracić). Zapisz je jawnie, zanim cokolwiek wygenerujesz — runbook celujący w „szybkie odzyskiwanie” jest bezużyteczny; ten celujący w „RTO 15 min, RPO 5 min dla płatności” jest testowalny.

Realistyczna macierz startowa wygląda tak:

PoziomPrzykładowe usługiRTORPOPodejście do kopii zapasowych
Krytycznyuwierzytelnianie, płatności15 min0–5 minReplika synchroniczna/strumieniowa + archiwizacja WAL
Wysokigłówne API1 godzina5 minArchiwizacja WAL + częste kopie bazowe
Średnifunkcje drugorzędne4 godziny1 godzinaMigawki co godzinę
Niskinarzędzia wewnętrzne24 godziny24 godzinyKopie zapasowe dzienne

Najcenniejszym artefaktem DR dla większości zespołów jest runbook odzyskiwania do punktu w czasie dla Postgresa, który inżynier on-call może wykonać o 3 nad ranem bez zastanawiania się. Wzorzec, który faktycznie działa na produkcji, to archiwizacja WAL plus zewnętrzne narzędzie do kopii bazowychpgBackRest lub WAL-G — a nie funkcja plpgsql po stronie serwera. Odzyskiwanie PITR ustawia restore_command i recovery_target_time oraz polega na nieprzerwanym łańcuchu WAL między kopią bazową a docelowym momentem.

Niech Twoje narzędzie AI napisze runbook na podstawie Twojej faktycznej konfiguracji, a nie generycznego szablonu:

Czytaj to, co wygeneruje, krytycznie. Dwie rzeczy, które AI najczęściej tu psuje, to wymyślanie flag pgBackRest i prześlizgiwanie się nad sprawdzeniem luki w łańcuchu WAL — czyli dokładnie ta awaria, która zostawia Cię na lodzie w trakcie odzyskiwania. Jeśli jakaś komenda wygląda nieznajomo, sprawdź ją w pgbackrest --help, zanim trafi do runbooka.

Sam runbook jest identyczny niezależnie od narzędzia — to plik Markdown w Twoim repozytorium. Różni się to, jak sterujesz generowaniem i jak utrzymujesz go w zgodzie z rzeczywistością w czasie.

Otwórz runbook w edytorze i użyj trybu agenta, aby Cursor mógł odczytać Twój faktyczny pgbackrest.conf, docker-compose.yml i pliki migracji jako źródło prawdy, zamiast zgadywać nazwy hostów i nazwy stanz. Iteruj w miejscu: gdy któryś krok wygląda źle, zaznacz go i poproś Cursor o poprawienie tylko tego kroku. Użyj checkpointu, zanim pozwolisz mu ruszyć wiele plików, żeby jednym kliknięciem cofnąć złe przepisanie.

To najszybsza pętla, gdy konfiguracja DR żyje w tym samym repozytorium, które edytujesz, i chcesz widzieć różnice na bieżąco.

Baza danych to rzadko cała historia. W przypadku obciążeń hostowanych na Kubernetes, Velero tworzy kopie zapasowe zasobów klastra i wolumenów trwałych i jest standardowym narzędziem, do którego skonfigurowania warto poprosić asystenta AI — a nie wymyślonym wewnętrznym serwisem kopii zapasowych.

W przypadku magazynu obiektów i zarządzanych baz danych preferuj natywną replikację między regionami dostawcy oraz funkcje point-in-time (na przykład automatyczne kopie zapasowe RDS z PITR czy replikację międzyregionalną S3 / S3 Cross-Region Replication) zamiast budowania własnych rozwiązań. Poproś narzędzie AI o wygenerowanie Terraform dla nich, a następnie przejrzyj ten IaC tak samo, jak przejrzałeś runbook.

Testowanie: ćwiczenia chaosu, które weryfikują Twoje RPO

Dział zatytułowany „Testowanie: ćwiczenia chaosu, które weryfikują Twoje RPO”

Nieprzetestowany plan DR to hipoteza. Najtańszym sposobem na ciągłe testowanie failover jest zaplanowany eksperyment Chaos Mesh, który ubija pod główny bazy danych i sprawdza, czy system odzyskuje się w ramach zadeklarowanych celów. CRD Schedule (apiVersion: chaos-mesh.org/v1alpha1) uruchamia PodChaos typu pod-kill według crona.

Wygenerowany manifest to łatwiejsza połowa. Runbook, który definiuje zaliczenie/niezaliczenie względem Twojego RTO/RPO, to ta połowa, która nadaje ćwiczeniu sens — bez niego po prostu ubijasz pody i masz nadzieję. Potraktuj przekroczone RTO w sobotnim ćwiczeniu jako zgłoszenie P2, a nie ciekawostkę.

  1. Uruchom ćwiczenie w klastrze stagingowym, który odzwierciedla topologię produkcyjną, nigdy na żywym ruchu klientów.

  2. Przechwytuj oś czasu automatycznie: moment ubicia, moment promocji, pierwszy udany zapis do nowego węzła głównego.

  3. Porównaj zmierzone RTO/RPO z celami i załóż zgłoszenie dla każdego przekroczenia.

  4. Wprowadź logi z ćwiczenia prosto do promptu post-mortem poniżej, aby luki zamieniły się w elementy do działania, zamiast zostać zapomniane do poniedziałku.

Gdy dzieje się naprawdę: playbook z bramką dla człowieka

Dział zatytułowany „Gdy dzieje się naprawdę: playbook z bramką dla człowieka”

Gdy faktycznie jesteś w trakcie incydentu, AI najlepiej wykorzystać do wygenerowania i zwalidowania kolejnego działania — nigdy do odpalania nieodwracalnych komend wprost z dowolnego tekstu. Trzymaj człowieka przy bramce zatwierdzania dla wszystkiego, co promuje replikę, przekierowuje DNS lub wyłącza zapisy.

W scenariuszu ransomware obowiązuje ta sama dyscyplina: użyj narzędzia, by znaleźć ostatnią czystą kopię zapasową sprzed zaszyfrowania i naszkicować reguły izolacji sieciowej, a następnie niech człowiek je wykona. Przydatne, konkretne wywołanie Claude Code:

Okno terminala
claude -p "Given the pgBackRest backup catalog in this repo's logs/ \
directory and the file-modification timeline in incident/timeline.csv, \
identify the most recent backup whose stop time precedes the first \
encryption event, and explain how you ruled out later backups." \
--allowedTools "Read,Grep"

Zwróć uwagę na formę headless claude -p oraz listę dozwolonych narzędzi tylko do odczytu: to analizuje i rekomenduje, nie odtwarza.

Nawet dobrze wygenerowany plan DR zawodzi w przewidywalny sposób. Uważaj na te przypadki:

  • Luki w łańcuchu WAL. Reguły cyklu życia bucketów lub po cichu zawodzące archive_command wygaszają segmenty między kopią bazową a docelowym momentem. Odzyskiwanie przerywa się w połowie. Naprawa: runbook musi weryfikować ciągłość, a nie ją zakładać.
  • Opóźnienie replikacji przekracza RPO w najgorszym momencie. Pod szczytem zapisów, który często poprzedza awarię, Twój standby zostaje w tyle o minuty. Promowanie go traci więcej danych, niż pozwala Twoje RPO. Naprawa: alertuj o opóźnieniu względem liczby RPO i niech krok failover sprawdza opóźnienie przed promocją.
  • Failover, który gubi zapisy. Promujesz standby, ale stary węzeł główny nadal przyjmuje zapisy (split-brain) albo zapisy w locie nigdy się nie zreplikowały. Naprawa: pierwszym krokiem playbooka jest zawsze wyłączenie zapisów na uszkodzonym węźle głównym, przed promocją.
  • Ćwiczenie przechodzi, prawdziwa rzecz zawodzi. Staging ma 3 węzły; produkcja ma 30 i inną topologię. Naprawa: uruchamiaj ćwiczenia względem klastra, który odzwierciedla skalę produkcji, i rotuj wstrzykiwaną awarię.
  • AI wymyśla flagi lub pola. Wygenerowana flaga pgBackRest lub pole Chaos Mesh, które nie istnieje, czyni artefakt niewykonywalnym. Naprawa: zawsze waliduj wygenerowane komendy względem --help lub dokumentacji CRD przed commitem — traktuj wynik AI jako szkic, nigdy jako wyrocznię.

Incydent nie jest zakończony, dopóki nie uchwycisz nauki. AI jest naprawdę dobre w przekuwaniu chaotycznej osi czasu i ściany logów w ustrukturyzowany, bezwinny post-mortem — pod warunkiem, że nakarmisz je prawdziwymi artefaktami.

Uruchom to z Claude Fable 5 (/model fable), gdy łańcuch przyczynowy plącze się między usługami — jakość rozumowania jest warta kosztu na tym jednym dokumencie, który przeczytają wszyscy; jeśli budżet jest ograniczony, sięgnij po Opus 4.8. Trzymaj wynik w repozytorium obok runbooka, który ma usprawnić, aby następne ćwiczenie testowało względem wniosków z poprzedniego incydentu.