Backup-et inkrementale pĂ«r postgresql me pgbackrest — njĂ« kurs pĂ«r fillestarĂ«t nga zhvilluesi

Kufizimi

Unë jam zhvillues. Unë shkruaj kod, ndërveproj me bazën e të dhënave vetëm si përdorues. Në asnjë rast nuk pretendonj për pozita si administrator sistemi dhe, aq më pak, dba. Por


Ishte e nevojshme tĂ« organizoja njĂ« kopje rezervĂ« tĂ« bazĂ«s sĂ« tĂ« dhĂ«nave postgresql. Pa mjete cloud — mbaj SSH dhe bĂ«j qĂ« gjithçka tĂ« funksionojĂ« pa kĂ«rkuar para. ÇfarĂ« bĂ«jmĂ« nĂ« kĂ«so raste? E saktĂ«, vendosim pgdump nĂ« cron, çdo ditĂ« krijojmĂ« njĂ« kopje rezervĂ« nĂ« arkiv dhe nĂ«se gjithçka shkaktohet shumĂ« — dĂ«rgojmĂ« kĂ«tĂ« arkiv diku larg.

Së këtij herë, vështirësia qëndronte në faktin se sipas planeve baza duhej të rritej për rreth 100 MB në ditë. Natyrisht, pas disa javësh dëshira për të bërë të gjitha kopje rezervë me pgdump do të zhdukej. Këtu vijnë në ndihmë kopjet rezervë incrementale.

Interesant? Mirë se vini nën kat.

Kopja rezervë incrementale është një lloj rezervë ku nuk kopjohen të gjitha skedaret e burimit, por vetëm ato të reja dhe të ndryshuara nga momenti i krijimit të kopjës së mëparshme.

Si çdo zhvillues, E HUMBUR plotĂ«sisht dĂ«shira (nĂ« atĂ« kohĂ«) pĂ«r tĂ« kuptuar imtĂ«sitĂ« e postgres, doja tĂ« gjeja butonin e gjelbĂ«r. E dini, si nĂ« AWS, DigitalOcean: e shtypĂ« njĂ« buton — merr replikimin, e shtyp dy — konfiguro kopjet rezervĂ«, e treta — kthe gjithçka disa orĂ« mbrapa. Nuk gjetĂ«m butona dhe njĂ« instrument tĂ« bukur GUI. NĂ«se e dini njĂ« tĂ« tillĂ« (falas ose tĂ« lirĂ«) — shkruani pĂ«r kĂ«tĂ« nĂ« komentet.

Pas kërkimeve në Google, gjetëm dy mjete pgbarman dhe pgbackrest. Me të parin thjesht nuk munda të funksionoj (dokumentacion shumë i dobët, provova ta ngrit me udhëzime të vjetra), ndërsa dokumentacioni i të dytit ishte në nivel, por jo pa mangësi. Kjo artikull ishte shkruar për të lehtësuar punën e atyre që do të përballeshin me një detyrë të ngjashme.

Pas leximit tĂ« kĂ«tij artikulli, do tĂ« mĂ«soni tĂ« bĂ«ni kopje rezervĂ« incrementale, t’i ruani ato nĂ« njĂ« server tĂ« largĂ«t (repo me kopje rezervĂ«) dhe t’i rikuperoni ato nĂ« rast tĂ« humbjes sĂ« tĂ« dhĂ«nave ose problemeve tĂ« tjera nĂ« serverin kryesor.

Përgatitja

Për të riprodhuar manualin, do t'ju nevojiten dy VPS. I pari do të jetë depo (repo, ku do të jenë kopjet rezervë), ndërsa i dyti, serveri me postgres (në rastin tim versioni 11 i postgres).

ËshtĂ« e supozuar se nĂ« serverin me postgres ju keni pĂ«rdoruesin root, pĂ«rdoruesin sudo, pĂ«rdoruesin postgres dhe vetĂ« postgres Ă«shtĂ« instaluar (pĂ«rdoruesi postgres krijohet automatikisht gjatĂ« instalimit tĂ« postgresql), dhe nĂ« serverin e depozitĂ«s ka pĂ«rdoruesin root dhe pĂ«rdoruesin sudo (nĂ« manual do tĂ« pĂ«rdoret emri i pĂ«rdoruesit pgbackrest).

QĂ« tĂ« keni mĂ« pak probleme gjatĂ« riprodhimit tĂ« udhĂ«zimit — me kursiv do tĂ« shkruaj ku, me cilin pĂ«rdorues dhe me cilat tĂ« drejta kam ekzekutuar komandĂ«n gjatĂ« shkrimit dhe verifikimit tĂ« artikullit.

Instalimi i pgbackrest

Depozita (përdoruesi pgbackrest):

1. Shkarkojmë arkivin me pgbackrest dhe e transferojmë 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. Instalojmë varësitë e nevojshme për ndërtim:

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

3. Ndërtojmë pgbackrest:

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

4. Kopjojmë skedarin ekzekutues në direktorine /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. Instalojmë:

sudo apt-get install perl

6. Krijojmë direktor të përlogjeve, u japim atyre të drejta të caktuara:

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. Kontrollojmë:

pgbackrest version

Postgres server (përdorues sudo ose root):

Procesi i instalimit të pgbackrest në serverin me postgres është i ngjashëm me procesin e instalimit në depozita (po, pgbackrest duhet të jetë në të dy serverët), 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

i zëvendësojmë 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 që pgbackrest të punojë saktë, është dhe nevojshme të konfigurohet ndërveprimi mes serverit postgres dhe depozitës përmes skedarit të çelësit.

Depozita (përdoruesi pgbackrest):

Krijojmë një çift çelësash:

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

Kujdes! Komandat e përmendura më sipër ekzekutohen pa sudo.

Postgres server (përdorues sudo ose root):

Krijojmë një çift çelësash:

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

Depozita (përdorues sudo):

Kopjojmë çelësin publik të serverit postgres në serverin e depozitës:

(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'ju kërkohet fjalëkalimi për përdoruesin root. Duhet të futni saktësisht fjalëkalimin e përdoruesit root të serverit postgres!

Serveri Postgres (përdoruesi sudo):

Kopjojmë çelësin publik të depozitës 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'ju kërkohet fjalëkalimi për përdoruesin root. Duhet të futni saktësisht fjalëkalimin e përdoruesit root të depozitës!

Po kontrollojmë:

Depozita (përdoruesi root, për pastërtinë e eksperimenteve):

sudo -u pgbackrest ssh postgres@

Serveri Postgres (përdoruesi root, për pastërtinë e eksperimenteve):

sudo -u postgres ssh pgbackrest@

Sigurohemi që nuk kemi probleme me aksesin.

Konfigurimi i serverit postgres

Postgres server (përdorues sudo ose root):

1. Lejojmë 'të trokasim' në serverin postgres nga ip të jashtme. Për këtë, do të editoni skedarin postgresql.conf (ndodhet në dosjen /etc/postgresql/11/main), duke shtuar në të rreshtin:

listen_addresses = '*'

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

Në skedar pg_hba.conf (po ashtu ndodhet në dosjen /etc/postgresql/11/main) shtojmë rreshtat e mëposhtëm:

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 në të gjitha bazat
dhe - emri i përdoruesit, të cilit i lejojmë lidhjen (të gjithë)
0.0.0.0/0 - maska e rrjetit nga e cila mund të lidhemi
md5 - metoda e enkriptimit të fjalëkalimit

2. Do të bëjmë konfigurimet e nevojshme në postgresql.conf (ndodhet në dosjen /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, postgres krijon automatikisht klasterin 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-repozit

Depozita (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 # Parametri që tregon se sa të dhëna të plota do të ruhen. Pra, nëse keni dy kopje të plota dhe krijoni një të tretë - dy të parat do të fshihen së bashku me inkrementet.
start-fast=y # Fillon mbështetje në mënyrë të menjëhershme, lexoni rreth këtij parametri këtu https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Krijimi i depozitës

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

Kontroll

Postgres server (përdorues sudo ose root):

Kontrollojmë në serverin postgres:

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

Depozita (përdoruesi pgbackrest):

Kontrollojmë në serverin e depozitës:

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

Sigurohemi që në dalje të shohim rreshtin "check command end: completed successfully."

A jeni lodhur? Kalojmë në gjënë më interesante.

Bëjmë një kopje rezervë

Depozita (përdoruesi pgbackrest):

1. Kryejmë kopjimin e rezervës:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Sigurohemi që kopja rezervë u krijua:

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

Pgbackrest do të krijojë kopjen tuaj të parë të plotë. Nëse dëshironi, mund të lançoni përsëri komandën e kopjimit dhe të siguroheni që sistemi do të krijojë një kopje inkrementale.

Nëse dëshironi të bëni përsëri një kopje rezervë të plotë, duhet të jepni një flamur shtesë:

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

Nëse dëshironi që dalja në konsolë të jetë e detajuar, gjithashtu duhet të jepni:

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

Rivendosim kopjen rezervë

Postgres server (përdorues sudo ose root):

1. Ndalim klasterin e punës:

sudo pg_ctlcluster 11 main stop

2. Rivendosim nga kopja rezervë:

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

3. Nisim klasterin:

sudo pg_ctlcluster 11 main start

Pas rivendosjes së kopjes rezervë, na nevojitet të kryejmë përsëri një kopje rezervë:

Depozita (përdoruesi pgbackrest):

sudo pgbackrest --stanza=main backup

KĂ«tu pĂ«rfundon. NĂ« pĂ«rfundim, dua tĂ« theksoj se nuk po mundohem tĂ« dukem si njĂ« DBA senior dhe nĂ« çdo rast do tĂ« pĂ«rdor ‘cloud’. Aktualisht po filloj tĂ« studioj tema tĂ« ndryshme si kopjimi, replikimi, monitorimi, etj. dhe pĂ«r rezultatet 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ë tregoj rreth veçorive të tjera - rikthimin e të dhënave në një klaster të pastër, enkriptimin e kopjeve rezervë dhe publikimin në S3, kopje rezervë përmes rsync.

Burimi: habr.com

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