Declinarea responsabilității
Sunt dezvoltator. Scriu cod și interacționez cu baza de date doar ca utilizator. Nu pretind în niciun caz să fiu administrator de sistem și, cu atât mai puțin, DBA. Dar...
Așa a ieșit că a trebuit să organizez backup-ul bazei de date PostgreSQL. Fără cloud — menține SSH-ul și asigură-te că totul funcționează fără să ceară bani. Ce facem în astfel de cazuri? Corect, punem pg_dump în cron, facem backup zilnic în arhivă și, dacă devine prea mult, trimitem acea arhivă undeva departe.
În acest caz, dificultatea consta în faptul că, conform planurilor, baza urma să crească cu aproximativ +- 100 MB pe zi. Bineînțeles, după câteva săptămâni, dorința de a face backup cu pg_dump va dispărea. Aici intervin backup-urile incrementale.
Interesant? Bun venit sub cat.
Backup incremental este un tip de copie de rezervă în care nu sunt copiate toate fișierele sursă, ci doar cele noi și modificate de la crearea ultimei copii.
Ca orice dezvoltator, complet neinteresat (în acel moment) să mă complic cu detaliile PostgreSQL, am vrut să găsesc un buton verde. Știți, ca în AWS, DigitalOcean: ai apăsat un buton — ai obținut replicarea, ai apăsat al doilea — ai configurat backup-urile, al treilea — ai restaurat totul cu câteva ore în urmă. Nu am găsit butoane și un instrument frumos cu GUI. Dacă știți unul (gratuit sau ieftin) — lăsați un comentariu.
Căutând, am găsit două instrumente pgbarman și pgbackrest. Cu primul nu am reușit (documentație foarte limitată, am încercat să instalez totul după vechile manuale), dar cu al doilea documentația a fost la nivel, deși nu fără imperfecțiuni. Această articolă a fost scrisă pentru a simplifica munca celor care se vor confrunta cu o asemenea sarcină.
Citind acest articol, vei învăța cum să faci backup-uri incrementale, să le salvezi pe un server extern (repository de backup-uri) și să le restaurezi în caz de pierdere a datelor sau alte probleme pe serverul principal.
Pregătire
Pentru a reproduce manualul, vei avea nevoie de două VPS-uri. Primul va fi depozitul (repository, pe care vor fi stocate backup-urile), iar al doilea, de fapt, serverul cu PostgreSQL (în cazul meu versiunea 11 PostgreSQL).
Se presupune că pe serverul cu Postgres aveți utilizator root, utilizator sudo, utilizator postgres și PostgreSQL instalat (utilizatorul postgres este creat automat la instalarea PostgreSQL), iar pe serverul-repozitoriu există utilizator root și utilizator sudo (în manual se va folosi numele de utilizator pgbackrest).
Pentru a avea mai puține probleme în timpul reproducerii instrucțiunii — cu italice voi specifica unde, cu ce utilizator și cu ce permisiuni am executat comanda în timpul redactării și verificării articolului.
Instalarea pgbackrest
Repozitoriu (utilizator pgbackrest):
1. Descărcăm arhiva cu pgbackrest și mutăm 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 /build2. Instalăm dependențele necesare pentru compilare:
sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev
libpq-dev3. Compilăm pgbackrest:
cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src4. Copiem fișierul executabil în directorul /usr/bin:
sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest5. Pgbackrest necesită prezența Perl. Instalăm:
sudo apt-get install perl6. Creăm directoare pentru jurnale, le dăm anumite permisiuni:
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.conf7. Verificăm:
pgbackrest versionServer Postgres (utilizator sudo sau root):
Procesul de instalare pgbackrest pe serverul cu Postgres este similar cu procesul de instalare pe repozitoriu (da, pgbackrest trebuie să fie instalat pe ambele servere), dar la punctul 6 înlocuim cele două comenzi finale:
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.confcu:
sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.confConfigurarea interacțiunii dintre servere prin SSH fără parolă
Pentru ca pgbackrest să funcționeze corect, trebuie să configurăm interacțiunea dintre serverul Postgres și repozitoriu printr-un fișier-cheie.
Repozitoriu (utilizator pgbackrest):
Creăm 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! Comenzile de mai sus se execută fără sudo.
Server Postgres (utilizator sudo sau root):
Creăm 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 ""Repozitoriu (utilizator sudo):
Copiem cheia publică a serverului Postgres pe serverul-repozitoriu:
(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În această etapă, va solicita parola utilizatorului root. Trebuie introdusă exact parola utilizatorului root al serverului Postgres!
Server Postgres (utilizator sudo):
Copiem cheia publică a repository-ului pe serverul 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@ cat /home/pgbackrest/.ssh/id_rsa.pub) |
sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys
În această etapă, va solicita parola utilizatorului root. Trebuie introdusă exact parola utilizatorului root al repository-ului!
Verificăm:
Repository (utilizator root, pentru a menține curățenia experimentului):
sudo -u pgbackrest ssh postgres@Server Postgres (utilizator root, pentru a menține curățenia experimentului):
sudo -u postgres ssh pgbackrest@Ne asigurăm că avem acces fără probleme.
Configurarea serverului postgres
Server Postgres (utilizator sudo sau root):
1. Vom permite accesul la serverul postgres din IP-uri externe. Pentru aceasta, vom edita fișierul postgresql.conf (se află în folderul /etc/postgresql/11/main), adăugând în el linia:
listen_addresses = '*'Dacă această linie există deja, fie o dezaerați, fie stabiliți valoarea parametrului la '*'.
În fișierul pg_hba.conf (de asemenea, se află în folderul /etc/postgresql/11/main) adăugăm următoarele linii:
hostssl all all 0.0.0.0/0 md5
host all all 0.0.0.0/0 md5unde:
hostssl/host - ne conectăm prin SSL (sau nu)
all - permitem conexiunea la toate bazele de date
all - numele utilizatorului căruia îi permitem conexiunea (tuturor)
0.0.0.0/0 - masca de rețea din care se poate conecta
md5 - metoda de criptare a parolei2. Vom face setările necesare în postgresql.conf (se află în folderul /etc/postgresql/11/main) pentru a funcționa pgbackrest:
archive_command = 'pgbackrest --stanza=main archive-push %p' # Unde main este numele cluster-ului. La instalarea postgres, acesta creează automat cluster-ul main.
archive_mode = on
max_wal_senders = 3
wal_level = replica3. Vom face 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=4. Vom reporni postgresql:
sudo service postgresql restartConfigurarea serverului-repository
Repository (utilizator pgbackrest):
Vom face setările necesare în fișierul de configurare 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 # Parametru care indică cât timp să păstrăm backup-urile complete. Adică, dacă aveți două backup-uri complete și creați unul nou - primele două vor fi șterse împreună cu incrementele.
start-fast=y # Începe backup-ul imediat, puteți citi despre acest parametru aici https://postgrespro.ro/docs/postgrespro/9.5/continuous-archivingCrearea unui depozit
Repository (utilizator pgbackrest):
Creăm un nou depozit pentru cluster main:
sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R pgbackrest /var/lib/pgbackrest/
sudo -u pgbackrest pgbackrest --stanza=main stanza-create
Verificare
Server Postgres (utilizator sudo sau root):
Verificăm pe serverul postgres:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info checkRepository (utilizator pgbackrest):
Verificăm pe serverul de depozit:
sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info checkNe asigurăm că în ieșire vedem linia „check command end: completed successfully”.
Epuizați? Trecem la partea interesantă.
Facem backup
Repository (utilizator pgbackrest):
1. Executăm backup:
sudo -u pgbackrest pgbackrest --stanza=main backup
2. Ne asigurăm că backup-ul a fost creat:
ls /var/lib/pgbackrest/backup/main/Pgbackrest va crea primul backup complet. Dacă doriți, puteți rula din nou comanda de backup și vă asigurați că sistemul va crea un backup incremental.
Dacă doriți să faceți din nou un backup complet, atunci specificați un flag suplimentar:
sudo -u pgbackrest pgbackrest --stanza=main --type=full backupDacă doriți o ieșire detaliată în consolă, specificați și:
sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backupRestaurăm backup-ul
Server Postgres (utilizator sudo sau root):
1. Oprim clusterul în funcțiune:
sudo pg_ctlcluster 11 main stop2. Ne restaurăm din backup:
sudo -u postgres pgbackrest --stanza=main --delta restore3. Pornim clusterul:
sudo pg_ctlcluster 11 main startDupă restaurarea backup-ului, trebuie să efectuează un backup repetat:
Repository (utilizator pgbackrest):
sudo pgbackrest --stanza=main backupAsta e tot. În încheiere, vreau să reamintesc că nu încerc să mă prezint drept senior dba și, la cea mai mică oportunitate, voi folosi cloud-uri. În prezent, încep să studiez diverse teme precum backup-urile, replicarea, monitorizarea și așa mai departe și scriu mici rapoarte despre rezultate, astfel încât să fac o mică contribuție la comunitate și să îmi las niște notițe.
În articolele următoare, voi încerca să vorbesc despre funcții suplimentare - restaurarea datelor pe un cluster curat, criptarea backup-urilor și publicarea pe S3, backup-uri prin rsync.
Sursa: habr.com
