Inkrementele postgresql-rugsteun met pgbackrest - 'n jong vegterkursus van 'n ontwikkelaar

Vrywaring

Ek is 'n ontwikkelaar. Ek skryf kode, interaksie met die databasis slegs as 'n gebruiker. Ek gee geensins voor as 'n stelseladministrateur en boonop 'n dba nie. Maar …

Dit het so gebeur dat ek 'n rugsteun van die postgresql-databasis moes organiseer. Geen wolke nie - hou SSH en laat alles werk en vra nie vir geld nie. Wat doen ons in sulke gevalle? Dis reg, ons stoot pgdump in cron, rugsteun alles elke dag na die argief, en as ons heeltemal uitmekaar val, stuur ons hierdie argief iewers ver weg.

Hierdie keer was die moeilikheid dat, volgens die planne, die databasis veronderstel was om met ongeveer + - 100 MB per dag te groei. Na 'n paar weke sal die begeerte om alles met pgdump te rugsteun natuurlik verdwyn. Dit is waar inkrementele rugsteun handig te pas kom.

Interessant? Welkom onder kat.

'n Inkrementele rugsteun is 'n soort rugsteun wanneer nie alle bronlêers gekopieer word nie, maar slegs nuwes en veranderde sedert die vorige kopie geskep is.

Soos enige ontwikkelaar wat (op daardie tydstip) TOTAAL onwillig was om die ingewikkeldhede van postgres te verstaan, wou ek 'n groen knoppie vind. Wel, jy weet, soos in AWS, DigitalOcean: ek het een knoppie gedruk - ek het replikasie gekry, ek het die tweede gedruk - ek het rugsteun opgestel, die derde - alles het 'n paar uur gelede teruggedraai. Ek het nie 'n knoppie en 'n pragtige GUI-instrument gevind nie. As jy een ken (gratis of goedkoop) - skryf daaroor in die kommentaar.

Ek het twee gereedskap gevind pgbarman и pg rugleuning. Met die eerste een het ek eenvoudig nie geslaag nie (baie swak dokumentasie, ek het alles volgens ou handleidings probeer optel), maar die tweede een het geblyk op die vlak van dokumentasie te wees, maar nie sonder 'n fout nie. Om die werk van diegene wat 'n soortgelyke taak in die gesig staar te vereenvoudig, is hierdie artikel geskryf.

Nadat u hierdie artikel gelees het, sal u leer hoe om inkrementele rugsteun te maak, dit op 'n afgeleë bediener (bewaarplek met rugsteun) te stoor en dit te herstel in geval van dataverlies of ander probleme op die hoofbediener.

Opleiding

Jy sal twee VPS nodig hê om die handleiding te speel. Die eerste sal die bewaarplek wees (die bewaarplek waarop die rugsteun sal wees), en die tweede, in werklikheid, die bediener self met postgres (in my geval, weergawe 11 van postgres).

Daar word aanvaar dat op die bediener met postgres jy root, sudo gebruiker, postgres gebruiker en postgres self geïnstalleer het (die postgres gebruiker word outomaties geskep wanneer postgresql geïnstalleer word), en op die repository server het jy root en sudo gebruiker (gebruikersnaam pgbackrest sal in die handleiding gebruik word).

Sodat jy minder probleme ondervind wanneer jy die instruksies weergee – skryf ek in kursief waar, met watter gebruiker en met watter regte ek die opdrag uitgevoer het terwyl jy die artikel skryf en hersien.

pg rugleuning installasie

Bewaarplek (pgbackrest-gebruiker):

1. Laai die argief van pgbackrest af en dra die inhoud daarvan oor na die /build-lêergids:

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

2. Installeer die afhanklikhede wat nodig is vir die samestelling:

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

3. Ons versamel pgrugleuning:

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

4. Kopieer die uitvoerbare lêer na die /usr/bin-gids:

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

5. Pgrugleuning vereis perl. Installeer:

sudo apt-get install perl

6. Skep gidse vir logs, gee hulle sekere regte:

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

pgbackrest version

Postgres-bediener (sudo-gebruiker of wortel):

Die proses om pgbackrest op 'n postgres-bediener te installeer is soortgelyk aan installering op 'n bewaarplek (ja, pgbackrest moet op beide bedieners geïnstalleer word), maar in die 6de paragraaf, die tweede en laaste opdrag:

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

vervang met:

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

Die opstel van kommunikasie tussen bedieners via wagwoordlose SSH

Om pgbackrest korrek te laat werk, is dit nodig om die interaksie tussen die postgres-bediener en die bewaarplek met behulp van die sleutellêer op te stel.

Bewaarplek (pgbackrest-gebruiker):

Skep 'n paar sleutels:

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

Внимание! Die bogenoemde opdragte word sonder sudo uitgevoer.

Postgres-bediener (sudo-gebruiker of wortel):

Skep 'n paar sleutels:

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

Bewaarplek (sudo-gebruiker):

Kopieer die publieke sleutel van die postgres-bediener na die bewaarplekbediener:

(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

By hierdie stap sal dit die wagwoord van die wortelgebruiker vra. U moet presies die wagwoord van die wortelgebruiker van die postgres-bediener invoer!

Postgres-bediener (sudo-gebruiker):

Kopieer die publieke sleutel van die bewaarplek na die bediener met 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

By hierdie stap sal dit die wagwoord van die wortelgebruiker vra. U moet die wagwoord van die wortelgebruiker van die bewaarplek invoer!

Ons kyk na:

Bewaarplek (wortelgebruiker, vir die suiwerheid van die eksperiment):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres-bediener (wortelgebruiker, vir die suiwerheid van die eksperiment):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Ons maak seker dat ons toegang kry sonder probleme.

Stel 'n postgres-bediener op

Postgres-bediener (sudo-gebruiker of wortel):

1. Kom ons laat "klop" op die postgres-bediener vanaf eksterne ip toe. Om dit te doen, wysig die lêer postgresql.conf (geleë in die /etc/postgresql/11/hoofvouer) deur die volgende reël daarby te voeg:

listen_addresses = '*'

As so 'n reël reeds bestaan, óf ontmerk dit óf stel die parameterwaarde na '*'.

In lêer pg_hba.conf (ook geleë in die gids /etc/postgresql/11/main) voeg die volgende reëls by:

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

waar:

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

2. Kom ons maak die nodige instellings in postgresql.conf (dit is in die gids /etc/postgresql/11/main) vir pgrugleuning om te werk:

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

3. Maak die nodige instellings in die pgbackrest-konfigurasielêer (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Herbegin postgresql:

sudo service postgresql restart

Die opstel van 'n bewaarplekbediener

Bewaarplek (pgbackrest-gebruiker):

Maak die nodige instellings in die konfigurasielêer pg rugleuning
(/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

Skep 'n kluis

Bewaarplek (pgbackrest-gebruiker):

Skep 'n nuwe berging vir die groepering hoof:

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

Проверка

Postgres-bediener (sudo-gebruiker of wortel):

Kyk op postgres-bediener:

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

Bewaarplek (pgbackrest-gebruiker):

Kyk op die bewaarplekbediener:

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

Ons maak seker dat ons in die uitvoer die reël sien "kontroleer opdrag einde: suksesvol voltooi".

Moeg? Kom ons gaan oor na die interessantste.

Maak 'n rugsteun

Bewaarplek (pgbackrest-gebruiker):

1. Voer rugsteun uit:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Ons maak seker dat die rugsteun geskep is:

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

pgbackrest sal die eerste volledige rugsteun skep. As jy wil, kan jy die rugsteunopdrag weer uitvoer en seker maak dat die stelsel 'n inkrementele rugsteun skep.

As jy 'n volledige rugsteun wil maak, spesifiseer dan 'n bykomende vlag:

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

As jy uitgebreide konsole-uitvoer wil hê, spesifiseer dan ook:

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

Herstel tans 'n rugsteun

Postgres-bediener (sudo-gebruiker of wortel):

1. Stop die lopende groep:

sudo pg_ctlcluster 11 main stop

2. Herstel vanaf 'n rugsteun:

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

Om die databasis te herstel na die toestand van die laaste VOLLE rugsteun, gebruik die opdrag sonder om recovery_target te spesifiseer:

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

Belangrik! Na herstel kan dit gebeur dat die databasis in herstelmodus vashaak (daar sal foute wees soos FOUT: kan nie DROP DATABASE in 'n leesalleen-transaksie uitvoer nie). Om eerlik te wees, ek het nog nie verstaan ​​waarmee dit verband hou nie. Die oplossing is soos volg (jy sal 'n bietjie moet wag nadat die opdrag uitgevoer is):

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

Trouens, dit is moontlik om 'n spesifieke rugsteun op sy naam te herstel. Hier is ek net Ek sal 'n skakel verskaf na die beskrywing van hierdie kenmerk in die dokumentasie. Die ontwikkelaars beveel aan om hierdie opsie met omsigtigheid te gebruik en verduidelik hoekom. Ek kan van myself byvoeg dat ek dit gebruik het. As jy regtig nodig het, maak seker dat die databasis na herstel die herstelmodus verlaat (kies pg_is_in_recovery() moet “f” wys) en maak vir ingeval 'n volledige rugsteun na herstel.

3. Begin die groepering:

sudo pg_ctlcluster 11 main start

Nadat ons die rugsteun herstel het, moet ons 'n tweede rugsteun uitvoer:

Bewaarplek (pgbackrest-gebruiker):

sudo pgbackrest --stanza=main backup

Dis al. Ten slotte wil ek u daaraan herinner dat ek geensins probeer voorgee om 'n senior dba te wees nie en die wolke by die geringste geleentheid sal gebruik. Tans begin ek self verskeie onderwerpe bestudeer soos rugsteun, replikasie, monitering, ens. en ek skryf klein verslae oor die resultate om 'n klein bydrae tot die gemeenskap te maak en klein cheat sheets vir myself te los.

In die volgende artikels sal ek probeer om oor bykomende kenmerke te praat - die herstel van data na 'n skoon groepering, enkripteer rugsteun en publisering na S3, rugsteun via rsync.

Bron: will.com

Voeg 'n opmerking