Inkrementalni backupi postgresql s pgbackrest — uvod za programere

Omejitev odgovornosti

Ja sam programer. Pišem kod, a sa bazom podataka stupam u kontakt samo kao korisnik. Ni u kojem slučaju ne pretendujem na poziciju sistemskog administratora, a kamoli DBA. Ali…

Ispostavilo se da je bilo potrebno organizovati rezervno kopiranje postgresql baze podataka. Bez oblaka — zadrži SSH i postavi da sve funkcioniše bez dodatnih troškova. Šta radimo u ovakvim situacijama? Tako je, ubacujemo pgdump u cron i svakog dana radimo backup u arhivu, a ako se sve raspadne — šaljemo tu arhivu negde daleko.

Ovog puta komplikacija je bila u tome što je prema planovima baza trebala rasti otprilike za +- 100 MB dnevno. Naravno, već posle nekoliko nedelja želja za bekapovanjem svih podataka pgdump-om će nestati. Tada na scenu stupa inkrementalno bekapiranje.

Zanimljivo? Dobrodošli ispod haube.

Inkrementalni backup je vrsta rezervne kopije gde se ne kopiraju svi fajlovi izvora, već samo novi i izmenjeni od trenutka kreiranja prethodne kopije.

Kao i svaki programer, KOJI NI U KOM SLUČAJU nije želeo (u tom trenutku) da se upušta u suptilnosti postgresa, želeo sam da nađem zelenu dugmad. Znate, kao u AWS-u, DigitalOcenu: pritisnuo jedno dugme — dobio replikaciju, pritisnuo drugo — postavio bekape, treće — sve vratio nazad na par sati. Nije bilo dugmadi niti lepog GUI alata kojeg sam mogao naći. Ako znate neki takav (besplatan ili jeftin) — napišite o tome u komentarima.

Pretražujući internet, našao sam dva alata pgbarman in pgbackrest. Sa prvim nisam imao sreće (veoma oskudna dokumentacija, pokušavao sam da sve podignem po starim uputstvima), dok je kod drugog dokumentacija bila pristojnog nivoa, ali nije bila ni bez mana. Kako bih olakšao rad onima koji se sretnu sa sličnim izazovima, napisao sam ovaj članak.

Po završetku ovog članka naučićete kako da radite inkrementalne bekape, čuvate ih na udaljenom serveru (repositoriju sa bekapima) i kako ih obnavljati u slučaju gubitka podataka ili drugih problema na glavnom serveru.

Priprava

Za reprodukciju uputstva biće vam potrebna dva VPS-a. Prvi će biti skladište (repozitorijum na kojem će se nalaziti bekapi), a drugi, zapravo, sam server sa postgresom (u mom slučaju verzija 11 postgres).

Obrazilo se, da na serverju s postgres imate root, sudo uporabnika, uporabnika postgres in da je sam postgres nameščen (uporabnik postgres se ustvari avtomatsko ob namestitvi postgresql), na repozitorijskem strežniku pa imate root in sudo uporabnika (v priročniku se bo uporabljalo ime uporabnika pgbackrest).

Da boste imeli manj težav pri izvajanju navodil — v ležečem tisku bom zapisoval kje, s katerim uporabnikom in s kakšnimi pravicami sem izvajal ukaz med pisanjem in preverjanjem članka.

Namestitev pgbackrest

Repozitorij (uporabnik pgbackrest):

1. Prenesite arhiv s pgbackrest in prenesite vsebino v mapo /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. Namestite potrebne odvisnosti za gradnjo:

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

3. Zgradite pgbackrest:

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

4. Kopirajte izvršno datoteko v direktorij /usr/bin:

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

5. Pgbackrest zahteva prisotnost perla. Namestite:

sudo apt-get install perl

6. Ustvarite mape za dnevnike, dodelite jim določena dovoljenja:

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

pgbackrest verzija

Postgres strežnik (sudo uporabnik ali root):

Postopek namestitve pgbackrest na strežniku s postgres je podoben postopku namestitve na repozitoriju (da, pgbackrest mora biti nameščen na obeh strežnikih), v 6. točki pa zamenjajte drugi in zadnji ukaz:

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

z:

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

Nastavitev povezave med strežniki preko SSH brez gesla

Da pgbackrest pravilno deluje, je potrebno nastaviti povezavo med postgres strežnikom in repozitorijem preko ključne datoteke.

Repozitorij (uporabnik pgbackrest):

Ustvarite par ključev:

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

Pozor! Zgornje ukaze izvajamo brez sudo.

Postgres strežnik (sudo uporabnik ali root):

Ustvarite par ključev:

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

Repozitorij (sudo uporabnik):

Kopirajte javni ključ postgres strežnika na strežnik-repozitorij:

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

Na tej etapa poprosí o heslo uživatele root. Je třeba zadat právě heslo uživatele root postgres serveru!

Postgres server (sudo uživatel):

Kopírujeme veřejný klíč repozitáře na server s postgres:

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

Na tej etapa poprosí o heslo uživatele root. Je třeba zadat právě heslo uživatele root repozitáře!

Preverimo:

Repozitář (root uživatel, pro čistotu experimentu):

sudo -u pgbackrest ssh postgres@

Postgres server (root uživatel, pro čistotu experimentu):

sudo -u postgres ssh pgbackrest@

Ujistíme se, že bez problémů získáváme přístup.

Nastavení postgres serveru

Postgres strežnik (sudo uporabnik ali root):

1. Umožníme „stouchat“ na postgres server z externích IP. K tomu upravíme soubor postgresql.conf (nachází se ve složce /etc/postgresql/11/main), přidáním této řádky:

listen_addresses = '*'

Pokud taková řádka již existuje — buď ji odkomentujte, nebo nastavte hodnotu parametru na ‘*’.

V datoteki pg_hba.conf (také se nachází ve složce /etc/postgresql/11/main) přidáme následující řádky:

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

kde:

hostssl/host - připojujeme se přes SSL (nebo ne)
all - povolujeme připojení ke všem databázím
all - jméno uživatele, kterému povolujeme připojení (všem)
0.0.0.0/0 - maska sítě, ze které lze připojovat
md5 - způsob šifrování hesla

2. Provedeme potřebná nastavení v postgresql.conf (nachází se ve složce /etc/postgresql/11/main) pro fungování pgbackrest:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Kde main je název clusteru. Při instalaci postgres automaticky vytvoří cluster main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Provedeme potřebná nastavení v konfiguračním souboru pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

[global]
log-level-file=detail
repo1-host=

4. Restartujeme postgresql:

sudo service postgresql restart

Nastavení serveru-repozitáře

Repozitář (pgbackrest uživatel):

Provedeme potřebná nastavení v konfiguračním souboru pgbackrest
(/etc/pgbackrest/pgbackrest.conf):

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

[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # Parameter indicating how many full backups to keep. That is, if you have two full backups and you create a third one, the first two will be deleted along with their increments.
start-fast=y # Starts the backup immediately, you can read about this parameter here https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Создание хранилища

Repozitář (pgbackrest uživatel):

Создаем новое хранилище для кластера main:

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

Проверка

Postgres strežnik (sudo uporabnik ali root):

Проверяем на postgres сервере:

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

Repozitář (pgbackrest uživatel):

Проверяем на сервере-репозитории:

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

Убеждаемся, что в выводе видим строку «check command end: completed successfully».

Устали? Переходим к самому интересному.

Делаем бэкап

Repozitář (pgbackrest uživatel):

1. Выполняем резервное копирование:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Убеждаемся, что бэкап был создан:

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

Pgbackrest создаст первый полный бэкап. При желании вы можете запустить команду бэкапа повторно и убедиться, что система создаст инкрементальный бэкап.

Если вы хотите повторно сделать полный бэкап, то укажите дополнительный флаг:

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

Если вы хотите подробный вывод в консоль, то также укажите:

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

Восстанавливаем бэкап

Postgres strežnik (sudo uporabnik ali root):

1. Останавливаем работающий кластер:

sudo pg_ctlcluster 11 main stop

2. Восстанавливаемся из бэкапа:

sudo -u postgres pgbackrest --stanza=main --delta restore

3. Запускаем кластер:

sudo pg_ctlcluster 11 main start

После восстановления бэкапа нам необходимо выполнить повторный бэкап:

Repozitář (pgbackrest uživatel):

sudo pgbackrest --stanza=main backup

На этом все. В заключение хочу напомнить, что я ни в коем случае не пытаюсь строить из себя senior dba и при малейшей возможности буду использовать облака. В настоящее время сам начинаю изучать различные темы вроде резервного копирования, репликаций, мониторинга и т.п. и о результатах пишу небольшие отчеты, дабы сделать небольшой вклад в сообщество и оставить для себя небольшие шпаргалки.

В следующих статьях постараюсь рассказать о дополнительных фичах — восстановление данных на чистый кластер, шифрование бэкапов и публикацию на S3, бэкапы через rsync.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster