Backup-uri postgresql incrementale cu pgbackrest - un curs pentru un tânăr luptător de la dezvoltator

Disclaimer

Sunt dezvoltator. Scriu cod și interacționez cu baza de date doar ca utilizator. În niciun caz nu mă prefac a fi un administrator de sistem, cu atât mai puțin un dba. Dar…

Sa întâmplat să am nevoie să organizez o copie de rezervă a bazei de date postgresql. Fără nori - folosește doar SSH și asigură-te că totul funcționează fără a cere bani. Ce facem în astfel de cazuri? Așa este, împingem pgdump în cron, facem backup în arhivă în fiecare zi și, dacă suntem complet pierduți, trimitem această arhivă undeva departe.

De data aceasta dificultatea a fost că, conform planurilor, baza de date trebuia să crească cu aproximativ +- 100 MB pe zi. Desigur, după câteva săptămâni, dorința de a face backup la tot cu pgdump va dispărea. Aici vin în ajutor backup-urile incrementale.

Interesant? Bun venit la pisica.

Backup-ul incremental este un tip de backup în care nu toate fișierele sursă sunt copiate, ci doar unele noi și cele modificate de la crearea copiei anterioare.

La fel ca orice dezvoltator care nu dorea ABSOLUT (la acea vreme) să înțeleagă complexitățile postgresului, am vrut să găsesc butonul verde. Ei bine, știi, ca în AWS, DigitalOcean: ai apăsat un buton - ai primit replicare, ai apăsat pe al doilea - ai configurat copii de rezervă, al treilea - ai derulat totul înapoi cu câteva ore. Nu am găsit un buton sau un instrument frumos GUI. Dacă știți unul (gratuit sau ieftin), scrieți despre el în comentarii.

După ce am căutat pe google, am găsit două instrumente pgbarman и pgbackrest. Pur și simplu nu am reușit cu primul (documentație foarte rară, am încercat să-mi dau seama totul conform manualelor vechi), dar cu cel de-al doilea documentația s-a dovedit a fi la egalitate, dar nu fără defecte. Pentru a simplifica munca celor care se confruntă cu o sarcină similară, a fost scris acest articol.

După ce ați citit acest articol, veți învăța cum să faceți copii de siguranță incrementale, să le salvați pe un server la distanță (depozit cu copii de siguranță) și să le restaurați în cazul pierderii datelor sau a altor probleme pe serverul principal.

Pregătire

Pentru a reproduce manualul veți avea nevoie de două VPS. Primul va fi stocarea (depozitul pe care vor fi stocate backup-urile), iar al doilea, de fapt, serverul însuși cu postgres (în cazul meu, versiunea 11 a postgres).

Se presupune că pe serverul cu postgres aveți root, sudo user, postgres user și postgres însuși este instalat (utilizatorul postgres este creat automat la instalarea postgresql), iar pe serverul de depozit există root și sudo user (în manual se va folosi numele de utilizator pgbackrest) .

Ca să aveți mai puține probleme la reproducerea instrucțiunilor, scriu cu caractere cursive unde, cu ce utilizator și cu ce drepturi am executat comanda în timpul scrierii și verificării articolului.

Instalarea pgbackrest

Depozitar (utilizator pgbackrest):

1. Descărcați arhiva din pgbackrest și transferați conținutul acesteia în folderul /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. Instalați dependențele necesare pentru asamblare:

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

3. Asamblarea pgbackrest:

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

4. Copiați fișierul executabil în directorul /usr/bin:

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

5. Pgbackrest necesită perl. Instalare:

sudo apt-get install perl

6. Creați directoare pentru jurnale, acordați-le anumite drepturi:

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. Verificați:

pgbackrest version

Server Postgres (utilizator sudo sau root):

Procesul de instalare a pgbackrest pe un server cu postgres este similar cu procesul de instalare pe depozit (da, pgbackrest trebuie instalat pe ambele servere), dar în al 6-lea paragraf a doua și ultima comandă:

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

înlocui cu:

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

Configurarea interacțiunii între servere prin SSH fără parolă

Pentru ca pgbackrest să funcționeze corect, este necesar să configurați interacțiunea dintre serverul postgres și depozit folosind fișierul cheie.

Depozitar (utilizator pgbackrest):

Creați o pereche de chei:

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

Atenție! Rulăm comenzile de mai sus fără sudo.

Server Postgres (utilizator sudo sau root):

Creați o pereche de chei:

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

Depozitar (utilizator sudo):

Copiați cheia publică a serverului postgres pe serverul de depozit:

(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

La acest pas vi se va cere parola pentru utilizatorul root. Trebuie să introduceți parola utilizatorului root al serverului postgres!

Server Postgres (utilizator sudo):

Copiați cheia publică a depozitului pe server cu postgres:

(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

La acest pas vi se va cere parola pentru utilizatorul root. Trebuie să introduceți exact parola utilizatorului root al depozitului!

Verificăm:

Depozitar (utilizator root, pentru puritatea experimentului):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Server Postgres (utilizator root, pentru puritatea experimentului):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Ne asigurăm că avem acces fără probleme.

Configurarea unui server postgres

Server Postgres (utilizator sudo sau root):

1. Să permitem să bate pe serverul postgres de la IP-uri externe. Pentru a face acest lucru, editați fișierul postgresql.conf (situat în folderul /etc/postgresql/11/main), adăugând linia la acesta:

listen_addresses = '*'

Dacă o astfel de linie există deja, fie anulați comentariul, fie setați valoarea parametrului ca „*”.

În dosar pg_hba.conf (se află și în folder /etc/postgresql/11/main) adăugați următoarele rânduri:

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

în cazul în care:

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

2. Să facem setările necesare în postgresql.conf (este in folder /etc/postgresql/11/main) pentru ca pgbackrest să funcționeze:

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

3. Să facem setările necesare în fișierul de configurare pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Reîncărcați postgresql:

sudo service postgresql restart

Configurarea unui server de depozit

Depozit (utilizator pgbackrest):

Să facem setările necesare în fișierul de configurare 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 # Параметр, указывающий сколько хранить полных бэкапов. Т.е. если у вас есть два полных бэкапа и вы создаете третий - первые два будут удалены вместе с инкрементами. 
start-fast=y # Начинает резервное копирование немедленно, прочитать про этот параметр можно тут https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Crearea unui depozit

Depozit (utilizator pgbackrest):

Creați un spațiu de stocare nou pentru cluster principal:

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

Проверка

Server Postgres (utilizator sudo sau root):

Verificăm pe serverul postgres:

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

Depozit (utilizator pgbackrest):

Verificăm pe serverul de depozit:

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

Ne asigurăm că în rezultat vedem linia „check command end: completed successfully”.

Obosit? Să trecem la partea cea mai interesantă.

Făcând o copie de rezervă

Depozit (utilizator pgbackrest):

1. Efectuați o copie de rezervă:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Asigurați-vă că a fost creată o copie de rezervă:

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

Pgbackrest va crea prima copie de rezervă completă. Dacă doriți, puteți rula din nou comanda de backup și vă asigurați că sistemul creează o copie de rezervă incrementală.

Dacă doriți să faceți din nou o copie de rezervă completă, atunci specificați un semnal suplimentar:

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

Dacă doriți o ieșire detaliată a consolei, specificați și:

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

Restaurarea unei copii de rezervă

Server Postgres (utilizator sudo sau root):

1. Opriți clusterul care rulează:

sudo pg_ctlcluster 11 main stop

2. Restaurare din backup:

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

3. Porniți clusterul:

sudo pg_ctlcluster 11 main start

După restaurarea copiei de rezervă, trebuie să efectuăm oa doua copie de rezervă:

Depozit (utilizator pgbackrest):

sudo pgbackrest --stanza=main backup

Asta e tot. În concluzie, aș vrea să vă reamintesc că nu încerc în niciun caz să mă prefac că sunt senior dba și voi folosi norii cu cea mai mică ocazie. În prezent, eu însumi încep să studiez diverse subiecte precum backup, replicare, monitorizare etc. și scriu mici rapoarte despre rezultate pentru a aduce o mică contribuție comunității și a lăsa mici cheat sheets pentru mine.

În articolele următoare voi încerca să vorbesc despre caracteristici suplimentare - recuperarea datelor într-un cluster curat, criptarea backup-urilor și publicarea pe S3, backup-uri prin rsync.

Sursa: www.habr.com

Adauga un comentariu