Täiendavad postgresql-i varukoopiad pgbackrestiga - arendaja kursus noorele võitlejale

Vastutusest loobumine

Olen arendaja. Kirjutan koodi ja suhtlen andmebaasiga ainult kasutajana. Ma ei teeskle mitte mingil juhul süsteemiadministraatorit, veel vähem dba-d. Aga…

Juhtus nii, et mul oli vaja korraldada postgresql andmebaasi varukoopia. Pole pilvi – kasutage lihtsalt SSH-d ja veenduge, et kõik töötab ilma raha küsimata. Mida me sellistel juhtudel teeme? Just, me lükkame pgdumpi cronisse, varundame iga päev kõik arhiivi ja kui oleme täiesti kadunud, saadame selle arhiivi kuhugi kaugele.

Seekord oli raskuseks see, et plaanide järgi pidi andmebaas kasvama ca +- 100 MB päevas. Muidugi kaob paari nädala pärast soov pgdumpiga kõike varundada. Siin tulevad appi astmelised varukoopiad.

Huvitav? Tere tulemast kassi.

Täiendav varundamine on varukoopia tüüp, mille puhul ei kopeerita kõiki lähtefaile, vaid ainult uusi ja neid, mida on muudetud pärast eelmise koopia loomist.

Nagu iga arendaja, kes ei tahtnud (tol ajal) absoluutselt postgresi keerukust mõista, tahtsin leida rohelist nuppu. Noh, teate, nagu AWS-is, DigitalOceanis: vajutasite ühte nuppu - saite replikatsiooni, vajutasite teist - seadistasite varukoopiaid, kolmandat - rullisite kõik paar tundi tagasi. Ma ei leidnud nuppu ega ilusat GUI-tööriista. Kui teate mõnda (tasuta või odavat), kirjutage sellest kommentaaridesse.

Peale guugeldamist leidsin kaks tööriista pgbarman и pgseljatugi. Esimesega ma lihtsalt ei õnnestunud (väga hõre dokumentatsioon, püüdsin vanade juhendite järgi kõike selgeks teha), kuid teisega osutus dokumentatsioon tasemel, kuid mitte ilma puudusteta. See artikkel kirjutati, et lihtsustada nende inimeste tööd, kes seisavad silmitsi sarnase ülesandega.

Pärast selle artikli lugemist saate teada, kuidas teha järkjärgulisi varukoopiaid, salvestada need kaugserverisse (varukoopiatega hoidlasse) ja taastada andmete kadumise või muude põhiserveri probleemide korral.

Koolitus

Käsiraamatu taasesitamiseks vajate kahte VPS-i. Esimene on salvestusruum (hoidla, kuhu varukoopiaid salvestatakse) ja teine, tegelikult server ise koos postgresiga (minu puhul postgresi versioon 11).

Eeldatakse, et postgres-iga serveris on root, sudo kasutaja, postgres kasutaja ja postgres ise on installitud (postgres-i kasutaja luuakse automaatselt postgresql-i installimisel) ning hoidlaserveris on root ja sudo kasutaja (juhendis kasutatakse kasutajanime pgbackrest).

Et teil oleks juhendite taasesitamisel vähem probleeme, kirjutan kaldkirjas kus, millise kasutajaga ja milliste õigustega ma käsu täitsin artiklit kirjutades ja kontrollides.

pgbackresti paigaldamine

Hoidla (kasutaja pgbackrest):

1. Laadige arhiiv alla pgbackrestist ja teisaldage selle sisu kausta /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. Paigaldage kokkupanekuks vajalikud sõltuvused:

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

3. Pg-seljatoe kokkupanek:

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

4. Kopeerige käivitatav fail kataloogi /usr/bin:

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

5. Pgbackrest nõuab perli. Installige:

sudo apt-get install perl

6. Looge logide jaoks kataloogid, andke neile teatud õigused:

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

pgbackrest version

Postgresi server (sudo kasutaja või root):

Pgbackresti installimise protsess postgresiga serverisse sarnaneb hoidlasse installimisega (jah, pgbackrest peab olema installitud mõlemasse serverisse), kuid 6. lõigus käske teine ​​ja viimane:

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

asendada järgmisega:

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

Serveritevahelise suhtluse seadistamine paroolita SSH kaudu

Pgbackresti korrektseks tööks on vaja võtmefaili abil konfigureerida postgresi serveri ja hoidla vaheline suhtlus.

Hoidla (kasutaja pgbackrest):

Looge võtmepaar:

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

Hoiatus! Käitame ülaltoodud käsud ilma sudota.

Postgresi server (sudo kasutaja või root):

Looge võtmepaar:

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

Hoidla (sudo kasutaja):

Kopeerige postgresi serveri avalik võti hoidla serverisse:

(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

Selles etapis küsitakse teilt juurkasutaja parooli. Peate sisestama postgresi serveri juurkasutaja parooli!

Postgresi server (sudo kasutaja):

Kopeerige hoidla avalik võti serverisse koos postgresiga:

(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

Selles etapis küsitakse teilt juurkasutaja parooli. Peate sisestama täpselt hoidla juurkasutaja parooli!

Kontrollime:

Hoidla (juurkasutaja katse puhtuse huvides):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgresi server (juurkasutaja katse puhtuse huvides):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Tagame, et pääseme probleemideta ligi.

Postgresi serveri seadistamine

Postgresi server (sudo kasutaja või root):

1. Lubame väliste IP-aadresside kaudu koputada postgres-serverile. Selleks redigeerige faili postgresql.conf (asub /etc/postgresql/11/peakaustas), lisades sellele rea:

listen_addresses = '*'

Kui selline rida on juba olemas, eemaldage see kommentaaridest või määrake parameetri väärtuseks "*".

Failis pg_hba.conf (asub ka kaustas /etc/postgresql/11/main) lisage järgmised read:

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

kus:

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

2. Teeme sisse vajalikud seadistused postgresql.conf (see on kaustas /etc/postgresql/11/main), et pgbackrest töötaks:

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

3. Teeme vajalikud seadistused pgbackrest konfiguratsioonifailis (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Laadige uuesti postgresql:

sudo service postgresql restart

Hoidlaserveri seadistamine

Hoidla (pgbackresti kasutaja):

Teeme vajalikud seadistused konfiguratsioonifailis pgseljatugi
(/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

Hoidla loomine

Hoidla (pgbackresti kasutaja):

Looge klastri jaoks uus salvestusruum põhiline:

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

Проверка

Postgresi server (sudo kasutaja või root):

Kontrollime postgresi serveris:

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

Hoidla (pgbackresti kasutaja):

Kontrollime hoidlaserveris:

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

Veenduge, et väljundis näeme rida "kontrolli käsu lõppu: edukalt lõpetatud".

Väsinud? Liigume edasi kõige huvitavama osa juurde.

Varukoopia tegemine

Hoidla (pgbackresti kasutaja):

1. Tehke varukoopia:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Veenduge, et varukoopia oleks loodud:

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

Pgbackrest loob esimese täieliku varukoopia. Soovi korral saate varunduskäsu uuesti käivitada ja veenduda, et süsteem loob järkjärgulise varukoopia.

Kui soovite uuesti täieliku varukoopia teha, määrake täiendav lipp:

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

Kui soovite konsooli üksikasjalikku väljundit, määrake ka:

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

Varukoopia taastamine

Postgresi server (sudo kasutaja või root):

1. Peatage töötav klaster:

sudo pg_ctlcluster 11 main stop

2. Varukoopiast taastamine:

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

Andmebaasi taastamiseks viimase FULL varukoopia olekusse kasutage käsku ilma recovery_target määramata:

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

Tähtis! Pärast taastamist võib juhtuda, et andmebaas takerdub taasterežiimi (esineb tõrkeid nagu VIGA: kirjutuskaitstud tehingus ei saa DROP DATABASE'i käivitada). Ausalt öeldes pole ma veel aru saanud, millega see seotud on. Lahendus on järgmine (peate pärast käsu täitmist veidi ootama):

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

Tegelikult on võimalik konkreetne varukoopia selle nime järgi taastada. Siin ma olen ainult Lisan dokumentatsioonis lingi selle funktsiooni kirjeldusele. Arendajad soovitavad seda võimalust kasutada ettevaatlikult ja selgitavad, miks. Võin enda kohta lisada, et kasutasin seda. Kui tõesti vaja, siis veendu, et pärast taastamist väljub andmebaas taasterežiimist (valige pg_is_in_recovery() peaks näitama “f”) ja tee pärast taastamist igaks juhuks täielik varukoopia.

3. Käivitage klaster:

sudo pg_ctlcluster 11 main start

Pärast varukoopia taastamist peame tegema teise varukoopia:

Hoidla (pgbackresti kasutaja):

sudo pgbackrest --stanza=main backup

See on kõik. Kokkuvõtteks tuletan meelde, et ma ei ürita mingil juhul teeselda, et olen vanem dba ja kasutan pilvi vähimalgi võimalusel. Hetkel hakkan ise uurima erinevaid teemasid nagu varundamine, replikatsioon, monitooring jne. ja kirjutan tulemustest väikseid raporteid, et anda väike panus kogukonna heaks ja jätta endale väikesed petulehed.

Järgmistes artiklites püüan rääkida lisavõimalustest - andmete taastamine puhtasse klastrisse, varukoopiate krüpteerimine ja S3-le avaldamine, varukoopiad rsynci kaudu.

Allikas: www.habr.com

Lisa kommentaar