Inkrementele postgresql-backups mei pgbackrest - in kursus foar in jonge fjochter fan 'e ûntwikkelder

Disclaimer

Ik bin in ûntwikkelder. Ik skriuw koade en ynteraksje mei de databank allinnich as brûker. Op gjin inkelde manier doch ik my foar as in systeembehearder, folle minder in dba. Mar…

It barde sa dat ik in reservekopy fan 'e postgresql-database moast organisearje. Gjin wolken - brûk gewoan SSH en soargje derfoar dat alles wurket sûnder om jild te freegjen. Wat dogge wy yn sokke gefallen? Dat is krekt, wy triuwe pgdump yn cron, reservekopy alles alle dagen nei it argyf, en as wy folslein ferlern binne, stjoere wy dit argyf earne fier fuort.

Dizze kear wie de muoite dat neffens de plannen de databank mei sa'n +- 100 MB per dei groeie soe. Fansels, nei in pear wiken sil de winsk om alles te backupjen mei pgdump ferdwine. Dit is wêr't inkrementele backups ta de rêding komme.

Nijsgjirrich? Wolkom by kat.

Inkrementele reservekopy is in soarte fan reservekopy as net alle boarne triemmen wurde kopiearre, mar allinnich nije en dy feroare sûnt it meitsjen fan de foarige kopy.

Lykas elke ûntwikkelder dy't ABSOLUT net ree wie (op dat stuit) om de kompleksjes fan postgres te begripen, woe ik de griene knop fine. No, jo witte, lykas yn AWS, DigitalOcean: jo drukke op ien knop - jo hawwe replikaasje, jo drukke op de twadde - jo hawwe backups ynsteld, de tredde - jo rôle alles in pear oeren werom. Ik fûn gjin knop of in prachtich GUI-ark. As jo ​​​​ien kenne (fergees of goedkeap), skriuw der dan oer yn 'e kommentaren.

Nei it googlejen fûn ik twa ark pgbarman и pgbackrest. It slagge my gewoan net mei de earste (hiel sparse dokumintaasje, ik besocht alles út te finen neffens âlde hantliedingen), mar mei de twadde blykte de dokumintaasje op 'e hichte te wêzen, mar net sûnder gebreken. Om ferienfâldigjen it wurk fan dyjingen dy't konfrontearre wurde mei in ferlykbere taak, dit artikel waard skreaun.

Nei it lêzen fan dit artikel sille jo leare hoe't jo inkrementele backups meitsje, bewarje se op in tsjinner op ôfstân (repository mei backups) en weromsette se yn gefal fan gegevensferlies of oare problemen op 'e haadtsjinner.

Tarieding fan

Om de hantlieding te reprodusearjen sille jo twa VPS nedich wêze. De earste sil de opslach wêze (it repository wêrop de backups wurde opslein), en de twadde, yn feite, de server sels mei postgres (yn myn gefal, ferzje 11 fan postgres).

Der wurdt oannommen dat jo op 'e server mei postgres root hawwe, sudo-brûker, postgres-brûker en postgres sels is ynstalleare (de postgres-brûker wurdt automatysk oanmakke by it ynstallearjen fan postgresql), en op' e repository-tsjinner is root- en sudo-brûker (yn 'e hantlieding de brûkersnamme pgbackrest sil brûkt wurde).

Dat jo minder problemen hawwe by it reprodusearjen fan de ynstruksjes, skriuw ik kursyf wêr, mei hokker brûker en mei hokker rjochten haw ik it kommando útfierd by it skriuwen en kontrolearjen fan it artikel.

Ynstallaasje fan pgbackrest

Repository (brûker pgbackrest):

1. Download it argyf fan pgbackrest en ferpleatse de ynhâld nei de map / 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. Ynstallearje de ôfhinklikens dy't nedich binne foar montage:

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

3. Pgbackrest gearstalle:

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

4. Kopiearje it útfierbere bestân nei de map /usr/bin:

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

5. Pgbackrest fereasket perl. Ynstallearje:

sudo apt-get install perl

6. Meitsje mappen foar logs, jou har bepaalde rjochten:

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

pgbackrest version

Postgres-tsjinner (sudo-brûker as root):

It proses fan it ynstallearjen fan pgbackrest op in server mei postgres is fergelykber mei it ynstallaasjeproses op it repository (ja, pgbackrest moat ynstalleare wurde op beide servers), mar yn 'e 6e paragraaf de twadde en lêste kommando's:

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

ferfange troch:

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

Ynstelle ynteraksje tusken servers fia wachtwurdleaze SSH

Om pgbackrest goed te wurkjen, is it nedich om de ynteraksje tusken de postgres-tsjinner en it repository te konfigurearjen mei it kaaibestân.

Repository (brûker pgbackrest):

Meitsje in kaaipaar:

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

Wês opsichtich! Wy rinne de boppesteande kommando's sûnder sudo.

Postgres-tsjinner (sudo-brûker as root):

Meitsje in kaaipaar:

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

Repository (sudo-brûker):

Kopiearje de iepenbiere kaai fan 'e postgres-tsjinner nei de repository-tsjinner:

(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

Op dizze stap sil it freegje om it wachtwurd foar de root-brûker. Jo moatte it wachtwurd fan 'e root-brûker fan' e postgres-tsjinner ynfiere!

Postgres-tsjinner (sudo-brûker):

Kopiearje de iepenbiere kaai fan 'e repository nei de tsjinner mei 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

Op dizze stap wurde jo frege om it wachtwurd foar de root-brûker. Jo moatte krekt it wachtwurd fan de root-brûker fan it repository ynfiere!

Wy kontrolearje:

Repository (root brûker, foar de suverens fan it eksperimint):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres-tsjinner (root-brûker, foar de suverens fan it eksperimint):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Wy soargje derfoar dat wy sûnder problemen tagong krije.

It opsetten fan in postgres-tsjinner

Postgres-tsjinner (sudo-brûker as root):

1. Lit ús tastean kloppe op de postgres tsjinner fan eksterne IPs. Om dit te dwaan, bewurkje de triem postgresql.conf (leit yn 'e /etc/postgresql/11/haadmap), it tafoegjen fan de line deroan:

listen_addresses = '*'

As sa'n rigel al bestiet, óf unkommentearje dizze of set de parameterwearde as '*' yn.

Yn triem pg_hba.conf (ek leit yn 'e map /etc/postgresql/11/main) foegje de folgjende rigels ta:

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

wêr:

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

2. Lit ús meitsje de nedige ynstellings yn postgresql.conf (it is yn 'e map /etc/postgresql/11/main) foar pgbackrest om te wurkjen:

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

3. Litte wy de nedige ynstellings meitsje yn it pgbackrest-konfiguraasjetriem (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Ferfarskje postgresql:

sudo service postgresql restart

It ynstellen fan in repository tsjinner

Repository (brûker fan pgbackrest):

Litte wy de nedige ynstellings meitsje yn it konfiguraasjetriem 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

It meitsjen fan in repository

Repository (brûker fan pgbackrest):

Meitsje in nije opslach foar it kluster main:

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

ynspeksje

Postgres-tsjinner (sudo-brûker as root):

Wy kontrolearje op de postgres-tsjinner:

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

Repository (brûker fan pgbackrest):

Wy kontrolearje op de repository-tsjinner:

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

Wy soargje derfoar dat wy yn 'e útfier de rigel sjogge "kontrolearje kommando ein: suksesfol foltôge".

Wurch? Lit ús gean nei it meast nijsgjirrige diel.

It meitsjen fan in reservekopy

Repository (brûker fan pgbackrest):

1. Fier in reservekopy út:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Soargje derfoar dat in reservekopy is makke:

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

Pgbackrest sil de earste folsleine reservekopy meitsje. As jo ​​​​wolle, kinne jo it reservekopykommando opnij útfiere en soargje derfoar dat it systeem in inkrementele reservekopy makket.

As jo ​​​​op 'e nij in folsleine reservekopy wolle meitsje, spesifisearje dan in ekstra flagge:

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

As jo ​​​​in detaillearre konsole-útfier wolle, spesifisearje dan ek:

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

In reservekopy weromsette

Postgres-tsjinner (sudo-brûker as root):

1. Stopje it rinnende kluster:

sudo pg_ctlcluster 11 main stop

2. Weromsette fan reservekopy:

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

Om de databank werom te setten nei de steat fan 'e lêste FULL backup, brûk it kommando sûnder recovery_target op te jaan:

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

Belangryk! Nei herstel kin it barre dat de databank fêst komt te sitten yn herstelmodus (d'r sille flaters wêze lykas ERROR: kin DROP DATABASE net útfiere yn in allinich-lêzen transaksje). Om earlik te wêzen haw ik noch net begrepen wêr't dit mei ferbûn is. De oplossing is as folget (jo moatte in bytsje wachtsje nei't it kommando is útfierd):

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

Yn feite is it mooglik om in spesifike reservekopy troch syn namme te herstellen. Hjir bin ik allinne Ik sil in keppeling leverje nei de beskriuwing fan dizze funksje yn 'e dokumintaasje. De ûntwikkelders advisearje dizze opsje mei foarsichtigens te brûken en ferklearje wêrom. Ik kin fan mysels tafoegje dat ik it brûkt haw. As jo ​​​​echt nedich binne, soargje derfoar dat de databank nei herstel de herstelmodus útgiet (selektearje pg_is_in_recovery () moat "f") sjen litte en, foar it gefal, meitsje in folsleine reservekopy nei herstel.

3. Start it kluster:

sudo pg_ctlcluster 11 main start

Nei it herstellen fan de reservekopy moatte wy in twadde reservekopy útfiere:

Repository (brûker fan pgbackrest):

sudo pgbackrest --stanza=main backup

Da's alles. Ta eintsjebeslút wol ik jim deroan herinnerje dat ik op gjin inkelde manier besykje my foar te dwaan as in senior dba en de wolken by de minste kâns brûke sil. Op it stuit begjin ik sels ferskate ûnderwerpen te studearjen lykas backup, replikaasje, tafersjoch, ensfh. en ik skriuw lytse reportaazjes oer de resultaten om in lytse bydrage oan de mienskip te leverjen en lytse cheat sheets foar mysels oer te litten.

Yn 'e folgjende artikels sil ik besykje te praten oer ekstra funksjes - gegevensherstel nei in skjinne kluster, fersifering fan backups en publisearjen nei S3, backups fia rsync.

Boarne: www.habr.com

Add a comment