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