Incremental postgresql backups uban sa pgbackrest - usa ka batan-ong manggugubat nga kurso gikan sa usa ka developer

Disclaimer

Usa ko ka developer. Nagsulat ko og code, nakig-interact sa database isip user lang. Dili gyud ko magpakaaron-ingnon nga usa ka system administrator ug, dugang pa, usa ka dba. Apan…

Nahitabo kini nga kinahanglan kong mag-organisar og backup sa database sa postgresql. Walay mga panganod - ipadayon ang SSH ug himoa ang tanan nga magtrabaho ug dili mangayo og kwarta. Unsa ang atong buhaton sa ingon nga mga kaso? Husto kana, among iduso ang pgdump ngadto sa cron, i-back up ang tanan ngadto sa archive kada adlaw, ug kon bug-os namong isabwag, among ipadala kini nga archive sa layo nga dapit.

Niini nga panahon, ang kalisud mao nga, sumala sa mga plano, ang database kinahanglan nga motubo sa mga + - 100 MB kada adlaw. Siyempre, pagkahuman sa pila ka semana, ang tinguha nga i-back up ang tanan gamit ang pgdump mawala. Dinhi diin magamit ang mga incremental backup.

Makapainteres? Welcome ubos sa iring.

Ang incremental backup kay usa ka matang sa backup kung dili tanang source files makopya, pero bag-o lang ug nabag-o sukad nabuhat ang miaging kopya.

Sama sa bisan kinsa nga developer nga dili gusto (niadtong panahona) nga masabtan ang mga kakuti sa mga postgres, gusto nako mangita usa ka berde nga buton. Aw, nahibal-an nimo, sama sa AWS, DigitalOcean: Gipindot nako ang usa ka buton - Nakuha nako ang replikasyon, gipugos nako ang ikaduha - Nag-set up ako og mga backup, ang ikatulo - ang tanan mibalik sa pipila ka oras ang milabay. Wala koy nakit-an nga buton ug nindot nga GUI tool. Kung nahibal-an nimo ang usa (libre o barato) - isulat kini sa mga komento.

Ang pag-goog nakakita kog duha ka himan pgbarman ΠΈ pgbackrest. Uban sa una, wala lang ako molampos (dili maayo nga dokumentasyon, gisulayan nako nga kuhaon ang tanan sumala sa daan nga mga manwal), apan ang ikaduha nga dokumentasyon nahimo nga naa sa lebel, apan wala’y sayup. Aron mapasayon ​​ang buluhaton niadtong nag-atubang ug susamang buluhaton, kini nga artikulo gisulat.

Pagkahuman sa pagbasa niini nga artikulo, mahibal-an nimo kung giunsa paghimo ang mga incremental backup, i-save kini sa usa ka hilit nga server (repository nga adunay mga backup) ug ibalik kini kung adunay pagkawala sa data o uban pang mga problema sa panguna nga server.

Training

Kinahanglan nimo ang duha ka VPS aron madula ang manwal. Ang una mao ang repository (ang repository diin ang mga backup), ug ang ikaduha, sa tinuud, ang server mismo nga adunay mga postgres (sa akong kaso, bersyon 11 sa mga postgres).

Gituohan nga sa server nga adunay mga postgres ikaw adunay gamut, sudo user, postgres user ug postgres mismo nga na-install (ang postgres user awtomatik nga gihimo sa dihang postgresql gi-install), ug sa repository server ikaw adunay root ug sudo user (username pgbackrest will gamiton sa manwal).

Aron adunay ka gamay nga mga problema sa pag-reproduce sa mga instruksyon - nagsulat ako sa mga italiko diin, sa unsa nga tiggamit ug sa unsa nga mga katungod akong gipatuman ang sugo samtang nagsulat ug nagrepaso sa artikulo.

pag-instalar sa pgbackrest

Repository (gumagamit sa pgbackrest):

1. I-download ang archive gikan sa pgbackrest ug ibalhin ang mga sulod niini ngadto sa /build folder:

sudo mkdir /build
sudo wget -q -O - 
       https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz | 
       sudo tar zx -C /build

2. I-install ang mga dependency nga gikinahanglan alang sa asembliya:

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

3. Gikolekta namo ang pgbackrest:

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

4. Kopyaha ang executable file sa /usr/bin directory:

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

5. Pgbackrest nagkinahanglan perl. Pag-instalar:

sudo apt-get install perl

6. Paghimo og mga direktoryo alang sa mga troso, hatagi sila og piho nga mga katungod:

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

pgbackrest version

Postgres server (sudo user o gamut):

Ang proseso sa pag-instalar sa pgbackrest sa usa ka postgres server susama sa pag-instalar sa usa ka repository (oo, ang pgbackrest kinahanglang i-install sa duha ka server), apan sa ika-6 nga parapo, ang ikaduha ug kataposang sugo:

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

pulihan ug:

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

Pag-set up sa komunikasyon tali sa mga server pinaagi sa SSH nga walay password

Aron ang pgbackrest magtrabaho sa husto, gikinahanglan ang pag-configure sa interaksyon tali sa postgres server ug sa repository gamit ang key file.

Repository (gumagamit sa pgbackrest):

Paghimo og usa ka parisan sa mga yawe:

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

Pasidaan Ang mga sugo sa ibabaw gipatuman nga walay sudo.

Postgres server (sudo user o gamut):

Paghimo og usa ka parisan sa mga yawe:

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

Repositoryo (sudo user):

Kopyaha ang public key sa postgres server ngadto sa repository server:

(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

Sa niini nga lakang, kini mangutana alang sa password gikan sa gamut user. Kinahanglan nimo nga isulod ang eksakto nga password sa root user sa postgres server!

Postgres server (sudo user):

Kopyaha ang publiko nga yawe sa repository sa server nga adunay mga 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

Sa niini nga lakang, kini mangutana alang sa password gikan sa gamut user. Kinahanglan nimong isulod ang password sa root user sa repository!

Pagsusi:

Repository (gamut nga tiggamit, alang sa kaputli sa eksperimento):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres server (root user, para sa kaputli sa eksperimento):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Gisiguro namo nga maka-access kami nga walay mga problema.

Pag-set up sa usa ka postgres server

Postgres server (sudo user o gamut):

1. Atong tugotan ang "pagtuktok" sa postgres server gikan sa external ip. Aron mahimo kini, usba ang file postgresql.conf (naa sa /etc/postgresql/11/main folder) pinaagi sa pagdugang sa mosunod nga linya niini:

listen_addresses = '*'

Kung anaa na ang maong linya, i-uncomment kini o i-set ang parameter value sa '*'.

Sa file pg_hba.conf (naa usab sa folder /etc/postgresql/11/main) idugang ang mosunod nga mga linya:

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

diin:

hostssl/host - ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ Ρ‡Π΅Ρ€Π΅Π· SSL (ΠΈΠ»ΠΈ Π½Π΅Ρ‚)
all - Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎ всСм Π±Π°Π·Π°ΠΌ
all - имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ (всСм)
0.0.0.0/0 - маска сСти с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ
md5 - способ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ пароля

2. Himoa ang gikinahanglan nga mga setting sa postgresql.conf (naa sa folder /etc/postgresql/11/main) para magtrabaho ang pgbackrest:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Π“Π΄Π΅ main - Π½Π°Π·Π²Π°Π½ΠΈΠ΅ кластСра. ΠŸΡ€ΠΈ установкС postgres автоматичСски создаСт кластСр main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Himoa ang gikinahanglang mga setting sa pgbackrest configuration file (/etc/pgbackrest/pgbackrest.conf):

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

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

4. I-restart ang postgresql:

sudo service postgresql restart

Pag-set up sa usa ka repository server

Repository (gumagamit sa pgbackrest):

Himoa ang gikinahanglan nga mga setting sa configuration file 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 # ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ сколько Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹Ρ… бэкапов. Π’.Π΅. Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΠΏΠΎΠ»Π½Ρ‹Ρ… бэкапа ΠΈ Π²Ρ‹ создаСтС Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ, Ρ‚ΠΎ самый старый бэкап Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½. МоТно ΠΏΡ€ΠΎΠΈΠ·Π½ΠΎΡΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ "Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ… бэкапов" - ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с ротациями Π»ΠΎΠ³ΠΎΠ². Бпасибо @Aytuar Π·Π° исправлСниС ошибки.
start-fast=y # НачинаСт Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΡƒΡ‚ https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Paghimo og vault

Repository (gumagamit sa pgbackrest):

Paghimo og bag-ong storage para sa cluster nag-unang:

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

inspection

Postgres server (sudo user o gamut):

Susiha ang postgres server:

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

Repository (gumagamit sa pgbackrest):

Susiha ang repository server:

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

Among gisiguro nga sa output atong makita ang linya nga "check command end: completed successfully".

Gikapoy? Mopadayon kita sa labing makapaikag.

Paghimo og backup

Repository (gumagamit sa pgbackrest):

1. Paghimo og backup:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Among gisiguro nga ang backup nahimo na:

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

Ang pgbackrest maghimo sa unang bug-os nga backup. Kung gusto nimo, mahimo nimong ipadagan pag-usab ang backup nga mando ug siguruha nga ang sistema maghimo usa ka dugang nga backup.

Kung gusto nimo nga maghimo pag-usab sa usa ka bug-os nga backup, dayon ipiho ang usa ka dugang nga bandila:

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

Kung gusto nimo ang verbose console output, unya ipiho usab:

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

Pag-uli sa usa ka backup

Postgres server (sudo user o gamut):

1. Hunonga ang nagdagan nga cluster:

sudo pg_ctlcluster 11 main stop

2. Pag-uli gikan sa backup:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restore

Aron mapasig-uli ang database sa kahimtang sa katapusang FULL backup, gamita ang command nga walay pagpiho sa recovery_target:

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

Importante! Human sa pagkaayo, mahimo nga ang database nagbitay sa recovery mode (adunay mga sayup sama sa ERROR: dili makapatuman sa DROP DATABASE sa usa ka read-only nga transaksyon). Sa tinuod lang, wala gihapon ko kasabot kon unsay konektado niini. Nasulbad kini sama sa mosunod (kinahanglan nga maghulat og gamay human sa pagpatuman sa sugo):

sudo -u postgres psql -c "select pg_wal_replay_resume()"

Sa tinuud, posible nga ibalik ang usa ka piho nga backup pinaagi sa ngalan niini. Ania ra ako Akong ipakita ang usa ka link sa paghulagway niini nga bahin sa dokumentasyon. Gitambagan sa mga developer nga gamiton kini nga parameter nga adunay pag-amping ug ipasabut kung ngano. Gikan sa akong kaugalingon makadugang ko nga gigamit nako kini. Kung kinahanglan nimo kini, siguroha nga ang database wala na sa recovery mode pagkahuman sa pagkaayo (pilia ang pg_is_in_recovery() kinahanglan ipakita ang "f") ug kung mahimo, paghimo usa ka hingpit nga backup pagkahuman sa pagkaayo.

3. Sugdi ang cluster:

sudo pg_ctlcluster 11 main start

Human mapasig-uli ang backup, kinahanglan namong himoon ang ikaduhang backup:

Repository (gumagamit sa pgbackrest):

sudo pgbackrest --stanza=main backup

Mao ra. Sa konklusyon, gusto nako nga pahinumdoman ka nga dili gyud ko magpakaaron-ingnon nga usa ka senior dba ug gamiton ang mga panganod sa labing gamay nga higayon. Sa pagkakaron, ako mismo nagsugod sa pagtuon sa nagkalain-laing mga topiko sama sa backup, replication, monitoring, etc. ug nagsulat ako og gagmay nga mga taho mahitungod sa mga resulta aron makahimo og gamay nga kontribusyon sa komunidad ug magbilin og gagmay nga mga cheat sheet para sa akong kaugalingon.

Sa mosunod nga mga artikulo sulayan nako nga hisgutan ang dugang nga mga bahin - pagpasig-uli sa datos sa usa ka limpyo nga cluster, pag-encrypt sa mga backup ug pagmantala sa S3, pag-backup pinaagi sa rsync.

Source: www.habr.com

Idugang sa usa ka comment