Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
PostgreSQL
wal-shipping i warm standby - kiedy zamiast streamingu
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ć.
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.
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.
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.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.pg_basebackup. Standby musi startować od spójnego obrazu pasującego do strumienia WAL.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.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.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

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

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
Komentarze (0)
Brak komentarzy...