PostgreSQL Backup z pgBackRest na zewnętrznym woluminie w Digital Ocean

wkontenerach.pl 2 miesięcy temu

W dzisiejszych czasach, efektywne zarządzanie danymi i zapewnienie im bezpieczeństwa jest najważniejsze dla każdej organizacji. Backupy są fundamentem każdej strategii ochrony danych, oferując różne poziomy ochrony i efektywności. W kontekście baz danych PostgreSQL, narzędzie pgBackRest wyróżnia się jako potężne i wszechstronne rozwiązanie do tworzenia i zarządzania kopiami zapasowymi.

pgBackRest zapewnia zaawansowane funkcje, takie jak kompresja, szyfrowanie, replikacja i zarządzanie retencją, które są niezbędne do utrzymania integralności i dostępności danych. Jednym z najbardziej efektywnych sposobów przechowywania backupów jest wykorzystanie zewnętrznych woluminów podmontowanych do maszyny, co pozwala na elastyczne zarządzanie przestrzenią dyskową i ułatwia przenoszenie danych między różnymi środowiskami.

PostgreSQL Backup – krok po kroku

W tym artykule przeprowadzę krok po kroku proces konfiguracji pgBackRest do tworzenia backupów pełnych i różnicowych na zewnętrznym woluminie utworzonym w DigitalOcean. Omówię konfigurację narzędzia, proces montowania zewnętrznego woluminu oraz najlepsze praktyki związane z zarządzaniem kopiami zapasowymi. Dzięki temu przewodnikowi będziesz w stanie skutecznie zabezpieczyć swoje dane i zapewnić ciągłość działania swojej bazy danych PostgreSQL, niezależnie od ewentualnych awarii czy innych nieprzewidzianych zdarzeń.

PostgreSQL Backup – zewnętrzny wolumin

Domyślnie utworzony wolumin, który w panelu jest dołączony do danej instancji maszyny również automatycznie się podmontowuje w systemie plików. Woluminy dzięki konfiguracji systemd i udev są automatycznie zamontowane po restarcie maszyny i nie trzeba modyfikować w tym celu /etc/fstab. Dodatkowe informacje w dokumentacji.

Instalacja i konfiguracja pgBackRest oraz tworzenie PostgreSQL Backup

1. Instalacja pgbackrest:
apt install pgbackrest
2. Konfiguracja w pliku /etc/pgbackrest.conf:
[global] process-max=2 repo1-block=y repo1-bundle=y repo1-path=/mnt/volume_jonas_test_purposes/pg_backup repo1-retention-full=1 repo1-retention-diff=2 #archive-timeout=120 start-fast=y [main] pg1-path=/var/lib/postgresql/12/main #[global:archive-push] #compress-level=3

process-max – liczba równoległych procesów tworzących backup. Główny cel – przyspieszenie tworzenia backupu. Dostosuj do liczby rdzeni procesora.

repo1-block – dane backupu są przechowywane jako seria bloków danych zamiast jako pełne pliki. Umożliwia to bardziej efektywne zarządzanie danymi, w tym deduplikację i przywracanie tylko zmienionych bloków danych.

repo1-bundle – pliki backupu są grupowane i pakowane razem. Może to poprawić wydajność operacji I/O, zwłaszcza w przypadku systemów plików, które lepiej radzą sobie z mniejszą liczbą większych plików niż z dużą liczbą małych plików.

repo1-path – ścieżka do katalogu, w którym będą przechowywane backupy, wymaga uprawnień 750 i postgres:postgres na katalog pg_backup

repo1-retention-full – przechowywanie danej ilości backupów pełnych

repo1-retention-diff – przechowywanie danej ilości backupów różnicowych

start-fast – nie czeka na utworzenie checkpointa tylko go wymusza i uruchamia backup. najważniejsze w środowiskach produkcyjnych, gdzie minimalizacja czasu wykonania backupu jest krytyczna dla utrzymania wysokiej dostępności systemu.

pg1-path – ścieżka do katalogu danych postgresa

compress-level – poziom kompresji archiwizacji

archive-timeout – ustawia maksymalny czas, w sekundach, oczekiwania na dotarcie każdego segmentu WAL do repozytorium archiwum pgBackRest. Domyślnie jest to 60s. Modyfikuj tylko wtedy, gdy widzisz timeout w pliku dziennika związanym z archiwizacją wal.

3. Konfiguracja w /etc/postgresql/12/main/postgresql.conf:
archive_command = 'pgbackrest --stanza=main archive-push %p' archive_mode = on max_wal_senders = 3 wal_level = replica max_wal_size = 4GB min_wal_size = 1GB

archive_command – polecenie wykonywane przez PostgreSQL do archiwizacji WAL. W tym przykładzie “%p” jest specjalnym tokenem używanym w PostgreSQL, który oznacza pełną ścieżkę do pliku WAL (Write-Ahead Log), który ma zostać zarchiwizowany.

archive_mode – włączenie trybu archiwizacji.

max_wal_senders – maksymalna liczba procesów wysyłających WAL.

wal_level – poziom zapisywanych danych WAL – minimum, logical, replica.

max_wal_size i min_wal_size – maksymalny i minimalny rozmiar segmentów WAL.

4. Restart klastra:
systemctl restart postgresql@12-main
5. Inicjalizacja “stanzy” z poziomu użytkownika postgres i sprawdzenie konfiguracji:
pgbackrest --stanza=main --log-level-console=info stanza-create pgbackrest --stanza=main check
6. Utwórz kopie zapasowe – użyj odpowiedniej kombinacji (w opisywanym przypadku wybrałem pełną i różnicową):
pgbackrest --stanza=main --type=full backup --log-level-console=info # backup pełny pgbackrest --stanza=main --type=diff backup --log-level-console=info # backup różnicowy pgbackrest --stanza=main --type=incr backup --log-level-console=info # backup przyrostowy
7. Sprawdzenie statusu backupów:
pgbackrest --stanza=main info
8. Utworzenie wpisu w tablicy crona na koncie użytkownika postgres:
# Pełny backup w niedzielę o północy z logowaniem 0 0 * * 0 pgbackrest --stanza=main --type=full backup > /var/log/pgbackrest/backup_full.log 2>&1 # Różnicowy backup od poniedziałku do soboty o północy z logowaniem 0 0 * * 1-6 pgbackrest --stanza=main --type=diff backup > /var/log/pgbackrest/backup_diff.log 2>&1
9. Utworzenie plików backup_diff i backup_full wraz z odpowiednimi uprawnieniami:
touch /var/log/pgbackrest/backup_full.log touch /var/log/pgbackrest/backup_diff.log chmod 640 /var/log/pgbackrest/backup_diff.log chmod 640 /var/log/pgbackrest/backup_full.log chown postgres:postgres /var/log/pgbackrest/backup_diff.log chown postgres:postgres /var/log/pgbackrest/backup_full.log

PostgreSQL – Przywracanie danych

Tutaj na chwilę musimy się zatrzymać, ponieważ są trzy podejścia związane z odzyskiwaniem danych. Pierwsze z nich uwzględnia usunięcie danych z katalogu /var/lib/postgresql/12/main, a drugie nie. Trzecie to Point-in-Time Recovery lub PITR. Jaka jest różnica i którą opcję wybrać?

Pierwszy, klasyczny sposób wymaga pustego katalogu klastra przed uruchomieniem opcji odzyskiwania.

Drugi sposób to użycie parametru “- -delta”, który nie wymaga pustego katalogu klastra. Polega on na przywróceniu tylko tych plików, które zostały zmienione. Obliczana jest funkcja skrótu sha-1 dla wszystkich pliku w klastrze i jeżeli różni się ona od tej dla danego pliku w backupie, to wtedy taki plik jest przywracany. Jest to jasno napisane w dokumentacji w pkt. 10.2 “Delta option”.

Trzeci to Point in-time recovery. PITR umożliwia odtworzenie WAL z kopii zapasowej do określonego lsn, czasu, identyfikatora transakcji lub punktu odzyskiwania. W przypadku typowych scenariuszy odzyskiwania odzyskiwanie oparte na czasie jest prawdopodobnie najbardziej przydatne. Typowym scenariuszem odzyskiwania jest przywrócenie tabeli, która została przypadkowo usunięta lub danych, które zostały przypadkowo usunięte.

Dodatkowo warto użyć opcji process-max=X, gdzie za X można spróbować podstawić liczbę rdzeni procesora. W momencie odzyskiwania z backupu klaster postgresa jest wyłączony, więc maszyna ma dodatkowe zasoby. Poza tym zależy nam na jak najszybszym przywróceniem jego pełnej sprawności.

Pierwszy sposób: Usunięcie danych z katalogu /var/lib/postgresql/12/main

1. Zatrzymać klaster:
systemctl stop postgresql@12-main
2. Skasować zawartość z katalogu z danymi:
find /var/lib/postgresql/12/main -mindepth 1 -delete
3. Uruchomić polecenie do odzyskiwania:
pgbackrest --stanza=main restore --log-level-console=info
4. Uruchomić klaster:
systemctl start postgresql@12-main
5. Weryfikacja działania klastra:
pg_lsclusters systemctl status postgresql@12-main

Drugi sposób: Użycie parametru “delta”

1. Zatrzymać klaster:
systemctl stop postgresql@12-main
2. Uruchomić polecenie do odzyskiwania z parametrem “- -delta”:
pgbackrest --stanza=main restore --log-level-console=info --delta
4. Uruchomić klaster:
systemctl start postgresql@12-main
5. Weryfikacja działania klastra:
pg_lsclusters systemctl status postgresql@12-main

Trzeci sposób: PITR

1. Należy sprawdzić w logach postgresql, jaki jest czas wystąpienia awarii. Im dokładniejszy czas, tym lepiej.
2. Zatrzymaj klaster:
systemctl stop postgresql@12-main
3. Uruchom polecenie, aby odzyskać dane:
pgbackrest --stanza=main --delta --type=time "--target=2024-06-17 16:13:29" --target-action=promote restore --log-level-console=info

type – określa typ przywracania. “time” oznacza, iż przywracanie zostanie wykonane do określonego punktu w czasie (timestamp).

target – określa dokładny punkt w czasie, do którego baza danych ma zostać przywrócona. Używany format z pliku loga postgresql.

target-action – określa akcję, która zostanie podjęta po osiągnięciu punktu przywracania. “promote” oznacza, iż po przywróceniu do określonego punktu w czasie, baza danych zostanie awansowana do roli podstawowej. To kończy proces przywracania i sprawia, iż baza danych jest gotowa do użycia.

4. Uruchomić klaster:
systemctl start postgresql@12-main
5. Weryfikacja działania klastra:
pg_lsclusters systemctl status postgresql@12-main

PostgreSQL Backup – Której opcji użyć?

Klasycznie “to zależy”. Na pewno należy zwrócić uwagę na kilka kwestii:

1. Mnogość zmian w danych

Jeśli katalog danych zawiera większość aktualnych danych i tylko niewielka część plików została zmieniona lub uszkodzona, użycie “delta” pozwoli na szybsze przywrócenie kopii, ponieważ zostaną przywrócone tylko zmienione pliki.

2. Wielkość bazy danych

Duża baza danych, np. kilkaset GB, może spowodować, iż usunięcie i pełne przywrócenie zajęłoby za dużo czasu.

3. Czas przestoju

Jeśli czas przestoju musi być zminimalizowany “delta” może skrócić czas potrzebny na przywracanie danych.

Natomiast każdy przypadek należy rozpatrywać indywidualnie i testować – jaka opcja będzie najlepsza.

Podsumowanie

W artykule zawarłem instrukcję, jak skonfigurować i użyć narzędzia pgbackrest, aby móc zadbać o zautomatyzowane sprawne tworzenie kopii zapasowej i przywracanie z niej bazy danych.

Więcej zdecydowanie ciekawych/użytecznych informacji w dokumentacji → https://pgbackrest.org/user-guide.html

Lista dostępnych poleceń narzędzia pgBackRest → https://pgbackrest.org/command.html

Informacje dotyczące konfiguracji w /etc/pgbackrest.conf → https://pgbackrest.org/configuration.html

Autor

Piotr Bracha — pracuje jako administrator systemów. Karierę zaczynał jako młodszy administrator systemów w call center, gdzie miał m.in. możliwość poznania administrowania systemem CentOS i centralą telefoniczną Asterisk. w tej chwili rozwija się w technologiach kontenerowych i chmurowych. Fan automatyzacji i porządku – w kodzie, ale też w środowisku pracy. Artykuły autorstwa Piotra w języku angielskim znajdziesz w serwisie medium.com.

Idź do oryginalnego materiału