Konrad Kowalski (rootsher)Principal Platform & Reliability Architect101101100010011000001110101000101001101111100000

PITR całego serwera: restore to dopiero początek

data
kategoria
Reliability Engineering
także w
Databases · CI/CD
czytanie
2 min / 374 słów

PITR całego serwera brzmi jak operacja na bazie danych.

W praktyce jest operacją na systemie.

Baza jest tylko środkiem.

Celem jest bezpieczny powrót aplikacji do stanu, który ma sens dla użytkowników.

Kiedy to ma sens

PITR całego serwera wybieramy wtedy, gdy problem dotyczy wspólnego stanu.

Przykłady:

text
błędny job masowo zmienił rekordy
migracja uszkodziła dane
operator skasował ważne tabele
aplikacja przez godzinę zapisywała błędne wartości
atakujący zmienił dane i trzeba wrócić przed zmianę

Jeżeli problem jest tylko w kodzie, rollback wydania może wystarczyć.

Jeżeli problem dotyczy jednej tabeli albo jednej bazy, pełny PITR serwera może być zbyt dużym młotkiem.

Ale jeśli cały stan produkcji jest podejrzany, trzeba przestać łatać rekordy na żywo.

Wtedy pytanie brzmi:

text
do którego momentu wracamy?

Najpierw zatrzymać pogłębianie szkody

Zanim zaczniemy odtwarzać, trzeba ograniczyć zapisy.

To może oznaczać:

text
włączenie maintenance mode
zablokowanie ścieżek zapisu
zatrzymanie workerów
zatrzymanie cronów
odcięcie integracji
zrobienie snapshotu aktualnego stanu

Snapshot popsutego stanu brzmi dziwnie, ale bywa potrzebny.

Może zawierać dane, których nie chcemy stracić.

Może być dowodem do analizy.

Może pozwolić później przenieść wybrane rekordy do odtworzonego środowiska.

Najgorszy wariant to odtwarzać bazę, kiedy stara produkcja dalej przyjmuje zapisy i nikt nie wie, które z nich później będą potrzebne.

Odtworzyć obok, nie na ślepo

Bezpieczny model jest prosty:

text
stara produkcja zostaje zamrożona
nowy serwer odtwarzamy obok
walidujemy nowy stan
dopiero potem przełączamy ruch

Odtwarzanie w miejscu może być kuszące, bo wydaje się prostsze.

Ale odbiera możliwość porównania.

Jeżeli restore pójdzie źle, nie mamy ani starego stanu, ani nowego.

Odtworzenie obok daje czas na sprawdzenie:

text
czy baza wstała
czy aplikacja umie się połączyć
czy krytyczne tabele mają oczekiwaną liczbę rekordów
czy błąd, przed którym uciekamy, zniknął
czy nie wróciliśmy za daleko

W PostgreSQL szczegóły zależą od sposobu backupu, ale model mentalny jest ten sam:

text
backup bazowy
archiwum WAL
target time
promote odtworzonej instancji
walidacja

Przepięcie ruchu

Po walidacji trzeba przełączyć aplikację na odtworzoną bazę.

To może być zmiana:

text
DNS
connection string
sekretu w platformie
endpointu managed database
Service albo konfiguracji routingu

Ważne, żeby wiedzieć, gdzie naprawdę jest źródło prawdy.

Jeżeli część workerów nadal pisze do starej bazy, system rozszczepi się na dwa światy.

Dlatego przed przepięciem trzeba mieć listę klientów bazy:

text
API
workery
cron jobs
narzędzia admina
integracje
read modele
procesy migracyjne

Po przepięciu trzeba sprawdzić nie tylko aplikację webową.

Trzeba sprawdzić też procesy w tle.

To one często zapisują dane długo po tym, jak główny ruch wygląda już dobrze.

Co z danymi po punkcie odtworzenia

PITR oznacza, że świadomie wracamy do przeszłości.

Jeżeli odtwarzamy bazę do 10:42, wszystko po 10:42 znika z odtworzonego świata.

To może być akceptowalne.

Może też wymagać dogrania części danych.

Przykłady:

text
zamówienia złożone po punkcie odtworzenia
płatności potwierdzone przez operatora
zgłoszenia wysłane przez klientów
eventy opublikowane do innych systemów

Tu nie ma uniwersalnego automatu.

Trzeba zdecydować, które dane są prawdą biznesową, a które można odtworzyć z zewnętrznych systemów.

Czasem najlepsza decyzja brzmi:

text
wracamy do 10:42 i ręcznie reconciliujemy płatności z ostatniej godziny

To nadal może być lepsze niż utrzymywanie uszkodzonego stanu.

Minimalny runbook

Runbook PITR całego serwera powinien zawierać:

text
kto podejmuje decyzję o PITR
jak wybieramy target time
jak zamrażamy zapisy
jak robimy snapshot aktualnego stanu
gdzie odtwarzamy nową instancję
jak walidujemy dane
jak przełączamy wszystkie klienty
jak sprawdzamy, że stara instancja nie przyjmuje zapisów
jak dokumentujemy utracone dane

Najważniejsze zdanie:

text
restore bazy to nie koniec recovery

To dopiero moment, w którym mamy kandydatkę na nową produkcję.

Produkcją staje się dopiero po walidacji i przepięciu całego ruchu.