Inkrementalne sigurnosne kopije PostgreSQL s pgbackrest — školica za početnike od programera

Odricanje

Ja sam programer. Pišem kod, a s bazom podataka komuniciram samo kao korisnik. Nipošto ne pretendiram na poziciju sistemskog administratora, a pogotovo dba. No...

Dogodilo se da sam trebao organizirati backup postgresql baze podataka. Nema oblaka - koristi SSH i postavi da sve radi bez troškova. Što radimo u takvim slučajevima? Pravo, stavljamo pgdump u cron, svakodnevno radimo backup svega u arhiv i ako potpuno zakažemo - šaljemo tu arhivu negdje daleko.

Ovaj put složenost je bila u tome što je prema planovima baza trebala rasti otprilike za +- 100 MB dnevno. Naravno, već nakon nekoliko tjedana želja za backupiranjem svega pgdumpom će nestati. Tu na pomoć dolaze inkrementalni backupi.

Zanima te? Dobrodošao ispod.

Inkrementalni backup je vrsta rezervne kopije, kada se ne kopiraju svi datoteke iz izvora, nego samo nove i izmijenjene od trenutka kreiranja prethodne kopije.

Kao i svaki programer, POTPUNO nevoljan (u tom trenutku) da se upušta u dubine postgres-a, želio sam pronaći zeleno dugme. Pa, znate, kao u AWS, DigitalOcean: pritisneš jedno dugme - dobiješ replikaciju, pritisneš drugo - postaviš backup, treće - sve vratiš par sati unazad. Dugmadi i lijepog GUI alata nisam pronašao. Ako znate takav (besplatan ili jeftin) - molim vas da to napišete u komentarima.

Pretražujući internet, našao sam dva alata pgbarman i pgbackrest. S prvim nisam imao sreće (veoma oskudna dokumentacija, pokušavao sam sve postaviti prema starim priručnicima), ali kod drugog se dokumentacija pokazala na nivou, ali nije bila bez nedostataka. Kako bih olakšao rad onima koji će se susresti sličnim zadatkom, napisana je ova članak.

Kada završite čitanje ovog članka, naučit ćete kako raditi inkrementalne backup-e, čuvati ih na udaljenom poslužitelju (repozitoriju s backup-ima) i obnavljati ih u slučaju gubitka podataka ili drugih problema na glavnom poslužitelju.

Priprema

Za reprodukciju ovog priručnika trebat će vam dva VPS-a. Prvi će biti skladište (repozitorij, na kojem će se nalaziti backup-i), a drugi, zapravo, sam poslužitelj s postgres-om (u mom slučaju verzija 11 postgres-a).

Pretpostavlja se da na serveru s postgres imate root, sudo korisnika, korisnika postgres i da je sam postgres instaliran (korisnik postgres se automatski stvara prilikom instalacije postgresql), a na serveru-repozitoriju imate root i sudo korisnika (u priručniku će se koristiti ime korisnika pgbackrest).

Da biste imali manje problema prilikom reprodukcije upute — kurzivom ću napisati gdje, kojim korisnikom i s kojim pravima sam izvršio naredbu tijekom pisanja i provjere članka.

Instalacija pgbackrest

Repozitorij (korisnik pgbackrest):

1. Preuzimamo arhivu s pgbackrest i premještamo njezin sadržaj u mapu /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. Instaliramo potrebne ovisnosti za izgradnju:

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

3. Gradimo pgbackrest:

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

4. Kopiramo izvršnu datoteku u direktorij /usr/bin:

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

5. Pgbackrest zahtijeva prisutnost perla. Instaliramo:

sudo apt-get install perl

6. Kreiramo direktorije za logove, dajemo im određena prava:

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

pgbackrest verzija

Postgres server (sudo korisnik ili root):

Proces instalacije pgbackrest na serveru s postgres sličan je procesu instalacije na repozitoriju (da, pgbackrest treba biti instaliran na oba servera), ali u 6. točki zamjenjujemo drugu i posljednju naredbu:

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

s sljedećim:

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

Postavka interakcije između servera putem SSH bez lozinke

Da bi pgbackrest ispravno radio, potrebno je postaviti interakciju između postgres servera i repozitorija putem ključa.

Repozitorij (korisnik pgbackrest):

Kreiramo par ključeva:

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

Pažnja! Navedene naredbe izvodimo bez sudo.

Postgres server (sudo korisnik ili root):

Kreiramo par ključeva:

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 korisnik):

Kopiramo javni ključ postgres servera na server-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

U ovom koraku tražit će se lozinka root korisnika. Treba unijeti točno lozinku root korisnika postgres poslužitelja!

Postgres poslužitelj (sudo korisnik):

Kopiramo javni ključ repozitorija na poslužitelj 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

U ovom koraku tražit će se lozinka root korisnika. Treba unijeti točno lozinku root korisnika repozitorija!

Provjeravamo:

Repozitorij (root korisnik, za čistoću eksperimenta):

sudo -u pgbackrest ssh postgres@

Postgres poslužitelj (root korisnik, za čistoću eksperimenta):

sudo -u postgres ssh pgbackrest@

Provjeravamo da li možemo bez problema pristupiti.

Postavljanje postgres poslužitelja

Postgres server (sudo korisnik ili root):

1. Dopustit ćemo pristup postgres poslužitelju s vanjskih IP adresa. U tu svrhu uredite datoteku postgresql.conf (nalazi se u direktoriju /etc/postgresql/11/main), dodajući redak:

listen_addresses = '*'

Ako takav redak već postoji — ili otkomentirajte ga, ili postavite vrijednost parametra na '*' .

U datoteci pg_hba.conf (također se nalazi u direktoriju /etc/postgresql/11/main) dodajemo sljedeće retke:

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

gdje:

hostssl/host - povezujemo se preko SSL (ili ne)
all - dopuštamo povezivanje sa svim bazama
all - ime korisnika kojem dopuštamo povezivanje (svima)
0.0.0.0/0 - mrežna maska s kojom se može povezivati
md5 - način enkripcije lozinke

2. Izvršit ćemo potrebne postavke u postgresql.conf (nalazi se u direktoriju /etc/postgresql/11/main) za rad pgbackrest:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Gdje main - naziv klastera. Prilikom instalacije postgres automatski kreira klaster main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Izvršit ćemo potrebne postavke u datoteci konfiguracije pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Ponovno pokrećemo postgresql:

sudo service postgresql restart

Postavljanje poslužitelja-repozitorija

Repozitorij (pgbackrest korisnik):

Izvršit ćemo potrebne postavke u datoteci konfiguracije 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 # Parametar koji označava koliko potpuno sigurnosno kopija treba čuvati. Odnosno, ako imate dva potpuna sigurnosna kopija i kreirate treću - prva dva će biti izbrisana zajedno s inkrementima.
start-fast=y # Odmah započinje sigurnosno kopiranje, više informacija o ovom parametru možete pročitati ovdje https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Kreiranje spremišta

Repozitorij (pgbackrest korisnik):

Kreiramo novo spremište za klaster main:

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

Provjera

Postgres server (sudo korisnik ili root):

Provjeravamo na postgres serveru:

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

Repozitorij (pgbackrest korisnik):

Provjeravamo na repozitoriju:

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

Osiguravamo se da u ispisu vidimo redak «check command end: completed successfully».

Umorni? Idemo na najzanimljiviju stvar.

Radimo sigurnosnu kopiju

Repozitorij (pgbackrest korisnik):

1. Izvršavamo sigurnosno kopiranje:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Osiguravamo se da je sigurnosna kopija napravljena:

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

Pgbackrest će kreirati prvu punu sigurnosnu kopiju. Po želji, možete ponovo pokrenuti komandu za sigurnosnu kopiju i uvjeriti se da će sistem kreirati inkrementalnu sigurnosnu kopiju.

Ako želite ponovo napraviti punu sigurnosnu kopiju, navedite dodatni flag:

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

Ako želite detaljan ispis na konzoli, također navedite:

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

Obnavljanje sigurnosne kopije

Postgres server (sudo korisnik ili root):

1. Zaustavljamo radni klaster:

sudo pg_ctlcluster 11 main stop

2. Obnavljamo se iz sigurnosne kopije:

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

3. Pokrećemo klaster:

sudo pg_ctlcluster 11 main start

Nakon obnavljanja sigurnosne kopije, potrebno je ponovo napraviti sigurnosnu kopiju:

Repozitorij (pgbackrest korisnik):

sudo pgbackrest --stanza=main backup

Na tome je kraj. Na kraju, želim napomenuti da se ni u kom slučaju ne pokušavam predstaviti kao senior dba i prilikom svake prilike ću koristiti oblake. Trenutno počinjem istraživati različite teme poput sigurnosnog kopiranja, replikacije, monitornja itd., a o rezultatima pišem male izvještaje kako bih doprinio zajednici i ostavio sebi male bilješke.

U sljedećim člancima pokušat ću govoriti o dodatnim funkcijama — obnavljanje podataka na čisti klaster, šifriranje sigurnosnih kopija i objavljivanje na S3, sigurnosne kopije putem rsync.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster