Przyrostowe kopie zapasowe postgresql z pgbackrest - kurs dla młodego wojownika od dewelopera

Zrzeczenie się

Jestem programistą. Piszę kod i wchodzę w interakcję z bazą danych tylko jako użytkownik. W żadnym wypadku nie udaję, że jestem administratorem systemu, a tym bardziej dbam. Ale…

Tak się złożyło, że musiałem zorganizować kopię zapasową bazy danych postgresql. Żadnych chmur - po prostu użyj SSH i upewnij się, że wszystko działa, bez proszenia o pieniądze. Co robimy w takich przypadkach? Zgadza się, wrzucamy pgdump do crona, codziennie robimy kopię zapasową wszystkiego do archiwum, a jeśli jesteśmy całkowicie zagubieni, wysyłamy to archiwum gdzieś daleko.

Tym razem trudność polegała na tym, że zgodnie z planami baza danych miała rosnąć o około +- 100 MB dziennie. Oczywiście po kilku tygodniach zniknie chęć tworzenia kopii zapasowej wszystkiego za pomocą pgdump. Tutaj na ratunek przychodzą przyrostowe kopie zapasowe.

Ciekawy? Witamy w kocie.

Kopia przyrostowa to rodzaj kopii zapasowej, w przypadku której kopiowane są nie wszystkie pliki źródłowe, a jedynie nowe i te, które uległy zmianie od czasu utworzenia poprzedniej kopii.

Jak każdy programista, który CAŁKOWICIE nie chciał (w tamtym czasie) zrozumieć zawiłości Postgres, chciałem znaleźć zielony przycisk. No wiesz, tak jak w AWS, DigitalOcean: wcisnąłeś jeden przycisk – masz replikację, wcisnąłeś drugi – założyłeś kopie zapasowe, trzeci – cofnąłeś wszystko o kilka godzin. Nie znalazłem przycisku ani pięknego narzędzia GUI. Jeśli znasz taki (bezpłatny lub tani), napisz o nim w komentarzach.

Po googlowaniu znalazłem dwa narzędzia pgbarman и pgoparcie. Z pierwszym po prostu mi się nie udało (dokumentacja bardzo uboga, próbowałem wszystko rozgryźć według starych instrukcji), ale z drugim dokumentacja okazała się na poziomie, choć nie bez wad. Aby uprościć pracę tym, którzy stoją przed podobnym zadaniem, napisano ten artykuł.

Po przeczytaniu tego artykułu dowiesz się jak tworzyć przyrostowe kopie zapasowe, zapisywać je na zdalnym serwerze (repozytorium z kopiami zapasowymi) i przywracać je w przypadku utraty danych lub innych problemów na serwerze głównym.

Szkolenie

Do odtworzenia instrukcji potrzebne będą dwa VPS. Pierwszym będzie magazyn (repozytorium, w którym będą przechowywane kopie zapasowe), a drugim, a właściwie sam serwer z postgresem (w moim przypadku wersja 11 postgresu).

Zakłada się, że na serwerze z postgresem masz zainstalowany root, użytkownik sudo, użytkownik postgres i sam postgres jest zainstalowany (użytkownik postgres tworzony jest automatycznie podczas instalacji postgresql), a na serwerze repozytorium znajduje się użytkownik root i sudo (w instrukcji zostanie użyta nazwa użytkownika pgbackrest).

Abyście mieli mniej problemów przy odtwarzaniu instrukcji, piszę kursywą gdzie, z jakim użytkownikiem i z jakimi uprawnieniami wykonałem polecenie podczas pisania i sprawdzania artykułu.

Instalowanie pgbackrest

Repozytorium (użytkownik pgbackrest):

1. Pobierz archiwum z pgbackrest i przenieś jego zawartość do folderu /build:

sudo mkdir /build
sudo wget -q -O - 
       https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz | 
       sudo tar zx -C /build

2. Zainstaluj zależności potrzebne do montażu:

sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev 
       libpq-dev

3. Montaż oparcia:

cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src

4. Skopiuj plik wykonywalny do katalogu /usr/bin:

sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest

5. Pgbackrest wymaga Perla. Zainstalować:

sudo apt-get install perl

6. Utwórz katalogi dla logów, nadaj im określone uprawnienia:

sudo mkdir -p -m 770 /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo mkdir -p /etc/pgbackrest
sudo mkdir -p /etc/pgbackrest/conf.d
sudo touch /etc/pgbackrest/pgbackrest.conf
sudo chmod 640 /etc/pgbackrest/pgbackrest.conf
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf

7. Sprawdź:

pgbackrest version

Serwer Postgres (użytkownik Sudo lub root):

Proces instalacji pgbackrest na serwerze z postgresem przebiega podobnie jak proces instalacji na repozytorium (tak, pgbackrest musi być zainstalowany na obu serwerach), ale w akapicie 6 drugie i ostatnie polecenie:

sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf

zamienić:

sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf

Konfigurowanie interakcji między serwerami za pośrednictwem protokołu SSH bez hasła

Aby pgbackrest działał poprawnie należy skonfigurować interakcję pomiędzy serwerem Postgres a repozytorium za pomocą pliku klucza.

Repozytorium (użytkownik pgbackrest):

Utwórz parę kluczy:

mkdir -m 750 /home/pgbackrest/.ssh
ssh-keygen -f /home/pgbackrest/.ssh/id_rsa 
       -t rsa -b 4096 -N ""

Ostrzeżenie! Powyższe polecenia uruchamiamy bez sudo.

Serwer Postgres (użytkownik Sudo lub root):

Utwórz parę kluczy:

sudo -u postgres mkdir -m 750 -p /var/lib/postgresql/.ssh
sudo -u postgres ssh-keygen -f /var/lib/postgresql/.ssh/id_rsa 
       -t rsa -b 4096 -N ""

Repozytorium (użytkownik Sudo):

Skopiuj klucz publiczny serwera Postgres na serwer repozytorium:

(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && 
       echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && 
       sudo ssh root@<postgres_server_ip> cat /var/lib/postgresql/.ssh/id_rsa.pub) | 
       sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys

Na tym etapie zostaniesz poproszony o podanie hasła użytkownika root. Musisz wprowadzić hasło użytkownika root serwera Postgres!

Serwer Postgres (użytkownik Sudo):

Skopiuj klucz publiczny repozytorium na serwer za pomocą postgres:

(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && 
       echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && 
       sudo ssh root@<repository_server_ip> cat /home/pgbackrest/.ssh/id_rsa.pub) | 
       sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys

Na tym etapie zostaniesz poproszony o podanie hasła użytkownika root. Musisz podać dokładnie hasło użytkownika root repozytorium!

Sprawdzanie:

Repozytorium (użytkownik root, dla czystości eksperymentu):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Serwer Postgres (użytkownik root, dla czystości eksperymentu):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Dbamy o to, abyśmy uzyskali dostęp bez problemów.

Konfigurowanie serwera Postgres

Serwer Postgres (użytkownik Sudo lub root):

1. Zezwólmy na pukanie do serwera Postgres z zewnętrznych adresów IP. Aby to zrobić, edytuj plik postgresql.conf (znajduje się w folderze /etc/postgresql/11/main), dodając do niego linię:

listen_addresses = '*'

Jeśli taka linia już istnieje, odkomentuj ją lub ustaw wartość parametru na „*”.

W pliku pg_hba.conf (również znajduje się w folderze /etc/postgresql/11/main) dodaj następujące wiersze:

hostssl  all  all  0.0.0.0/0  md5
host  all  all  0.0.0.0/0  md5

gdzie:

hostssl/host - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля

2. Dokonajmy niezbędnych ustawień w postgresql.conf (jest w folderze /etc/postgresql/11/main) aby pgbackrest działał:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Где main - название кластера. При установке postgres автоматически создает кластер main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Dokonajmy niezbędnych ustawień w pliku konfiguracyjnym pgbackrest (/etc/pgbackrest/pgbackrest.conf):

[main]
pg1-path=/var/lib/postgresql/11/main

[global]
log-level-file=detail
repo1-host=<repository_server_ip>

4. Załaduj ponownie postgresql:

sudo service postgresql restart

Konfigurowanie serwera repozytorium

Repozytorium (użytkownik pgbackrest):

Dokonajmy niezbędnych ustawień w pliku konfiguracyjnym pgoparcie
(/etc/pgbackrest/pgbackrest.conf):

[main]
pg1-host=<postgres_server_ip>
pg1-path=/var/lib/postgresql/11/main

[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # Параметр, указывающий сколько хранить полных бэкапов. Т.е. если у вас есть два полных бэкапа и вы создаете третий, то самый старый бэкап будет удален. Можно произносить как "хранить не более двух бэкапов" - по аналогии с ротациями логов. Спасибо @Aytuar за исправление ошибки.
start-fast=y # Начинает резервное копирование немедленно, прочитать про этот параметр можно тут https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Tworzenie repozytorium

Repozytorium (użytkownik pgbackrest):

Utwórz nowy magazyn dla klastra główny:

sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R pgbackrest /var/lib/pgbackrest/
sudo -u pgbackrest pgbackrest --stanza=main stanza-create

Проверка

Serwer Postgres (użytkownik Sudo lub root):

Sprawdzamy na serwerze postgres:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info check

Repozytorium (użytkownik pgbackrest):

Sprawdzamy na serwerze repozytorium:

sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info check

Dbamy o to, aby na wyjściu pojawił się wiersz „sprawdź koniec polecenia: zakończone pomyślnie”.

Zmęczony? Przejdźmy do najciekawszej części.

Tworzenie kopii zapasowej

Repozytorium (użytkownik pgbackrest):

1. Wykonaj kopię zapasową:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Upewnij się, że utworzono kopię zapasową:

ls /var/lib/pgbackrest/backup/main/

Pgbackrest utworzy pierwszą pełną kopię zapasową. Jeśli chcesz, możesz ponownie uruchomić polecenie tworzenia kopii zapasowej i upewnić się, że system utworzy przyrostową kopię zapasową.

Jeśli chcesz ponownie wykonać pełną kopię zapasową, określ dodatkową flagę:

sudo -u pgbackrest pgbackrest --stanza=main --type=full backup

Jeśli chcesz uzyskać szczegółowe dane wyjściowe konsoli, określ także:

sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backup

Przywracanie kopii zapasowej

Serwer Postgres (użytkownik Sudo lub root):

1. Zatrzymaj działający klaster:

sudo pg_ctlcluster 11 main stop

2. Przywracanie z kopii zapasowej:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restore

Aby przywrócić bazę danych do stanu z ostatniej PEŁNEJ kopii zapasowej należy użyć komendy bez określenia celu_odzyskiwania:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta restore

Ważny! Po odzyskaniu może się zdarzyć, że baza danych utknie w trybie odzyskiwania (pojawią się błędy takie jak BŁĄD: nie można wykonać DROP DATABASE w transakcji tylko do odczytu). Szczerze mówiąc, jeszcze nie zrozumiałem, z czym to się wiąże. Rozwiązanie jest następujące (będziesz musiał trochę poczekać po wykonaniu polecenia):

sudo -u postgres psql -c "select pg_wal_replay_resume()"

W rzeczywistości możliwe jest przywrócenie określonej kopii zapasowej według jej nazwy. Tutaj jestem tylko Link do opisu tej funkcji podam w dokumentacji. Twórcy zalecają ostrożne korzystanie z tej opcji i wyjaśniają dlaczego. Dodam od siebie, że stosowałem. Jeśli naprawdę tego potrzebujesz, upewnij się, że po odzyskaniu baza danych wyjdzie z trybu odzyskiwania (wybranie pg_is_in_recovery() powinno wyświetlić „f”) i na wszelki wypadek wykonaj pełną kopię zapasową po odzyskaniu.

3. Uruchom klaster:

sudo pg_ctlcluster 11 main start

Po przywróceniu kopii zapasowej musimy wykonać drugą kopię zapasową:

Repozytorium (użytkownik pgbackrest):

sudo pgbackrest --stanza=main backup

To wszystko. Na zakończenie przypominam, że w żadnym wypadku nie próbuję udawać seniora dba i przy najmniejszej okazji będę korzystał z chmur. Obecnie sam zaczynam studiować różne tematy, takie jak tworzenie kopii zapasowych, replikacja, monitorowanie itp. i piszę małe raporty o wynikach, aby wnieść niewielki wkład w społeczność i zostawić małe ściągawki dla siebie.

W kolejnych artykułach postaram się opowiedzieć o dodatkowych funkcjonalnościach - odzyskiwaniu danych do czystego klastra, szyfrowaniu kopii zapasowych i publikacji na S3, kopiach zapasowych poprzez rsync.

Źródło: www.habr.com

Dodaj komentarz