Bëshkëngjitë inkrementale të postgresql me pgbackrest - kursi i luftëtarit të ri nga zhvilluesi.

Kërcënimi

Unë jam një zhvillues. Unë shkruaj kod, ndërveproj me bazën e të dhënave vetëm si një përdorues. Unë asnjëherë nuk pretendoj për pozitat e administratorit të sistemit dhe, për më tepër, dba. Por...

KĂ«shtu ndodhi qĂ« mĂ« duhej tĂ« organizoja njĂ« kopje rezervĂ« tĂ« bazĂ«s sĂ« tĂ« dhĂ«nave postgresql. AsnjĂ« cloud — mbaji SSH dhe bĂ«j qĂ« tĂ« gjitha tĂ« funksionojnĂ« pa kĂ«rkuar para. ÇfarĂ« bĂ«jmĂ« nĂ« raste tĂ« tilla? E saktĂ«, e vendosim pgdump nĂ« cron, çdo ditĂ« bĂ«jmĂ« backup tĂ« gjithçkaje nĂ« arkiv dhe nĂ«se shkojmĂ« shumĂ« larg — e dĂ«rgojmĂ« kĂ«tĂ« arkiv diku larg.

Këtë herë, vështirësia ishte se sipas planeve, baza do të rritej rreth 100 MB në ditë. Natyrisht, tashmë pas disa javësh dëshira për të bërë backup të gjithçkaje me pgdump do të zhdukej. Këtu ndihmën e japin backup-et incrementale.

Interesant? Mirë se vini nën artikull.

Backup-i incremental është një lloj rezervë, ku nuk kopjohen të gjithë skedarët e burimit, por vetëm ato të reja dhe të ndryshuara nga krijimi i kopjes së mëparshme.

Si çdo zhvillues, AKTUALISHT nuk dĂ«shiroja (nĂ« atĂ« moment) tĂ« merrem me nuancat e postgres, doja tĂ« gjeja butonin e gjelbĂ«r. E dini si nĂ« AWS, DigitalOcean: e shtypi njĂ« buton — mora replikimin, e shtypi butonin tjetĂ«r — e konfigurava backup-in, butonin e tretĂ« — e ktheva gjithçka para disa orĂ«ve. Nuk e gjeta butonin dhe asnjĂ« mjet tĂ« bukur GUI. NĂ«se e dini njĂ« tĂ« tillĂ« (falas ose tĂ« lirĂ«) — shkruani pĂ«r kĂ«tĂ« nĂ« komentet.

Pas kërkimit kam gjetur dy mjete pgbarman dhe pgbackrest. Me të parin nuk munda të angazhohem (dokumentacion shumë i varfër, u përpoqa ta ngrita gjithçka sipas manualeve të vjetra), ndërsa dokumentacioni i të dytit ishte në një nivel të pranueshëm, por jo pa mangësi. Për ta thjeshtëzuar punën për ata që do të përballen me një detyrë të tillë, ky artikull u shkrua.

Pas leximit të këtij artikulli do të mësoni si të bëni backups incrementale, ti ruani ato në një server të largët (repo me backups) dhe ti rinovoni ato në rast humbjeje të të dhënave ose çështjeve të tjera në serverin kryesor.

Përgatitja

Për të rikrijuar manualin ju nevojiten dy VPS. I pari do të jetë depozitë (repo ku do të ruhen backups), dhe i dyti, vetë serveri me postgres (në rastin tim versioni 11 i postgres).

Supozhet që në serverin me postgres keni një root, një përdorues sudo, përdoruesin postgres dhe vetë postgres është instaluar (përdoruesi postgres krijohet automatikisht gjatë instalimit të postgresql), dhe në serverin-repozitor ka një root dhe një përdorues sudo (në manual do të përdoret emri i përdoruesit pgbackrest).

PĂ«r tĂ« pasur mĂ« pak probleme kur tĂ« riprodhoni udhĂ«zimin — me shkronja italike do tĂ« pĂ«rmend se ku, nga cili pĂ«rdorues dhe me cilat tĂ« drejta kam ekzekutuar komandĂ«n gjatĂ« shkruanjes dhe verifikimit tĂ« artikullit.

Instalimi i pgbackrest

Repoja (përdoruesi pgbackrest):

1. Shkarkoni arkivin me pgbackrest dhe transferoni përmbajtjen e tij në dosjen /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. Instaloni varësitë e nevojshme për ndërtimin:

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

3. Ndërtoni pgbackrest:

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

4. Kopjoni skedarin ekzekutiv në drejtorinë /usr/bin:

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

5. Pgbackrest kërkon praninë e perl. Instaloni:

sudo apt-get install perl

6. Krijoni drejtoritë për logët, jepni atyre të drejta specifike:

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. Verifikoni:

pgbackrest version

Serveri Postgres (përdoruesi sudo ose root):

Procesi i instalimit të pgbackrest në serverin me postgres është i ngjashëm me procesin e instalimit në repository (po, pgbackrest duhet të jetë në të dy serverat), por në pikën 6, komandat e dyta dhe të fundit:

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

zëvendësohen me:

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

Konfigurimi i ndërveprimit midis serverëve përmes SSH pa fjalëkalim

Për të siguruar funksionimin e saktë të pgbackrest, është e nevojshme të konfigurohet ndërveprimi midis serverit postgres dhe repository me një çelës file.

Repoja (përdoruesi pgbackrest):

Krijoni një çift çelesh:

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

Kujdes! Komandat e mësipërme ekzekutohen pa sudo.

Serveri Postgres (përdoruesi sudo ose root):

Krijoni një çift çelesh:

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

Repoja (përdoruesi sudo):

Kopjoni çelësin publik të serverit postgres në serverin-repozitor:

(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ë këtë hap, do të kërkohet fjalëkalimi i përdoruesit root. Duhet të futni fjalëkalimin e përdoruesit root të serverit postgres!

Serveri Postgres (përdoruesi sudo):

Kopjojmë çelësin publik të depot në serverin me 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ë këtë hap, do të kërkohet fjalëkalimi i përdoruesit root. Duhet të futni fjalëkalimin e përdoruesit root të depot!

Po kontrollojmë:

Depoja (përdoruesi root, për pastërti eksperimentale):

sudo -u pgbackrest ssh postgres@

Serveri Postgres (përdoruesi root, për pastërti eksperimentale):

sudo -u postgres ssh pgbackrest@

Sigurohemi që po fitojmë akses pa probleme.

Konfigurimi i serverit postgres

Serveri Postgres (përdoruesi sudo ose root):

1. Do të lejojmë "të godasim" serverin postgres nga IP të jashtme. Për këtë, do të redaktojmë skedarin postgresql.conf (ndodhet në folderin /etc/postgresql/11/main), duke shtuar në të rreshtin:

listen_addresses = '*'

NĂ«se njĂ« rresht i tillĂ« ekziston tashmĂ«, ose hiqni komentin nga ai, ose vendosni vlerĂ«n e parametrin si ‘*’.

Në skedar pg_hba.conf (po ashtu ndodhet në folderin /etc/postgresql/11/main) shtojmë këto rreshta:

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

ku:

hostssl/host - lidhemi përmes SSL (ose jo)
all - lejojmë lidhjen me të gjitha bazat
yt - emri i përdoruesit, të cilit i lejojmë lidhjen (të gjithëve)
0.0.0.0/0 - maska e rrjetit nga e cila mund të lidhemi
md5 - mënyra e enkriptimit të fjalëkalimit

2. Do të bëjmë konfigurimet e nevojshme në postgresql.conf (ndodhet në folderin /etc/postgresql/11/main) për funksionimin e pgbackrest:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Ku main është emri i klasterit. Gjatë instalimit të postgres, automatikisht krijohet klasteri main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Do të bëjmë konfigurimet e nevojshme në skedarin e konfigurimit pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

[global]
log-level-file=detail
repo1-host=

4. Rinisni postgresql:

sudo service postgresql restart

Konfigurimi i serverit-repozitor

Depoja (përdoruesi pgbackrest):

Do të bëjmë konfigurimet e nevojshme në skedarin e konfigurimit 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 # Parametr që tregon sa shumë të ruajmë kopje të plota. Pra, nëse keni dy kopje të plota dhe krijoni një të tretë - dy të parat do të fshihen së bashku me incrementet.
start-fast=y # Fillon kopjimin menjëherë, lexoni për këtë parametr këtu https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Krijimi i një depoje

Depoja (përdoruesi pgbackrest):

Krijojmë një depo të re për klasterin main:

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

Kontrolli

Serveri Postgres (përdoruesi sudo ose root):

Kontrollojmë në serverin postgres:

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

Depoja (përdoruesi pgbackrest):

Kontrollojmë në serverin e depozitës:

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

Sigurohemi që shohim rreshtin «check command end: completed successfully» në daljen.

E lodhur? Kalojmë në më tërheqësin.

Krijojmë një kopje rezervë

Depoja (përdoruesi pgbackrest):

1. Kryejmë kopjimin:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Sigurohemi që kopja është krijuar:

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

Pgbackrest do të krijojë kopjen e parë të plotë. Nëse dëshironi, mund të ekzekutoni komandën e kopjimit përsëri dhe të siguroheni se sistemi do të krijojë një kopje incrementale.

Nëse dëshironi të bëni përsëri një kopje të plotë, specifikoni një flag shtesë:

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

Nëse dëshironi një dalje të detajuar në konsolë, gjithashtu specifikoni:

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

Rindërtojmë kopjen rezervë

Serveri Postgres (përdoruesi sudo ose root):

1. Ndalim klasterin që funksionon:

sudo pg_ctlcluster 11 main stop

2. Rindërtohemi nga kopja rezervë:

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

3. Nisim klasterin:

sudo pg_ctlcluster 11 main start

Pas rindërtimit të kopjes rezervë, na nevojitet të kryejmë përsëri një kopje rezervë:

Depoja (përdoruesi pgbackrest):

sudo pgbackrest --stanza=main backup

Kjo është e gjitha. Në përfundim, dua të kujtoj se nuk po përpiqem të dukem si një senior DBA dhe sa herë që kam mundësi, do të përdor re. Aktualisht po filloj të studioj tema të ndryshme si kopjimi, replikimi, monitorimi etj. dhe për rezultatet, po shkruaj raporte të vogla për të bërë një kontribut të vogël në komunitet dhe për të lënë disa shënime për vete.

Në artikujt e ardhshëm do të përpiqem të flas për veçori shtesë - rikuperimi i të dhënave në një klaster të pastër, enkriptimi i kopjeve rezervë dhe publikimi në S3, kopje rezervë përmes rsync.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster