Inkrementālas postgresql dublējumkopijas ar pgbackrest — izstrādātāja kurss jaunam cīnītājam

Atruna

Es esmu izstrādātājs. Es rakstu kodu un mijiedarbojos ar datu bāzi tikai kā lietotājs. Es nekādā gadījumā neizliekos par sistēmas administratoru, vēl jo mazāk par dba. Bet…

Sagadījās, ka man vajadzēja organizēt postgresql datu bāzes dublējumu. Nav mākoņu – vienkārši izmantojiet SSH un pārliecinieties, ka viss darbojas, neprasot naudu. Ko mēs darām šādos gadījumos? Tieši tā, mēs iespiežam pgdump iekšā cron, katru dienu dublējam visu arhīvā un, ja esam galīgi apmaldījušies, nosūtām šo arhīvu kaut kur tālu.

Šoreiz grūtības sagādāja tas, ka saskaņā ar plāniem datubāzei bija paredzēts pieaugt par aptuveni +- 100 MB dienā. Protams, pēc pāris nedēļām vēlme visu dublēt ar pgdump pazudīs. Šeit palīgā nāk papildu dublējumkopijas.

Interesanti? Laipni lūdzam kaķī.

Inkrementālā dublēšana ir dublēšanas veids, kad tiek kopēti ne visi avota faili, bet tikai jauni un tie, kas mainīti kopš iepriekšējās kopijas izveides.

Tāpat kā jebkurš izstrādātājs, kurš ABSOLŪTI nevēlējās (tajā laikā) izprast postgres sarežģītību, es gribēju atrast zaļo pogu. Nu, jūs zināt, tāpat kā AWS, DigitalOcean: jūs nospiedāt vienu pogu - jums bija replikācija, jūs nospiedāt otro - jūs iestatījāt dublējumus, trešo - jūs visu atritinājāt pāris stundas. Es neatradu pogu vai skaistu GUI rīku. Ja zini kādu (bez maksas vai lēti), raksti par to komentāros.

Pēc googlēšanas es atradu divus rīkus pgbarman и pgbackrest. Ar pirmo man vienkārši neveicās (ļoti skopa dokumentācija, mēģināju visu izdomāt pēc vecām rokasgrāmatām), bet ar otro dokumentācija izrādījās līdzvērtīga, bet ne bez trūkumiem. Lai vienkāršotu darbu tiem, kuri saskaras ar līdzīgu uzdevumu, šis raksts tika uzrakstīts.

Pēc šī raksta izlasīšanas jūs uzzināsit, kā izveidot papildu dublējumus, saglabāt tos attālajā serverī (repozitorijā ar dublējumkopijām) un atjaunot tos datu zuduma vai citu problēmu gadījumā galvenajā serverī.

Treniņš

Lai pavairotu rokasgrāmatu, jums būs nepieciešami divi VPS. Pirmā būs krātuve (repozitorijs, kurā tiks glabāti dublējumkopijas), bet otrā, faktiski, pats serveris ar postgres (manā gadījumā postgres 11. versija).

Tiek pieņemts, ka serverī ar postgres jums ir root, sudo lietotājs, postgres lietotājs un pats postgres ir instalēts (postgres lietotājs tiek izveidots automātiski, instalējot postgresql), un repozitorija serverī ir root un sudo lietotājs (rokasgrāmatā tiks izmantots lietotājvārds pgbackrest).

Lai jums būtu mazāk problēmu, atkārtojot instrukcijas, es rakstu slīprakstā kur, ar kādu lietotāju un ar kādām tiesībām es izpildīju komandu rakstot un pārbaudot rakstu.

pgbackrest uzstādīšana

Repozitorijs (lietotāja pgbackrest):

1. Lejupielādējiet arhīvu no vietnes pgbackrest un pārsūtiet tā saturu uz mapi /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. Uzstādiet montāžai nepieciešamās atkarības:

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

3. Pg atzveltnes salikšana:

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

4. Kopēt izpildāmo failu /usr/bin direktorijā:

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

5. Pgbackrest prasa perl. Uzstādīt:

sudo apt-get install perl

6. Izveidojiet žurnālu katalogus, piešķiriet tiem noteiktas tiesības:

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. Pārbaudiet:

pgbackrest version

Postgres serveris (sudo lietotājs vai root):

Pgbackrest instalēšanas process serverī ar postgres ir līdzīgs instalēšanas procesam repozitorijā (jā, pgbackrest ir jāinstalē abos serveros), bet 6.rindkopā otrā un pēdējā komanda:

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

aizvietot ar:

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

Mijiedarbības iestatīšana starp serveriem, izmantojot bezparoles SSH

Lai pgbackrest darbotos pareizi, ir jākonfigurē mijiedarbība starp postgres serveri un repozitoriju, izmantojot atslēgas failu.

Repozitorijs (lietotāja pgbackrest):

Izveidojiet atslēgu pāri:

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

Uzmanību! Mēs izpildām iepriekš minētās komandas bez sudo.

Postgres serveris (sudo lietotājs vai root):

Izveidojiet atslēgu pāri:

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

Repozitorijs (sudo lietotājs):

Kopējiet postgres servera publisko atslēgu uz repozitorija serveri:

(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

Šajā darbībā jums tiks lūgts ievadīt root lietotāja paroli. Jums jāievada postgres servera root lietotāja parole!

Postgres serveris (sudo lietotājs):

Kopējiet repozitorija publisko atslēgu uz serveri ar 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

Šajā darbībā jums tiks lūgts ievadīt root lietotāja paroli. Jums jāievada tieši repozitorija root lietotāja parole!

Pārbaude:

Repozitorijs (saknes lietotājs eksperimenta tīrības labad):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres serveris (saknes lietotājs eksperimenta tīrības labad):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Mēs nodrošinām piekļuvi bez problēmām.

Postgres servera iestatīšana

Postgres serveris (sudo lietotājs vai root):

1. Atļausim pieklauvēt postgres serverim no ārējiem IP. Lai to izdarītu, rediģējiet failu postgresql.conf (atrodas mapē /etc/postgresql/11/main), pievienojot tai rindu:

listen_addresses = '*'

Ja šāda rindiņa jau pastāv, vai nu noņemiet komentāru, vai iestatiet parametra vērtību kā “*”.

Failā pg_hba.conf (atrodas arī mapē /etc/postgresql/11/main) pievienojiet šādas rindas:

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

ja:

hostssl/host - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля

2. Veicam nepieciešamos iestatījumus postgresql.conf (tas atrodas mapē /etc/postgresql/11/main), lai pgbackrest darbotos:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Где main - название кластера. При установке postgres автоматически создает кластер main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Veicam nepieciešamos iestatījumus pgbackrest konfigurācijas failā (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Pārlādēt postgresql:

sudo service postgresql restart

Repozitorija servera iestatīšana

Repozitorijs (pgbackrest lietotājs):

Konfigurācijas failā veiksim nepieciešamos iestatījumus 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

Repozitorija izveide

Repozitorijs (pgbackrest lietotājs):

Izveidojiet klasterim jaunu krātuvi galvenais:

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

Проверка

Postgres serveris (sudo lietotājs vai root):

Mēs pārbaudām postgres serverī:

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

Repozitorijs (pgbackrest lietotājs):

Mēs pārbaudām repozitorija serverī:

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

Mēs pārliecināmies, ka izvadā mēs redzam rindu “pārbaudīt komandas beigas: veiksmīgi pabeigta”.

Noguris? Pāriesim pie interesantākās daļas.

Dublējuma veidošana

Repozitorijs (pgbackrest lietotājs):

1. Veiciet dublējumu:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Pārliecinieties, vai ir izveidots dublējums:

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

Pgbackrest izveidos pirmo pilno dublējumu. Ja vēlaties, varat vēlreiz palaist dublēšanas komandu un pārliecināties, ka sistēma izveido papildu dublējumu.

Ja vēlaties vēlreiz izveidot pilnu dublējumu, norādiet papildu karogu:

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

Ja vēlaties detalizētu konsoles izvadi, norādiet arī:

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

Dublējuma atjaunošana

Postgres serveris (sudo lietotājs vai root):

1. Apturiet darbīgo kopu:

sudo pg_ctlcluster 11 main stop

2. Atjaunošana no dublējuma:

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

Lai atjaunotu datubāzi uz pēdējās FULL dublējuma stāvokli, izmantojiet komandu, nenorādot recovery_target:

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

Svarīgs! Pēc atkopšanas var gadīties, ka datu bāze iestrēgst atkopšanas režīmā (tiks parādītas kļūdas, piemēram, ERROR: nevar izpildīt DROP DATABASE tikai lasāmā transakcijā). Godīgi sakot, es vēl neesmu sapratis, ar ko tas ir saistīts. Risinājums ir šāds (pēc komandas izpildes jums būs nedaudz jāgaida):

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

Faktiski ir iespējams atjaunot konkrētu dublējumu pēc tā nosaukuma. Šeit esmu tikai es Es sniegšu saiti uz šīs funkcijas aprakstu dokumentācijā. Izstrādātāji iesaka izmantot šo opciju piesardzīgi un paskaidro, kāpēc. No sevis varu piebilst, ka izmantoju. Ja jums patiešām ir nepieciešams, pārliecinieties, vai pēc atkopšanas datu bāze iziet no atkopšanas režīma (izvēlieties pg_is_in_recovery(), lai parādītu “f”), un katram gadījumam pēc atkopšanas izveidojiet pilnu dublējumu.

3. Sāciet klasteru:

sudo pg_ctlcluster 11 main start

Pēc dublējuma atjaunošanas mums ir jāveic otra dublēšana:

Repozitorijs (pgbackrest lietotājs):

sudo pgbackrest --stanza=main backup

Tas ir viss. Nobeigumā vēlos atgādināt, ka nekādā gadījumā nemēģinu izlikties par senioru dba un izmantošu mākoņus pie mazākās izdevības. Šobrīd pats sāku pētīt dažādas tēmas kā dublēšana, replikācija, monitorings utt. un es rakstu nelielas atskaites par rezultātiem, lai sniegtu nelielu pienesumu sabiedrībai un atstātu sev mazas krāpšanās lapas.

Nākamajos rakstos mēģināšu runāt par papildu iespējām - datu atkopšanu uz tīru klasteru, dublējumu šifrēšanu un publicēšanu S3, dublēšanu caur rsync.

Avots: www.habr.com

Pievieno komentāru