Blog JSystems - uwalniamy wiedzę!

Szukaj

PostgreSQL

wal-shipping i warm standby - kiedy zamiast streamingu

W skrócie

  • Nie wiesz, kiedy zamiast replikacji strumieniowej wybrać starsze przesyłanie całych plików WAL do serwera zapasowego.
  • Replikacja strumieniowa wymaga stałego połączenia między serwerami, którego nie zawsze da się utrzymać przez zaporę czy łącze między lokalizacjami.
  • wal-shipping do warm standby przesyła gotowe segmenty WAL plik po pliku, więc działa nawet bez ciągłego połączenia, kosztem większego opóźnienia.

Replikacja strumieniowa jest dziś domyślnym wyborem, ale nie jedynym. Przesyłanie plików WAL do warm standby wciąż ma swoje zastosowania, zwłaszcza gdy serwery dzieli zapora sieciowa albo niepewne łącze. Wyjaśnimy, jak działa ten mechanizm, czym różni się od streamingu i kiedy naprawdę warto go rozważyć.

Jak to wygląda w praktyce

Chcesz mieć serwer zapasowy w drugiej lokalizacji, ale nie możesz otworzyć stałego połączenia na port PostgreSQL między nimi, bo dział sieci na to nie pozwala. Albo łącze bywa zrywane i replikacja strumieniowa co chwilę traci połączenie. Zastanawiasz się, czy zamiast utrzymywać ciągły strumień, nie prościej byłoby po prostu kopiować gotowe pliki dziennika, gdy tylko powstaną, i pozwolić serwerowi zapasowemu je odtwarzać we własnym tempie.

Dlaczego tak się dzieje

Replikacja strumieniowa działa przez trwałe połączenie TCP: serwer zapasowy łączy się do głównego i odbiera rekordy WAL na bieżąco, niemal w czasie rzeczywistym. To najlepsze rozwiązanie dla niskiego opóźnienia, ale wymaga sieci, która utrzyma takie połączenie stabilnie i przez odpowiedni port. Gdy tego nie ma, potrzebny jest inny kanał.

wal-shipping opiera się na archiwizacji plików. Serwer główny po zapełnieniu każdego segmentu WAL uruchamia archive_command, które kopiuje gotowy plik w umówione miejsce, na przykład na współdzielony zasób albo przez rsync do drugiej lokalizacji. Serwer zapasowy działa w trybie ciągłego odtwarzania i przez restore_command pobiera kolejne segmenty, odtwarzając je jeden po drugim. To warm standby - serwer jest gotowy do przejęcia roli, ale w tej konfiguracji nie przyjmuje zapytań i odtwarza z opóźnieniem jednego segmentu, bo plik trafia dalej dopiero po zapełnieniu.

Jak to rozwiązać krok po kroku

  1. Na serwerze głównym włącz archiwizację: ustaw archive_mode = on i archive_command kopiujące zapełniony segment w miejsce dostępne dla standby, na przykład katalog sieciowy albo cel rsync. Zmiana archive_mode wymaga restartu.
  2. Zadbaj, żeby archive_command zwracało kod sukcesu wyłącznie po realnym skopiowaniu pliku. Jeśli komenda skłamie o sukcesie, PostgreSQL uzna segment za zarchiwizowany i może go skasować, co przerwie ciągłość na standby.
  3. Przygotuj serwer zapasowy z kopii bazowej głównego, wykonanej przez pg_basebackup. Standby musi startować od spójnego obrazu pasującego do strumienia WAL.
  4. Na standby skonfiguruj restore_command pobierające segmenty z tego samego miejsca oraz utwórz plik sygnalizujący tryb rezerwy (standby.signal w PostgreSQL 12 i nowszych). Serwer wejdzie w tryb ciągłego odtwarzania.
  5. Uruchom standby i obserwuj, jak odtwarza kolejne segmenty. W trybie warm standby nie łączysz się do niego zapytaniami - służy wyłącznie jako gotowa rezerwa.
  6. Rozważ konfigurację mieszaną: jako podstawę restore_command z archiwum, a dodatkowo primary_conninfo dla strumienia, gdy połączenie akurat jest dostępne. Wtedy standby dobiera brakujące segmenty z plików, a bieżące ze strumienia, gdy tylko może.

Jak sprawdzić, że zadziałało

Na serwerze głównym sprawdź, że archiwizacja działa, zaglądając do widoku pg_stat_archiver - rosnąca kolumna archived_count i brak wpisów w failed_count oznaczają, że segmenty są kopiowane poprawnie. Na standby potwierdź tryb rezerwy zapytaniem SELECT pg_is_in_recovery();, które powinno zwrócić t. Postęp odtwarzania podejrzysz przez SELECT pg_last_wal_replay_lsn(); - wartość powinna rosnąć w miarę pobierania kolejnych segmentów. Opóźnienie ocenisz, porównując tę pozycję z bieżącą pozycją WAL na głównym; w wal-shippingu będzie ono rzędu jednego segmentu, co jest normalne i potwierdza, że mechanizm działa zgodnie z oczekiwaniami.

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

Czym różni się wal-shipping od replikacji strumieniowej w PostgreSQL?
Replikacja strumieniowa działa przez trwałe połączenie, którym serwer zapasowy odbiera rekordy WAL na bieżąco, niemal w czasie rzeczywistym. wal-shipping przesyła gotowe segmenty WAL plik po pliku przez archive_command i restore_command, więc opóźnienie jest większe, rzędu jednego segmentu, ale nie wymaga stałego połączenia między serwerami.
Kiedy warto wybrać wal-shipping zamiast streamingu?
Wtedy, gdy nie da się utrzymać stałego połączenia na port PostgreSQL między serwerami, na przykład przez restrykcyjną zaporę sieciową albo niepewne łącze między lokalizacjami, które co chwilę zrywa strumień. wal-shipping kopiuje pliki dziennika w umówione miejsce i standby pobiera je we własnym tempie, więc działa nawet przy przerwach w łączności.
Co to jest warm standby w PostgreSQL?
To serwer zapasowy działający w trybie ciągłego odtwarzania, gotowy do przejęcia roli głównego, ale w tej konfiguracji nieprzyjmujący zapytań. Odtwarza kolejne segmenty WAL, więc jest w gotowości, lecz nie służy do rozkładania odczytów. Standby, który przyjmuje zapytania odczytowe, nazywamy hot standby i wymaga dodatkowej konfiguracji.
Na co uważać przy konfiguracji archive_command dla wal-shippingu?
Komenda musi zwracać kod sukcesu wyłącznie po realnym skopiowaniu pliku. Jeśli archive_command skłamie o sukcesie, PostgreSQL uzna segment za zarchiwizowany i może go usunąć, co przerwie ciągłość WAL na serwerze zapasowym i uniemożliwi dalsze odtwarzanie. Poprawność archiwizacji kontroluj przez widok pg_stat_archiver i kolumny archived_count oraz failed_count.

Komentarze (0)

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

Brak komentarzy...