Inkrementalne postgresql sigurnosne kopije sa pgbackrest-om - kurs za mlade borce od programera

Odricanje od odgovornosti

Ja sam programer. Pišem kod, komuniciram sa bazom podataka samo kao korisnik. Nikako se ne pretvaram da sam sistem administrator i, štaviše, dba. Ali…

Desilo se da sam morao da organizujem rezervnu kopiju postgresql baze podataka. Bez oblaka - čuvajte SSH i neka sve radi i ne tražite novac. Šta radimo u takvim slučajevima? Tako je, uguramo pgdump u cron, napravimo sigurnosnu kopiju svega u arhivu svaki dan, a ako se potpuno raziđemo, šaljemo ovu arhivu negdje daleko.

Ovoga puta poteškoća je bila u tome što je, prema planovima, baza podataka trebala rasti za oko + - 100 MB dnevno. Naravno, nakon nekoliko sedmica, želja da se sve napravi backup pomoću pgdump-a će nestati. Ovdje inkrementalne sigurnosne kopije dobro dolaze.

Zanimljivo? Dobrodošli pod mačku.

Inkrementalna sigurnosna kopija je vrsta sigurnosne kopije kada se ne kopiraju svi izvorni fajlovi, već samo novi i promijenjeni od kada je prethodna kopija kreirana.

Kao i svaki programer koji POTPUNO nije bio voljan (u to vrijeme) da razumije zamršenosti postgresa, želio sam pronaći zeleno dugme. Pa, znate, kao u AWS-u, DigitalOcean: pritisnuo sam jedno dugme - dobio sam replikaciju, pritisnuo drugo - postavio sam rezervne kopije, treće - sve se vratilo pre par sati. Nisam našao dugme i prelep GUI alat. Ako znate neku (besplatnu ili jeftinu) - pišite o tome u komentarima.

Guglajući pronašao sam dva alata pgbarman и pgbackrest. Sa prvim jednostavno nisam uspio (jako loša dokumentacija, pokušavao sam sve pokupiti po starim priručnicima), ali se druga dokumentacija pokazala na nivou, ali ne bez greške. Da bi se pojednostavio rad onima koji se suočavaju sa sličnim zadatkom, napisan je ovaj članak.

Nakon čitanja ovog članka, naučit ćete kako napraviti inkrementalne sigurnosne kopije, spremiti ih na udaljeni server (spremište sa rezervnim kopijama) i vratiti ih u slučaju gubitka podataka ili drugih problema na glavnom serveru.

Trening

Trebat će vam dva VPS za igranje priručnika. Prvo će biti spremište (spremište na kojem će biti rezervne kopije), a drugo, u stvari, sam server sa postgresom (u mom slučaju verzija 11 postgresa).

Pretpostavlja se da na serveru sa postgresom imate instalirane root, sudo korisnika, postgres korisnika i sam postgres (postgres korisnik se kreira automatski prilikom instalacije postgresql-a), a na serveru repozitorija imate root i sudo korisnika (koristiće se korisničko ime pgbackrest u priručniku).

Da biste imali manje problema pri reprodukciji uputstava - pišem kurzivom gdje, sa kojim korisnikom i sa kojim pravima sam izvršio naredbu dok pišete i pregledate članak.

pgbackrest instalacija

Spremište (pgbackrest korisnik):

1. Preuzmite arhivu sa pgbackrest-a i prenesite njen sadržaj u /build folder:

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

2. Instalirajte zavisnosti potrebne za sklop:

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

3. Prikupljamo pgbackrest:

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

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

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

5. Pgbackrest zahtijeva perl. Instaliraj:

sudo apt-get install perl

6. Kreirajte direktorije za dnevnike, dajte 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. Provjerite:

pgbackrest version

Postgres server (sudo korisnik ili root):

Proces instaliranja pgbackrest-a na postgres server je sličan instalaciji u spremište (da, pgbackrest mora biti instaliran na oba servera), ali u 6. paragrafu, druga i posljednja naredba:

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

zamijeni sa:

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

Postavljanje komunikacije između servera putem SSH bez lozinke

Da bi pgbackrest ispravno radio, potrebno je konfigurirati interakciju između postgres servera i spremišta koristeći ključnu datoteku.

Spremište (pgbackrest korisnik):

Napravite par ključeva:

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

Oprez Gore navedene naredbe se izvršavaju bez sudo.

Postgres server (sudo korisnik ili root):

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

Repozitorijum (sudo korisnik):

Kopirajte javni ključ postgres servera na server spremišta:

(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

U ovom koraku će tražiti lozinku od root korisnika. Potrebno je da unesete tačno lozinku root korisnika postgres servera!

Postgres server (sudo korisnik):

Kopirajte javni ključ spremišta na server sa postgresom:

(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

U ovom koraku će tražiti lozinku od root korisnika. Morate unijeti lozinku root korisnika spremišta!

Provjeravamo:

Repozitorijum (root korisnik, radi čistoće eksperimenta):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres server (root korisnik, radi čistoće eksperimenta):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Osiguravamo pristup bez problema.

Postavljanje postgres servera

Postgres server (sudo korisnik ili root):

1. Dozvolimo "kucanje" na postgres server sa eksternog IP-a. Da biste to učinili, uredite datoteku postgresql.conf (nalazi se u /etc/postgresql/11/main folderu) dodavanjem sljedećeg reda u njega:

listen_addresses = '*'

Ako takva linija već postoji, ili je dekomentirajte ili postavite vrijednost parametra na '*'.

U fajlu pg_hba.conf (takođe se nalazi u folderu /etc/postgresql/11/main) dodajte sljedeće redove:

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

gde:

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

2. Napravimo potrebna podešavanja u postgresql.conf (nalazi se u fascikli /etc/postgresql/11/main) da pgbackrest radi:

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

3. Napravite potrebna podešavanja u konfiguracionoj datoteci pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Ponovo pokrenite postgresql:

sudo service postgresql restart

Postavljanje servera spremišta

Spremište (pgbackrest korisnik):

Napravite potrebna podešavanja u konfiguracionoj datoteci 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

Napravite trezor

Spremište (pgbackrest korisnik):

Kreirajte novu pohranu za klaster glavni:

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

inspekcija

Postgres server (sudo korisnik ili root):

Provjerite na postgres serveru:

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

Spremište (pgbackrest korisnik):

Provjerite na serveru spremišta:

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

Uvjeravamo se da u izlazu vidimo red "check command end: completed successfully".

Umoran? Pređimo na najzanimljivije.

Pravljenje rezervne kopije

Spremište (pgbackrest korisnik):

1. Napravite sigurnosnu kopiju:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Uvjeravamo se da je sigurnosna kopija kreirana:

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

pgbackrest će kreirati prvu potpunu sigurnosnu kopiju. Ako želite, možete ponovo pokrenuti naredbu sigurnosne kopije i osigurati da sistem kreira inkrementalnu sigurnosnu kopiju.

Ako želite ponovo napraviti potpunu sigurnosnu kopiju, navedite dodatnu zastavicu:

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

Ako želite detaljan izlaz konzole, tada također navedite:

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

Vraćanje rezervne kopije

Postgres server (sudo korisnik ili root):

1. Zaustavite pokrenuti klaster:

sudo pg_ctlcluster 11 main stop

2. Vraćanje iz sigurnosne kopije:

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

Da vratite bazu podataka u stanje zadnje PUNE sigurnosne kopije, koristite naredbu bez navođenja recovery_target:

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

Bitan! Nakon oporavka, može se dogoditi da se baza podataka zaglavi u načinu oporavka (pojaviće se greške poput GREŠKA: ne može se izvršiti DROP DATABASE u transakciji samo za čitanje). Da budem iskren, još nisam shvatio sa čime je to povezano. Rješenje je sljedeće (morat ćete pričekati malo nakon što se naredba izvrši):

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

U stvari, moguće je vratiti određenu sigurnosnu kopiju po njenom imenu. Evo me samo Navest ću vezu do opisa ove funkcije u dokumentaciji. Programeri savjetuju korištenje ove opcije s oprezom i objašnjavaju zašto. Od sebe mogu dodati da sam ga koristio. Ako zaista trebate, uvjerite se da nakon oporavka baza podataka izađe iz načina oporavka (odaberite pg_is_in_recovery() treba da prikaže “f”) i, za svaki slučaj, napravite potpunu sigurnosnu kopiju nakon oporavka.

3. Pokrenite klaster:

sudo pg_ctlcluster 11 main start

Nakon vraćanja sigurnosne kopije, moramo izvršiti drugu sigurnosnu kopiju:

Spremište (pgbackrest korisnik):

sudo pgbackrest --stanza=main backup

To je sve. U zaključku, želim da vas podsjetim da nipošto ne pokušavam da se pretvaram da sam viši dba i da ću iskoristiti oblake u najmanjoj prilici. Trenutno i sam počinjem proučavati razne teme kao što su sigurnosna kopija, replikacija, nadzor, itd. i pišem male izvještaje o rezultatima kako bih dao mali doprinos zajednici i ostavio male varalice za sebe.

U sljedećim člancima pokušat ću govoriti o dodatnim mogućnostima - vraćanju podataka u čistu klaster, šifriranju sigurnosnih kopija i objavljivanju na S3, sigurnosnoj kopiji putem rsync-a.

izvor: www.habr.com

Dodajte komentar