Blog JSystems - uwalniamy wiedzę!

Szukaj

PostgreSQL

Sloty replikacji - kiedy ich używać i jak nie zapełnić dysku

W skrócie

  • Replika co jakiś czas gubi WAL i wypada z synchronizacji, więc chcesz slotów replikacji, ale boisz się, że zapchają dysk primary.
  • Slot każe primary trzymać pliki WAL, dopóki replika ich nie potwierdzi - to ratuje synchronizację, ale nieaktywny lub zapomniany slot rośnie w nieskończoność i wypełnia dysk.
  • Używaj slotów tam, gdzie zależy Ci na niezawodnej replikacji, ale ustaw limit rozmiaru zatrzymywanego WAL, monitoruj zaległości slotów i kasuj sloty osierocone.

Sloty replikacji rozwiązują odwieczny problem: primary usuwa pliki WAL, zanim replika zdąży je pobrać, i strumień się rwie. Slot gwarantuje, że potrzebne segmenty poczekają. Ta sama cecha jest jednak pułapką - nieużywany slot potrafi zapełnić dysk i zatrzymać całą bazę. Pokażemy, kiedy sloty włączać i jak nad nimi zapanować.

Jak to wygląda w praktyce

Bez slotów replika po dłuższym rozłączeniu wraca i widzi, że brakuje segmentów WAL, których primary już nie ma. Strumienia nie da się wznowić, trzeba przebudowywać standby. To pierwszy objaw, który skłania do włączenia slotów. Drugi objaw pojawia się później i jest groźniejszy: katalog WAL na primary (podkatalog pg_wal) puchnie w nieskończoność, aż dysk się zapełnia i baza przestaje przyjmować zapisy. Zaglądasz do pg_replication_slots i widzisz slot, który jest nieaktywny albo należy do repliki, której już dawno nie ma, a mimo to primary trzyma dla niego gigabajty WAL. Klasyczny przypadek: skasowano replikę, ale zapomniano usunąć jej slot.

Dlaczego tak się dzieje

PostgreSQL normalnie usuwa stare pliki WAL po checkpointach, kierując się parametrami takimi jak wal_keep_size. Slot replikacyjny łamie tę zasadę celowo: primary zapamiętuje, do którego miejsca w WAL dana replika potwierdziła odbiór, i nie usuwa niczego nowszego. Dzięki temu replika zawsze znajdzie potrzebne segmenty, nawet po długiej przerwie. Problem w tym, że jeśli replika przestaje potwierdzać (jest wyłączona, zerwana albo w ogóle już nie istnieje), punkt potwierdzenia slotu stoi w miejscu, a WAL narasta bez końca. To samo dotyczy slotów logicznych, gdzie dodatkowo blokowane jest czyszczenie wersji wierszy. Zabezpieczeniem jest parametr max_slot_wal_keep_size, który wyznacza górny limit tego, ile WAL slot może zatrzymać - po jego przekroczeniu slot zostaje unieważniony, żeby ratować dysk kosztem tej jednej repliki.

Jak to rozwiązać krok po kroku

  1. Zdecyduj, czy slot jest potrzebny. Dla stałej repliki, która musi przetrwać przerwy sieciowe, slot jest właściwym wyborem. Dla jednorazowego pg_basebackup zwykle wystarczy slot tymczasowy.
  2. Utwórz slot fizyczny funkcją pg_create_physical_replication_slot('nazwa') i wskaż go replice parametrem primary_slot_name, żeby faktycznie z niego korzystała.
  3. Ustaw bezpiecznik na primary: nadaj max_slot_wal_keep_size rozsądny limit (na tyle duży, by przetrwać typowe przerwy, ale mniejszy niż wolne miejsce na dysku), żeby awaria repliki nie zatrzymała całej bazy.
  4. Włącz monitoring zaległości slotów: obserwuj w pg_replication_slots kolumny stanu oraz rozmiar zatrzymanego WAL, a także flagę mówiącą, czy slot jest aktywny.
  5. Ustaw alarm na nieaktywny slot i na przekroczenie progu zatrzymanego WAL, żeby dowiedzieć się o problemie, zanim dysk się zapełni.
  6. Gdy replika znika na stałe, usuń jej slot funkcją pg_drop_replication_slot('nazwa'). To najczęstsza przyczyna zapchanego dysku i najprostsza naprawa.
  7. Przy slotach logicznych dodatkowo pilnuj, by subskrybent nadążał, bo zaległy slot logiczny blokuje też czyszczenie martwych wersji wierszy i puchnie szybciej.

Jak sprawdzić, że zadziałało

Podstawowy widok to pg_replication_slots: dla zdrowej repliki slot powinien być aktywny, a ilość zatrzymanego WAL - mała i stabilna. Sprawdź, że zajętość katalogu pg_wal nie rośnie bez końca po wznowieniu repliki. Zrób test odporności: zatrzymaj replikę na chwilę, zobacz, że primary zaczyna trzymać WAL dla slotu, a po ponownym starcie replika domyka lukę i zatrzymany WAL zostaje zwolniony. Jeśli po przywróceniu repliki rozmiar zatrzymanego WAL wraca do zera, a przy zniknięciu repliki bezpiecznik max_slot_wal_keep_size nie pozwala mu urosnąć ponad limit, sloty są skonfigurowane bezpiecznie.

Wróć do listy: 100 najczęstszych pytań i problemów z PostgreSQL

Szkolenie Administracja, replikacja i tuning baz danych PostgreSQL

Sprawdź szkolenie: Administracja, replikacja i tuning baz danych PostgreSQL

To szkolenie może być dofinansowane z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Szkolenie Zaawansowana administracja PostgreSQL - HA, DR, monitoring, skalowanie

Sprawdź szkolenie: Zaawansowana administracja PostgreSQL (HA, DR, monitoring, skalowanie)

To szkolenie może być dofinansowane z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Do czego służy slot replikacji w PostgreSQL?
Slot replikacji każe primary zachować pliki WAL, dopóki replika ich nie potwierdzi. Bez slotu primary usuwa stare segmenty WAL po checkpointach, kierując się parametrem wal_keep_size, i jeśli replika odpadnie na dłużej, potrzebnych segmentów już nie znajdzie. Slot to naprawia: primary zapamiętuje, do którego miejsca replika potwierdziła odbiór, i nie usuwa niczego nowszego. Dzięki temu replika przetrwa przerwy sieciowe i restarty bez konieczności przebudowy od zera.
Dlaczego slot replikacji może zapełnić dysk na primary?
Bo slot celowo blokuje usuwanie WAL. Jeśli replika przestaje potwierdzać (jest wyłączona, zerwana albo już nie istnieje), punkt potwierdzenia slotu stoi w miejscu, a katalog pg_wal narasta bez końca, aż dysk się zapełni i baza przestanie przyjmować zapisy. Najczęstszy przypadek to skasowana replika, której zapomniano usunąć slot. Sloty logiczne dodatkowo blokują czyszczenie martwych wersji wierszy, więc puchną jeszcze szybciej. Dlatego nieaktywne sloty trzeba monitorować i kasować.
Jak zabezpieczyć się przed przepełnieniem dysku przez slot?
Ustaw parametr max_slot_wal_keep_size, który wyznacza górny limit tego, ile WAL slot może zatrzymać. Po przekroczeniu limitu slot zostaje unieważniony, żeby ratować dysk kosztem tej jednej repliki, zamiast zatrzymywać całą bazę. Dobierz limit tak, by przetrwał typowe przerwy sieciowe, ale był mniejszy niż wolne miejsce na dysku. Do tego włącz monitoring: obserwuj w pg_replication_slots stan slotów i rozmiar zatrzymanego WAL, i ustaw alarm na nieaktywny slot.
Jak usunąć niepotrzebny slot replikacji?
Użyj funkcji pg_drop_replication_slot z nazwą slotu jako argumentem. Najpierw upewnij się w widoku pg_replication_slots, że slot faktycznie jest nieużywany (nieaktywny i nie należy do żadnej działającej repliki), bo usunięcie aktywnego slotu przerwie replikację korzystającej z niego repliki. Usunięcie osieroconego slotu to najczęstsza i najprostsza naprawa problemu z zapchanym dyskiem, gdy replika została skasowana, ale jej slot został na primary i wciąż trzyma WAL.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...