Incremental postgresql backups na may pgbackrest - isang kurso para sa isang batang manlalaban mula sa developer

Disclaimer

Ako ay isang developer. Sumulat ako ng code at nakikipag-ugnayan sa database bilang isang user lamang. Sa anumang paraan ay hindi ako nagpapanggap na isang tagapangasiwa ng system, higit na hindi isang dba. Pero…

Nagkataon na kailangan kong ayusin ang isang backup ng database ng postgresql. Walang ulap - gumamit lang ng SSH at tiyaking gumagana ang lahat nang hindi humihingi ng pera. Ano ang gagawin natin sa mga ganitong pagkakataon? Tama, itinutulak namin ang pgdump sa cron, bina-backup ang lahat sa archive araw-araw, at kung tuluyan na kaming nawala, ipinapadala namin ang archive na ito sa isang lugar na malayo.

Sa oras na ito ang kahirapan ay na ayon sa mga plano, ang database ay dapat na lumago ng humigit-kumulang +- 100 MB bawat araw. Siyempre, pagkatapos ng ilang linggo ang pagnanais na i-backup ang lahat gamit ang pgdump ay mawawala. Ito ay kung saan incremental backups dumating sa rescue.

Interesting? Maligayang pagdating sa pusa.

Ang incremental backup ay isang uri ng backup kapag hindi lahat ng source file ay kinopya, ngunit ang mga bago lang at ang mga nabago mula noong ginawa ang nakaraang kopya.

Tulad ng sinumang developer na talagang ayaw (sa oras na iyon) na maunawaan ang mga intricacies ng mga postgres, gusto kong hanapin ang berdeng button. Well, alam mo, tulad ng sa AWS, DigitalOcean: pinindot mo ang isang button - nakakuha ka ng replikasyon, pinindot mo ang pangalawa - nag-set up ka ng mga backup, ang pangatlo - ni-roll mo ang lahat ng ilang oras. Wala akong nakitang button o magandang GUI tool. Kung alam mo ang isa (libre o mura), isulat ang tungkol dito sa mga komento.

Pagkatapos mag-googling nakakita ako ng dalawang tool pgbarman ΠΈ pgbackrest. Hindi lang ako nagtagumpay sa una (napakahiwa-hiwalay na dokumentasyon, sinubukan kong malaman ang lahat ayon sa mga lumang manual), ngunit sa pangalawa ang dokumentasyon ay naging hanggang sa par, ngunit hindi walang mga bahid. Upang gawing simple ang gawain ng mga nahaharap sa isang katulad na gawain, isinulat ang artikulong ito.

Matapos basahin ang artikulong ito, matututunan mo kung paano gumawa ng mga incremental na backup, i-save ang mga ito sa isang malayong server (imbakan na may mga backup) at ibalik ang mga ito sa kaso ng pagkawala ng data o iba pang mga problema sa pangunahing server.

Pagsasanay

Para kopyahin ang manwal kakailanganin mo ng dalawang VPS. Ang una ay ang imbakan (ang imbakan kung saan maiimbak ang mga backup), at ang pangalawa, sa katunayan, ang server mismo na may mga postgres (sa aking kaso, bersyon 11 ng mga postgres).

Ipinapalagay na sa server na may mga postgres mayroon kang root, sudo user, postgres user at postgres mismo ay naka-install (ang postgres user ay awtomatikong nilikha kapag nag-i-install ng postgresql), at sa repository server mayroong root at sudo user (sa manual ang user name pgbackrest ang gagamitin) .

Upang magkaroon ka ng mas kaunting mga problema sa paggawa ng mga tagubilin, sumulat ako sa italics kung saan, sa kung anong gumagamit at kung anong mga karapatan ko pinatupad ang utos habang sinusulat at sinusuri ang artikulo.

Pag-install ng pgbackrest

Imbakan (user pgbackrest):

1. I-download ang archive mula sa pgbackrest at ilipat ang mga nilalaman nito 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 na kailangan para sa pagpupulong:

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

3. Pagtitipon ng pgbackrest:

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

4. Kopyahin ang executable file sa /usr/bin na direktoryo:

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

5. Ang pgbackrest ay nangangailangan ng perl. I-install:

sudo apt-get install perl

6. Lumikha ng mga direktoryo para sa mga log, bigyan sila ng ilang mga karapatan:

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

pgbackrest version

Postgres server (sudo user o root):

Ang proseso ng pag-install ng pgbackrest sa isang server na may mga postgres ay katulad ng proseso ng pag-install sa repository (oo, dapat na mai-install ang pgbackrest sa parehong mga server), ngunit sa ika-6 na talata ang pangalawa at huling utos:

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

palitan ng:

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

Pagse-set up ng pakikipag-ugnayan sa pagitan ng mga server sa pamamagitan ng SSH na walang password

Upang gumana nang tama ang pgbackrest, kinakailangang i-configure ang pakikipag-ugnayan sa pagitan ng postgres server at ng repository gamit ang key file.

Imbakan (user pgbackrest):

Gumawa ng key pair:

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

Warning! Pinapatakbo namin ang mga utos sa itaas nang walang sudo.

Postgres server (sudo user o root):

Gumawa ng key pair:

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

Imbakan (sudo user):

Kopyahin ang pampublikong key ng postgres server 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 hakbang na ito hihilingin sa iyo ang password para sa root user. Kailangan mong ipasok ang password ng root user ng postgres server!

Postgres server (sudo user):

Kopyahin ang repositoryong pampublikong susi sa server na may 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 hakbang na ito hihilingin sa iyo ang password para sa root user. Kailangan mong ipasok ang eksaktong password ng root user ng repository!

Namin suriin:

Repository (root user, para sa kadalisayan ng eksperimento):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres server (root user, para sa kadalisayan ng eksperimento):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Tinitiyak namin na makakakuha kami ng access nang walang problema.

Pagse-set up ng postgres server

Postgres server (sudo user o root):

1. Payagan natin ang pagkatok sa postgres server mula sa mga panlabas na IP. Upang gawin ito, i-edit ang file postgresql.conf (matatagpuan sa /etc/postgresql/11/main folder), pagdaragdag ng linya dito:

listen_addresses = '*'

Kung mayroon nang ganoong linya, i-uncomment ito o itakda ang value ng parameter bilang '*'.

Nasa file pg_hba.conf (matatagpuan din sa folder /etc/postgresql/11/main) idagdag ang mga sumusunod na linya:

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

kung saan:

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

2. Gawin natin ang mga kinakailangang setting sa postgresql.conf (ito ay nasa folder /etc/postgresql/11/main) para gumana ang pgbackrest:

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

3. Gawin natin ang mga kinakailangang 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-reload ang postgresql:

sudo service postgresql restart

Pagse-set up ng repository server

Imbakan (pgbackrest user):

Gawin natin ang mga kinakailangang 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 # ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ сколько Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹Ρ… бэкапов. Π’.Π΅. Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΠΏΠΎΠ»Π½Ρ‹Ρ… бэкапа ΠΈ Π²Ρ‹ создаСтС Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ - ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ вмСстС с ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. 
start-fast=y # НачинаСт Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΡƒΡ‚ https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Paglikha ng repositoryo

Imbakan (pgbackrest user):

Gumawa ng bagong storage para sa cluster pangunahin:

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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°

Postgres server (sudo user o root):

Sinusuri namin ang postgres server:

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

Imbakan (pgbackrest user):

Sinusuri namin ang server ng repositoryo:

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

Tinitiyak namin na sa output makikita namin ang linya na "suriin ang pagtatapos ng command: matagumpay na nakumpleto".

Pagod? Lumipat tayo sa pinakakawili-wiling bahagi.

Gumagawa ng backup

Imbakan (pgbackrest user):

1. Magsagawa ng backup:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Tiyaking nakagawa na ng backup:

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

Gagawin ng Pgbackrest ang unang buong backup. Kung gusto mo, maaari mong patakbuhin muli ang backup na command at tiyaking gagawa ang system ng incremental backup.

Kung gusto mong gumawa muli ng isang buong backup, pagkatapos ay tumukoy ng karagdagang flag:

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

Kung gusto mo ng detalyadong output ng console, tukuyin din ang:

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

Pagpapanumbalik ng backup

Postgres server (sudo user o root):

1. Ihinto ang tumatakbong cluster:

sudo pg_ctlcluster 11 main stop

2. Pagpapanumbalik mula sa backup:

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

3. Simulan ang cluster:

sudo pg_ctlcluster 11 main start

Pagkatapos ibalik ang backup, kailangan naming magsagawa ng pangalawang backup:

Imbakan (pgbackrest user):

sudo pgbackrest --stanza=main backup

Iyon lang. Sa konklusyon, nais kong ipaalala sa iyo na hindi ko sinusubukan na magpanggap na isang senior dba at gagamitin ang mga ulap sa pinakamaliit na pagkakataon. Sa kasalukuyan, ako mismo ay nagsisimulang mag-aral ng iba't ibang mga paksa tulad ng backup, replication, monitoring, atbp. at sumusulat ako ng maliliit na ulat tungkol sa mga resulta upang makapagbigay ng maliit na kontribusyon sa komunidad at mag-iwan ng maliliit na cheat sheet para sa aking sarili.

Sa mga sumusunod na artikulo ay susubukan kong pag-usapan ang tungkol sa mga karagdagang tampok - pagbawi ng data sa isang malinis na kumpol, pag-encrypt ng mga backup at pag-publish sa S3, pag-backup sa pamamagitan ng rsync.

Pinagmulan: www.habr.com

Magdagdag ng komento