Inkrementell postgresql Backups mat pgbackrest - e Cours fir e jonke Kämpfer vum Entwéckler

Verzichterklärung

Ech sinn en Entwéckler. Ech schreiwen Code an interagéiere mat der Datebank nëmmen als Benotzer. Op kee Fall maachen ech wéi e System Administrateur ze sinn, vill manner eng dba. Awer…

Et ass sou geschitt datt ech e Backup vun der postgresql Datebank organiséiert hunn. Keng Wolleken - benotzt just SSH a gitt sécher datt alles funktionnéiert ouni Suen ze froen. Wat maache mir an esou Fäll? Dat ass richteg, mir drécken pgdump an cron, backup alles all Dag an den Archiv, a wa mir komplett verluer sinn, schécken mir dëst Archiv iergendwou wäit ewech.

Dës Kéier war d'Schwieregkeet datt no de Pläng d'Datebank ëm ongeféier +- 100 MB pro Dag soll wuessen. Natierlech, no e puer Wochen de Wonsch alles mat pgdump ze Backupsatellit verschwannen. Dëst ass wou inkrementell Backups zur Rettung kommen.

Interessant? Wëllkomm zu Kaz.

Inkrementelle Backup ass eng Aart vu Backup wann net all Quelldateien kopéiert ginn, awer nëmmen nei an déi geännert zënter der Schafung vun der viregter Kopie.

Wéi all Entwéckler deen ABSOLUT net gewëllt war (zu där Zäit) d'Intricacies vu Postgres ze verstoen, wollt ech de grénge Knäppchen fannen. Gutt, Dir wësst, wéi an AWS, DigitalOcean: Dir hutt ee Knäpp gedréckt - Dir hutt Replikatioun, Dir hutt déi zweet gedréckt - Dir hutt Backups opgestallt, déi drëtt - Dir hutt alles e puer Stonnen zréckgezunn. Ech hu kee Knäppchen oder e schéine GUI Tool fonnt. Wann Dir een kennt (gratis oder bëlleg), schreift doriwwer an de Kommentaren.

Nom Google hunn ech zwee Tools fonnt pgbarman и pg Récksäit. Ech hunn et einfach net mat der éischter gelongen (ganz schaarf Dokumentatioun, ech hu probéiert alles no alen Handbuch erauszefannen), awer mat der zweeter huet d'Dokumentatioun sech op d'Säit erausgestallt, awer net ouni Mängel. Fir d'Aarbecht vun deenen ze vereinfachen, déi mat enger ähnlecher Aufgab konfrontéiert sinn, gouf dësen Artikel geschriwwen.

Nodeems Dir dësen Artikel gelies hutt, léiert Dir wéi Dir inkrementell Backups maacht, späichert se op e Fernserver (Repository mat Backups) a restauréiert se am Fall vun Datenverloscht oder aner Probleemer um Haaptserver.

Virbereedung

Fir d'Handbuch ze reproduzéieren braucht Dir zwee VPS. Déi éischt wäert d'Späichere sinn (de Repository op deem d'Backups gespäichert ginn), an déi zweet, tatsächlech, de Server selwer mat Postgres (a mengem Fall, Versioun 11 vu Postgres).

Et gëtt ugeholl datt um Server mat postgres Dir root hutt, sudo Benotzer, postgres Benotzer an postgres selwer installéiert ass (de Postgres Benotzer gëtt automatesch erstallt wann Dir Postgresql installéiert), an um Repository Server gëtt et root an sudo Benotzer (am Handbuch). de Benotzernumm pgbackrest gëtt benotzt).

Fir datt Dir manner Probleemer hutt wann Dir d'Instruktioune reproduzéieren, schreiwen ech Kursiv wou, mat wéi engem Benotzer a mat wéi enge Rechter hunn ech de Kommando ausgefouert beim Schreiwen an Iwwerpréiwung vum Artikel.

Installatioun pgbackrest

Repository (Benotzer pgbackrest):

1. Luet den Archiv vum pgbackrest erof a transferéiert säin Inhalt an den / Build Dossier:

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

2. Installéiert d'Ofhängegkeeten noutwendeg fir d'Versammlung:

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

3. Assemblée pgbackrest:

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

4. Kopéiert déi ausführbar Datei an den /usr/bin Verzeichnis:

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

5. Pgbackrest verlaangt perl. Installéieren:

sudo apt-get install perl

6. Erstellt Verzeichnisser fir Logbicher, gitt hinnen gewësse Rechter:

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. Check:

pgbackrest version

Postgres Server (sudo Benotzer oder Root):

De Prozess fir pgbackrest op engem Server mat Postgres z'installéieren ass ähnlech wéi den Installatiounsprozess am Repository (jo, pgbackrest muss op béide Server installéiert ginn), awer am 6. Abschnitt déi zweet a lescht Kommandoen:

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

ersetzen mat:

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

Interaktioun tëscht Serveren iwwer Passwuertlos SSH opsetzen

Fir datt pgbackrest korrekt funktionnéiert, ass et néideg d'Interaktioun tëscht dem Postgres Server an dem Repository mat der Schlësseldatei ze konfiguréieren.

Repository (Benotzer pgbackrest):

Erstellt e Schlësselpaar:

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

Opgepasst weg! Mir lafen déi uewe genannte Kommandoen ouni sudo.

Postgres Server (sudo Benotzer oder Root):

Erstellt e Schlësselpaar:

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 ""

Repository (sudo Benotzer):

Kopéiert den ëffentleche Schlëssel vum Postgres Server op de Repository Server:

(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

Op dësem Schrëtt wäert Dir fir d'Passwuert fir de Root Benotzer gefrot ginn. Dir musst d'Passwuert vum Root Benotzer vum Postgres Server aginn!

Postgres Server (sudo Benotzer):

Kopéiert de Repository ëffentleche Schlëssel op de Server mat 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

Op dësem Schrëtt wäert Dir fir d'Passwuert fir de Root Benotzer gefrot ginn. Dir musst genau d'Passwuert vum Root Benotzer vum Repository aginn!

Mir iwwerpréiwen:

Repository (root Benotzer, fir d'Rengheet vum Experiment):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres Server (root Benotzer, fir d'Rengheet vum Experiment):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Mir suergen dofir datt mir Zougang ouni Probleemer kréien.

Astelle vun engem Postgres Server

Postgres Server (sudo Benotzer oder Root):

1. Loosst eis op de Postgres Server vun externen IPen klappen. Fir dëst ze maachen, ännert d'Datei postgresql.conf (am /etc/postgresql/11/main Dossier läit), füügt d'Linn derbäi:

listen_addresses = '*'

Wann esou eng Linn schonn existéiert, entweder decommentéiert se oder setzt de Parameterwäert als '*'.

Am Dossier pg_hba.conf (och am Dossier läit /etc/postgresql/11/main) füügt déi folgend Zeilen derbäi:

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

wou:

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

2. Loosst eis déi néideg Astellunge maachen an postgresql.conf (et ass am Dossier /etc/postgresql/11/main) fir pgbackrest ze schaffen:

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

3. Loosst eis déi néideg Astellungen an der pgbackrest Konfiguratiounsdatei maachen (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Reload postgresql:

sudo service postgresql restart

Astellung vun engem Repository Server

Repository (pgbackrest Benotzer):

Loosst eis déi néideg Astellungen an der Konfiguratiounsdatei maachen pg Récksäit
(/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

E Repository erstellen

Repository (pgbackrest Benotzer):

Erstellt eng nei Späichere fir de Cluster Haaptstrooss:

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

Inspektioun

Postgres Server (sudo Benotzer oder Root):

Mir kontrolléieren op de Postgres Server:

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

Repository (pgbackrest Benotzer):

Mir kontrolléieren op de Repository Server:

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

Mir suergen dofir datt mir an der Ausgab d'Linn gesinn "Kontroll Kommando Enn: erfollegräich ofgeschloss".

Midd? Loosst eis op den interessantsten Deel goen.

E Backup maachen

Repository (pgbackrest Benotzer):

1. Maacht e Backup:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Vergewëssert Iech datt e Backup erstallt gouf:

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

Pgbackrest wäert den éischte komplette Backup erstellen. Wann Dir wëllt, kënnt Dir de Backupkommando nach eng Kéier ausféieren an sécherstellen datt de System en inkrementelle Backup erstellt.

Wann Dir nach eng Kéier e komplette Backup wëllt maachen, gitt dann en zousätzleche Fändel un:

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

Wann Dir detailléiert Konsoloutput wëllt, da spezifizéiert och:

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

E Backup restauréieren

Postgres Server (sudo Benotzer oder Root):

1. Stop de lafende Cluster:

sudo pg_ctlcluster 11 main stop

2. Restauréieren vum Backup:

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

Чтобы восстановить базу в состояние последнего ПОЛНОГО бэкапа используйте команду без указания recovery_target:

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

Важно! После восстановления может оказаться так, что база зависнет в режиме восстановления (будут ошибки в духе ERROR: cannot execute DROP DATABASE in a read-only transaction). Честно говоря, я еще не понял, с чем это связано. Решается следующим образом (нужно будет малость подождать после исполнения команды):

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

На самом деле, есть возможность восстановить конкретный бэкап по его имени. Здесь я лишь укажу ссылку на описание данной фичи в документации. Разработчики советуют использовать данный параметр с осторожностью и объясняют почему. От себя могу добавить, что я его использовал. Если очень нужно — убедитесь, что после восстановления база вышла из recovery mode (select pg_is_in_recovery() должен показать «f») и на всякий случай сделайте полный бэкап после восстановления.

3. Start de Cluster:

sudo pg_ctlcluster 11 main start

Nodeems mir de Backup restauréiert hunn, musse mir en zweete Backup maachen:

Repository (pgbackrest Benotzer):

sudo pgbackrest --stanza=main backup

Dat ass alles. Als Ofschloss wëll ech Iech drun erënneren, datt ech op kee Fall probéieren, mech als Senior dba ze maachen an d'Wolleken bei der geringster Geleeënheet notzen. De Moment fänken ech selwer un verschidden Themen ze studéieren wéi Backup, Replikatioun, Iwwerwaachung, asw. an ech schreiwen kleng Berichter iwwer d'Resultater fir e klenge Bäitrag zu der Gemeinschaft ze maachen a kleng Cheat Sheets fir mech ze loossen.

An den folgenden Artikelen probéieren ech iwwer zousätzlech Funktiounen ze schwätzen - Daten Erhuelung zu engem proppere Stärekoup, Verschlësselung vu Backups a Verëffentlechung op S3, Backups iwwer rsync.

Source: will.com

Setzt e Commentaire