Inkrementalne postgresql sigurnosne kopije s pgbackrest - tečaj za mladog borca ​​od programera

Odricanje

Ja sam programer. Pišem kod i komuniciram s bazom podataka samo kao korisnik. Ni u kojem slučaju se ne pretvaram da sam administrator sustava, a kamoli dba. Ali…

Dogodilo se da sam trebao organizirati sigurnosnu kopiju postgresql baze podataka. Nema oblaka - samo koristite SSH i pobrinite se da sve radi bez traženja novca. Što činimo u takvim slučajevima? Tako je, gurnemo pgdump u cron, svaki dan napravimo sigurnosnu kopiju svega u arhivu, a ako smo potpuno izgubljeni, pošaljemo ovu arhivu negdje daleko.

Ovaj put je poteškoća bila što je prema planovima baza podataka trebala rasti za oko +- 100 MB dnevno. Naravno, nakon nekoliko tjedana želja za backupom svega s pgdumpom će nestati. Ovdje u pomoć dolaze inkrementalne sigurnosne kopije.

Zanimljiv? Dobrodošli u mačku.

Inkrementalna sigurnosna kopija je vrsta sigurnosne kopije kada se ne kopiraju sve izvorne datoteke, već samo nove i one koje su promijenjene od stvaranja prethodne kopije.

Kao i svaki programer koji nije bio APSOLUTNO voljan (u to vrijeme) razumjeti zamršenost postgresa, želio sam pronaći zeleni gumb. Pa, znate, kao u AWS-u, DigitalOcean: pritisnete jedan gumb - dobili ste replikaciju, pritisnete drugi - postavite sigurnosne kopije, treći - vratite sve unazad nekoliko sati. Nisam pronašao gumb ili prekrasan GUI alat. Ako znate neku (besplatnu ili jeftinu), napišite o njoj u komentarima.

Nakon guglanja pronašao sam dva alata pgbarman и pgnaslon za leđa. S prvim jednostavno nisam uspio (vrlo oskudna dokumentacija, pokušavao sam sve skužiti po starim priručnicima), ali s drugim je dokumentacija ispala na razini, ali ne i bez mana. Kako bismo pojednostavili 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 poslužitelj (repozitorij sa sigurnosnim kopijama) i vratiti ih u slučaju gubitka podataka ili drugih problema na glavnom poslužitelju.

Trening

Za reprodukciju priručnika trebat će vam dva VPS-a. Prvi će biti skladište (repozitorij na kojem će se čuvati sigurnosne kopije), a drugi, zapravo, sam server s postgresom (u mom slučaju verzija 11 postgresa).

Pretpostavlja se da na poslužitelju s postgresom imate root, sudo korisnika, postgres korisnika i sam postgres je instaliran (postgres korisnik se kreira automatski prilikom instalacije postgresqla), a na poslužitelju repozitorija postoji root i sudo korisnik (u priručniku koristit će se korisničko ime pgbackrest) .

Kako biste imali manje problema prilikom reprodukcije uputa, pišem kurzivom gdje, s kojim korisnikom i s kojim pravima sam izvršio naredbu tijekom pisanja i provjere članka.

Ugradnja pgnaslona

Spremište (korisnik pgbackrest):

1. Preuzmite arhivu s pgbackrest i prenesite 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. Instalirajte ovisnosti potrebne za sastavljanje:

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

3. Sastavljanje naslona za leđa:

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 direktorij /usr/bin:

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

5. Naslon za leđa zahtijeva perl. Instalirati:

sudo apt-get install perl

6. Napravite direktorije za zapisnike, 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 poslužitelj (sudo korisnik ili root):

Proces instaliranja pgbackresta na poslužitelj s postgresom sličan je procesu instalacije na repozitorij (da, pgbackrest mora biti instaliran na oba poslužitelja), ali u 6. paragrafu druga i zadnja naredba:

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

zamijeniti s:

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

Postavljanje interakcije između poslužitelja putem SSH-a bez lozinke

Kako bi pgbackrest ispravno radio, potrebno je konfigurirati interakciju između postgres poslužitelja i repozitorija pomoću datoteke ključa.

Spremište (korisnik pgbackrest):

Stvorite par ključeva:

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

Upozorenje! Gornje naredbe izvodimo bez sudo-a.

Postgres poslužitelj (sudo korisnik ili root):

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

Kopirajte javni ključ postgres poslužitelja na poslužitelj 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 od vas će se tražiti lozinka za root korisnika. Morate unijeti lozinku root korisnika postgres poslužitelja!

Postgres poslužitelj (sudo korisnik):

Kopirajte javni ključ repozitorija na poslužitelj s 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 od vas će se tražiti lozinka za root korisnika. Morate unijeti točnu lozinku root korisnika repozitorija!

Provjeravamo:

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

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

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

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Brinemo se da imamo pristup bez problema.

Postavljanje postgres poslužitelja

Postgres poslužitelj (sudo korisnik ili root):

1. Dopustimo kucanje na postgres poslužitelj s vanjskih IP adresa. Da biste to učinili, uredite datoteku postgresql.conf (nalazi se u mapi /etc/postgresql/11/main), dodajući joj redak:

listen_addresses = '*'

Ako takav redak već postoji, uklonite komentar ili postavite vrijednost parametra kao '*'.

U spisu pg_hba.conf (također se nalazi u mapi /etc/postgresql/11/main) dodajte sljedeće retke:

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

gdje je:

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

2. Napravimo potrebne postavke postgresql.conf (u mapi je /etc/postgresql/11/main) kako bi pgleđni naslon radio:

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

3. Napravimo potrebne postavke u konfiguracijskoj 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. Ponovno učitajte postgresql:

sudo service postgresql restart

Postavljanje poslužitelja repozitorija

Spremište (korisnik pgbackrest):

Napravimo potrebne postavke u konfiguracijskoj datoteci pgnaslon za leđa
(/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

Stvaranje repozitorija

Spremište (korisnik pgbackrest):

Stvorite 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

Проверка

Postgres poslužitelj (sudo korisnik ili root):

Provjeravamo na postgres poslužitelju:

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

Spremište (korisnik pgbackrest):

Provjeravamo na poslužitelju repozitorija:

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

Osiguravamo da u izlazu vidimo redak "provjeri kraj naredbe: uspješno dovršeno".

Umoran? Prijeđimo na najzanimljiviji dio.

Izrada sigurnosne kopije

Spremište (korisnik pgbackrest):

1. Napravite sigurnosnu kopiju:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Provjerite je li napravljena sigurnosna kopija:

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

Pgbackrest će stvoriti prvu punu sigurnosnu kopiju. Ako želite, možete ponovo pokrenuti naredbu sigurnosne kopije i osigurati da sustav stvara inkrementalnu sigurnosnu kopiju.

Ako želite ponovno napraviti punu sigurnosnu kopiju, navedite dodatnu oznaku:

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

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

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

Vraćanje sigurnosne kopije

Postgres poslužitelj (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

Za vraćanje baze podataka u stanje posljednje POTPUNE sigurnosne kopije, koristite naredbu bez navođenja recovery_target:

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

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

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

Zapravo, moguće je vratiti određenu sigurnosnu kopiju prema njezinom imenu. Ovdje sam samo ja Dat ću poveznicu na opis ove značajke u dokumentaciji. Programeri savjetuju da ovu opciju koristite s oprezom i objašnjavaju zašto. Od sebe mogu dodati da sam ga koristio. Ako stvarno trebate, provjerite izlazi li baza podataka nakon oporavka iz moda oporavka (odabir pg_is_in_recovery() trebao bi prikazivati ​​"f") i, za svaki slučaj, napravite punu 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 (korisnik pgbackrest):

sudo pgbackrest --stanza=main backup

To je sve. Zaključno, želio bih vas podsjetiti da se ni na koji način ne pokušavam pretvarati da sam viši dba i da ću koristiti oblake u najmanjoj prilici. Trenutno i sam počinjem proučavati razne teme kao što su backup, replikacija, nadzor itd. i pišem mala izvješća o rezultatima kako bih dao mali doprinos zajednici i ostavio male varalice za sebe.

U sljedećim člancima pokušat ću govoriti o dodatnim značajkama - oporavak podataka na čisti klaster, enkripcija sigurnosnih kopija i objavljivanje na S3, sigurnosne kopije putem rsync.

Izvor: www.habr.com

Dodajte komentar