Inkrementálne zálohy postgresql s pgbackrest - kurz pre mladého bojovníka od vývojára

Vylúčenie zodpovednosti

Som vývojár. Píšem kód a komunikujem s databázou iba ako používateľ. V žiadnom prípade nepredstieram, že som správca systému, tým menej dba. Ale…

Stalo sa, že som potreboval zorganizovať zálohu databázy postgresql. Žiadne mraky – stačí použiť SSH a uistiť sa, že všetko funguje bez pýtania peňazí. Čo robíme v takýchto prípadoch? Presne tak, pgdump natlačíme do cronu, každý deň všetko zálohujeme do archívu a ak sa úplne stratíme, pošleme tento archív niekam ďaleko.

Tentoraz problém spočíval v tom, že podľa plánov sa mala databáza rozrásť o cca +- 100 MB za deň. Samozrejme, po niekoľkých týždňoch túžba zálohovať všetko pomocou pgdump zmizne. Tu prichádzajú na pomoc prírastkové zálohy.

zaujímavé? Vitajte v mačke.

Prírastkové zálohovanie je typ zálohy, pri ktorej sa neskopírujú všetky zdrojové súbory, ale iba nové a zmenené od vytvorenia predchádzajúcej kópie.

Ako každý vývojár, ktorý bol ABSOLÚTNE neochotný (v tom čase) pochopiť zložitosť postgresu, som chcel nájsť zelené tlačidlo. No, viete, ako v AWS, DigitalOcean: stlačili ste jedno tlačidlo - máte replikáciu, stlačili ste druhé - nastavili ste zálohy, tretie - všetko ste vrátili o pár hodín späť. Nenašiel som tlačidlo ani krásny nástroj GUI. Ak nejaký poznáte (zadarmo alebo lacno), napíšte o ňom do komentárov.

Po googli som našiel dva nástroje pgbarman и pgbackrest. S prvým sa mi jednoducho nepodarilo (veľmi riedka dokumentácia, snažil som sa všetko zistiť podľa starých príručiek), ale pri druhom sa dokumentácia ukázala byť na úrovni, ale nie bez chýb. Pre zjednodušenie práce tých, ktorí stoja pred podobnou úlohou, bol napísaný tento článok.

Po prečítaní tohto článku sa naučíte robiť prírastkové zálohy, ukladať ich na vzdialený server (úložisko so zálohami) a obnovovať ich v prípade straty dát alebo iných problémov na hlavnom serveri.

Tréning

Na reprodukciu návodu budete potrebovať dva VPS. Prvým bude úložisko (úložisko, na ktorom sa budú ukladať zálohy) a druhým v skutočnosti samotný server s postgresom (v mojom prípade verzia 11 postgresu).

Predpokladá sa, že na serveri s postgresom máte root, sudo užívateľa, postgres užívateľa a samotný postgres je nainštalovaný (používateľ postgres sa vytvorí automaticky pri inštalácii postgresql) a na serveri úložiska je root a sudo užívateľ (v návode použije sa používateľské meno pgbackrest).

Aby ste mali menej problémov pri reprodukcii návodu, píšem kurzívou kde, s akým používateľom a s akými právami som príkaz vykonal pri písaní a kontrole článku.

Inštalácia opierky pgback

Úložisko (pgbackrest používateľa):

1. Stiahnite si archív z pgbackrest a preneste jeho obsah do priečinka /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. Nainštalujte závislosti potrebné na zostavenie:

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

3. Montáž opierky pgback:

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

4. Skopírujte spustiteľný súbor do adresára /usr/bin:

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

5. Pgbackrest vyžaduje perl. Inštalácia:

sudo apt-get install perl

6. Vytvorte adresáre pre protokoly, prideľte im určité práva:

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

pgbackrest version

Server Postgres (používateľ sudo alebo root):

Proces inštalácie pgbackrest na server s postgres je podobný procesu inštalácie na úložisku (áno, pgbackrest musí byť nainštalovaný na oboch serveroch), ale v šiestom odseku druhý a posledný príkaz:

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

nahradiť s:

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

Nastavenie interakcie medzi servermi cez SSH bez hesla

Aby pgbackrest fungoval správne, je potrebné nakonfigurovať interakciu medzi serverom postgres a úložiskom pomocou súboru kľúča.

Úložisko (pgbackrest používateľa):

Vytvorte pár kľúčov:

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

Varovanie! Vyššie uvedené príkazy spustíme bez sudo.

Server Postgres (používateľ sudo alebo root):

Vytvorte pár kľúčov:

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

Úložisko (používateľ sudo):

Skopírujte verejný kľúč postgres servera na server úložiska:

(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

V tomto kroku budete požiadaní o heslo používateľa root. Musíte zadať heslo používateľa root postgres servera!

Server Postgres (používateľ sudo):

Skopírujte verejný kľúč úložiska na server pomocou 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

V tomto kroku budete požiadaní o heslo používateľa root. Musíte zadať presne heslo používateľa root úložiska!

skontrolujte:

Úložisko (užívateľ root, kvôli čistote experimentu):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Server Postgres (užívateľ root, kvôli čistote experimentu):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Zabezpečujeme bezproblémový prístup.

Nastavenie postgresového servera

Server Postgres (používateľ sudo alebo root):

1. Umožnime klepanie na postgres server z externých IP. Ak to chcete urobiť, upravte súbor postgresql.conf (nachádza sa v priečinku /etc/postgresql/11/main) a pridajte doň riadok:

listen_addresses = '*'

Ak takýto riadok už existuje, odkomentujte ho alebo nastavte hodnotu parametra ako '*'.

V súbore pg_hba.conf (nachádza sa aj v priečinku /etc/postgresql/11/main) pridajte nasledujúce riadky:

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

kde:

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

2. Urobme potrebné nastavenia v postgresql.conf (je v priečinku /etc/postgresql/11/main), aby opierka pgback fungovala:

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

3. Urobme potrebné nastavenia v konfiguračnom súbore pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Znovu načítajte postgresql:

sudo service postgresql restart

Nastavenie servera úložiska

Úložisko (používateľ pgbackrest):

Urobme potrebné nastavenia v konfiguračnom súbore pgbackrest
(/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

Vytvorenie úložiska

Úložisko (používateľ pgbackrest):

Vytvorte nové úložisko pre klaster hlavné:

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

Проверка

Server Postgres (používateľ sudo alebo root):

Skontrolujeme na serveri postgres:

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

Úložisko (používateľ pgbackrest):

Skontrolujeme na serveri úložiska:

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

Ubezpečíme sa, že vo výstupe vidíme riadok „kontrola ukončenia príkazu: úspešne dokončené“.

Unavený? Prejdime k najzaujímavejšej časti.

Vytvorenie zálohy

Úložisko (používateľ pgbackrest):

1. Vykonajte zálohu:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Uistite sa, že bola vytvorená záloha:

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

Pgbackrest vytvorí prvú plnú zálohu. Ak chcete, môžete znova spustiť príkaz backup a uistiť sa, že systém vytvorí prírastkovú zálohu.

Ak chcete znova vytvoriť plnú zálohu, zadajte ďalší príznak:

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

Ak chcete podrobný výstup konzoly, zadajte tiež:

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

Obnovenie zálohy

Server Postgres (používateľ sudo alebo root):

1. Zastavte spustený klaster:

sudo pg_ctlcluster 11 main stop

2. Obnovenie zo zálohy:

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

Ak chcete obnoviť databázu do stavu poslednej FULL zálohy, použite príkaz bez zadania recovery_target:

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

Dôležité! Po obnove sa môže stať, že sa databáza zasekne v režime obnovy (budú sa vyskytovať chyby ako ERROR: nemožno spustiť DROP DATABASE v transakcii len na čítanie). Aby som bol úprimný, doteraz som nepochopil, s čím to súvisí. Riešenie je nasledovné (po vykonaní príkazu budete musieť chvíľu počkať):

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

V skutočnosti je možné obnoviť konkrétnu zálohu podľa jej názvu. Tu som len ja V dokumentácii uvediem odkaz na popis tejto funkcie. Vývojári odporúčajú používať túto možnosť opatrne a vysvetľujú prečo. Za seba môžem dodať, že som ho použil. Ak to naozaj potrebujete, uistite sa, že po obnove databáza ukončí režim obnovy (výber pg_is_in_recovery() by mal zobrazovať „f“) a pre každý prípad urobte po obnove úplnú zálohu.

3. Spustite klaster:

sudo pg_ctlcluster 11 main start

Po obnovení zálohy musíme vykonať druhú zálohu:

Úložisko (používateľ pgbackrest):

sudo pgbackrest --stanza=main backup

To je všetko. Na záver by som chcel pripomenúť, že sa v žiadnom prípade nesnažím predstierať, že som senior dba a pri najmenšej príležitosti využijem mraky. V súčasnosti sám začínam študovať rôzne témy ako zálohovanie, replikácia, monitoring atď. a píšem malé správy o výsledkoch, aby som prispel malým dielom pre komunitu a nechal som si malé hárky pre seba.

V nasledujúcich článkoch sa pokúsim rozprávať o doplnkových funkciách – obnova dát do čistého klastra, šifrovanie záloh a publikovanie do S3, zálohy cez rsync.

Zdroj: hab.com

Pridať komentár