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ć
pg_start_backup()
,rsync ${PGDATA}/
mistrz do niewolnika,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ę?
postgresql
replication
Daniel
źródło
źródło
Odpowiedzi:
pg_start_backup
wykona 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 kontrolnypg_start_backup
będzie miał mniejszy wpływ niż normalnie.Trzeba się martwić o rsync lub równoważny
pg_basebackup
krok. 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ć
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 pewnym kosztem. Tworzenie kopii zapasowej potrwa dłużej, a dopóki nie zakończysz tworzenia kopii zapasowej i nie uruchomiszpg_stop_backup
systemu, - 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_backup
i korzystać z nichpg_stop_backup
na 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ć
CHECKPOINT
atomową 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
pg_stop_backup
pg_stop_backup
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.
źródło
To kopanie grobów, ale muszę coś tutaj poprawić.
Poprzednia odpowiedź brzmi:
To nieprawda. System zachowa liczbę WAL określoną w konfiguracji (patrz dokumentacja online ). Zasadniczo wyższa wartość między:
Wyobraźmy sobie ten przypadek:
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 ()”.
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.
źródło
pg_basebackup --xlog-method=stream
jeśli się nie mylę.max_wal_senders
ustawić minimum na 2. Jest to dobry sposób na uniknięcie problemu „brakującego WAL” na końcu kopii zapasowej.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.
źródło