PostgreSQL: Czy mogę wykonać pg_start_backup () na działającej bazie danych działającej pod obciążeniem?

19

Nasza ustanowiona replikacja uległa awarii („żądany segment WAL został już usunięty” podczas przestoju) Nie możemy ponownie łatwo zatrzymać elementu nadrzędnego.

Czy możemy zrobić

  1. pg_start_backup(),
  2. rsync ${PGDATA}/ mistrz do niewolnika,
  3. pg_stop_backup()

... podczas gdy główny postgresql jest nadal w pełni załadowany? (Lub pg_start_backup()doprowadzi do

  • zamki stołowe,
  • Bloki we / wy,
  • niespójności,
  • alarm przeciwpożarowy,
  • wolna odpowiedź db

Innymi słowy, pg_start_backup()wpłynie to na naszą aplikację?

Daniel
źródło
Czy sprawdziłeś dokumenty ? Mówi: „Domyślnie pg_start_backup może zająć dużo czasu, aby zakończyć. Wynika to z tego, że wykonuje punkt kontrolny, a operacje we / wy wymagane dla punktu kontrolnego będą rozłożone na znaczny okres czasu, domyślnie połowa twojego punktu kontrolnego interwał (patrz parametr konfiguracyjny checkpoint_completion_target). Zwykle jest to, czego potrzebujesz, ponieważ minimalizuje wpływ na przetwarzanie zapytań. ” Co to oznacza w praktyce (iw twoim przypadku) nie jest jednak do końca jasne.
dezso

Odpowiedzi:

11

pg_start_backupwykona punkt kontrolny, jak zauważa dezso. Ma to wpływ, ale twoja baza danych i tak dość regularnie wykonuje punkty kontrolne i musi to robić, aby działać, więc najwyraźniej nie stanowią dla ciebie problemu. Wczesny punkt kontrolny oznacza, że ​​zgromadzono mniej danych, co oznacza, że ​​w ogóle punkt kontrolny pg_start_backupbędzie miał mniejszy wpływ niż normalnie.

Trzeba się martwić o rsync lub równoważny pg_basebackupkrok. Odczytanie we / wy z tego nie będzie takie złe, ponieważ jest sekwencyjne, ale prawdopodobnie znacznie pogorszy wydajność we / wy bazy danych, a także będzie miał tendencję do wypychania gorących danych z pamięci podręcznej pamięci RAM na rzecz mniejszej -używane dane, powodując przeładowanie pamięci podręcznej, gdy bardziej potrzebne dane są następnie ponownie wczytywane.

Możesz użyć nicei, ioniceaby ograniczyć wpływ wejścia / wyjścia (ale nie wpływu pamięci podręcznej); wiąże się to jednak z pewnym kosztem. Tworzenie kopii zapasowej potrwa dłużej, a dopóki nie zakończysz tworzenia kopii zapasowej i nie uruchomisz pg_stop_backupsystemu, - jak rozumiem - kumuluje WAL, nie można go usunąć, kumuluje zadłużenie punktu kontrolnego dla DUŻEGO punktu kontrolnego na końcu przebiegu tworzenia kopii zapasowej oraz gromadzi tabelę i indeks wzdęcia, ponieważ nie można wyczyścić martwych rzędów. Tak naprawdę nie możesz sobie pozwolić na wieczność tworzenia kopii zapasowej, zwłaszcza jeśli masz bardzo wysokie tabele rezygnacji.

Ostatecznie trudno powiedzieć, czy można bezpiecznie używać kopii zapasowych w środowisku pg_start_backupi korzystać z nich pg_stop_backupna gorąco. Większość ludzi może, ale jeśli jesteś blisko krawędzi tego, co potrafi twój sprzęt, masz ścisłe wymagania dotyczące czasu, nie możesz sobie pozwolić na ryzyko przeciągnięcia i masz bardzo wysokie tabele rezygnacji, a także bardzo duże stoły, może to być kłopotliwe .

Niestety, musisz to przetestować i zobaczyć.

Jeśli możesz, warto wydać CHECKPOINTatomową migawkę woluminu, w którym znajduje się baza danych, zamiast tego przy użyciu LVM, narzędzi SAN, EBS lub czegokolwiek, na czym się znajdujesz. Jeśli możesz to zrobić, możesz skopiować migawkę w dowolnym momencie. To podejście nie jest odpowiednie do wykonywania bazowej kopii zapasowej dla PITR / ciepłego trybu gotowości / gorącego trybu gotowości, ale doskonale nadaje się do statycznej kopii zapasowej i ma znacznie mniejszy wpływ na system. Możesz to zrobić tylko wtedy, gdy migawki są atomowe, a cała baza danych, w tym WAL, znajduje się na jednym woluminie.

Jedną z możliwości, których jeszcze nie zbadałem, jest połączenie tych dwóch podejść. Przyszło mi do głowy, że można ( niepotwierdzone i być może złe i niebezpieczne , jeszcze nie wiem):

  • pg_start_backup
  • Wyzwalanie migawek wszystkich obszarów tabel, głównego katalogu danych i woluminu xlog
  • pg_stop_backup
  • Skopiuj WAL do ostatecznego archiwum z pg_stop_backup
  • Skopiuj dane z migawkowych woluminów

Zasadniczo chodzi o to, aby skrócić czas, przez jaki DB musi opóźniać swoje punkty kontrolne, biorąc pod uwagę każdy wolumin, który można skopiować w wolnym czasie.

Craig Ringer
źródło
Po zrozumieniu, że pg_start_backup () jest w większości „kwestią kontrolowanego kontrolowania”, zdobyliśmy zaufanie, aby po prostu spróbować. Wygląda na to, że wpływ na działającą aplikację był znikomy. (opanuj główny katalog danych na dysku SSD) :-) Zaproponowany przez Ciebie pomysł „niesprawdzony i prawdopodobnie niebezpieczny” jest nieco powyżej naszych kompetencji i żądzy przygody.
Daniel
Aha, i nie jonizowaliśmy rsync przy pierwszej próbie. Ponieważ tak naprawdę chcieliśmy zobaczyć dodatkowe obciążenie master. Ponieważ nigdy nie potrzebowaliśmy drugiego uruchomienia rsync, wszystko jest w porządku. Nauczyliśmy się z tego czegoś.
Daniel
7

To kopanie grobów, ale muszę coś tutaj poprawić.

Poprzednia odpowiedź brzmi:

Możesz użyć nice i ionice, aby ograniczyć wpływ wejścia / wyjścia (ale nie wpływu pamięci podręcznej); wiąże się to jednak z pewnymi kosztami. Tworzenie kopii zapasowej potrwa dłużej, a dopóki nie zakończysz tworzenia kopii zapasowej i nie uruchomisz pg_stop_backup, twój system - jak rozumiem - gromadzi WAL, którego nie można usunąć, gromadząc zadłużenie punktu kontrolnego dla DUŻEGO punktu kontrolnego na końcu uruchomienia tworzenia kopii zapasowej, i gromadzi tabelę i indeksuj wzdęcie, ponieważ nie może oczyścić martwych wierszy. Tak naprawdę nie możesz sobie pozwolić na wieczność tworzenia kopii zapasowej, szczególnie jeśli masz bardzo wysokie tabele rezygnacji.

To nieprawda. System zachowa liczbę WAL określoną w konfiguracji (patrz dokumentacja online ). Zasadniczo wyższa wartość między:

  • (2 + checkpoint_completion_ratio) * checkpoint_segments + 1
  • wal_keep_segments

Wyobraźmy sobie ten przypadek:

  • tworzenie kopii zapasowej zajmuje dużo czasu, ponieważ do skopiowania są setki koncertów
  • masz małą retencję WAL (np. punkty kontrolne do 3)
  • nie masz skonfigurowanej archiwizacji WAL

następnie po zainicjowaniu „pg_start_backup ()” pliki WAL będą się obracać podczas tworzenia kopii zapasowej. Po zakończeniu tworzenia kopii zapasowej spróbujesz przywrócić ją w innym silniku bazy danych. Silnik przy uruchomieniu poprosi o co najmniej plik WAL wygenerowany podczas wydawania „pg_start_backup ()”.

pg_start_backup 
-----------------
B/D0020F18
(1 row)

Baza danych nie zaakceptuje rozruchu, dopóki nie podasz pliku WAL „0000000x0000000B000000D0” (gdzie x to identyfikator osi czasu ). Ten plik WAL jest absolutnym minimum do uruchomienia systemu. Oczywiście, tylko z tym plikiem stracisz dane, ponieważ reszta danych znajduje się w plikach WAL, których nie masz, ale przynajmniej będziesz mieć działający silnik bazy danych.

Musisz albo wykonać archiwizację WAL, albo sam musisz zapisać potrzebne pliki WAL, ale Postgresql nie zrobi tego za ciebie.

sterfield
źródło
3
Bardzo dobra obserwacja. Można tego uniknąć, pg_basebackup --xlog-method=streamjeśli się nie mylę.
tomorrow__
2
Tak, od wersji PG 9.2 można przesyłać strumieniowo WAL przy użyciu podstawowej kopii zapasowej. Otworzy się drugi strumień, więc musisz max_wal_sendersustawić minimum na 2. Jest to dobry sposób na uniknięcie problemu „brakującego WAL” na końcu kopii zapasowej.
sterfield
4

Jeśli chodzi o moje doświadczenie z PostgreSQL, jest to stosunkowo bezpieczna operacja, chyba że masz naprawdę duży wpływ na wydajność w tym momencie. Jeśli tak, lepiej tymczasowo wstrzymać pisanie od wszystkich klientów.

Miałem tylko jeden krytyczny przypadek podczas synchronizacji mojego mastera z slave pod obciążeniem i było to spowodowane przez OOM Killera (tak, naprawdę powinieneś CAŁKOWICIE wyłączyć OOM Killera w węzłach bazy danych, nie wiedziałem tego tego dnia).

Więc przywróciłem bazę danych z nocnej kopii zapasowej i podałem postgresowi wszystkie segmenty WAL z katalogu pg_archive do odtworzenia (po prostu skopiowałem je do folderu pg_xlog). Wszystko poszło dobrze, ale przestoje były oczywiście nieuniknione.

Riki_tiki_tavi
źródło