Inkrementelle postgresql backups med pgbackrest - et kursus for en ung fighter fra udvikleren

Ansvarsfraskrivelse

Jeg er udvikler. Jeg skriver kode og interagerer kun med databasen som bruger. På ingen måde foregiver jeg at være systemadministrator, meget mindre en dba. Men…

Det skete så, at jeg havde brug for at organisere en sikkerhedskopi af postgresql-databasen. Ingen skyer - brug bare SSH og sørg for at alt fungerer uden at bede om penge. Hvad gør vi i sådanne tilfælde? Det er rigtigt, vi skubber pgdump ind i cron, sikkerhedskopierer alt til arkivet hver dag, og hvis vi er helt tabt, sender vi dette arkiv et sted langt væk.

Denne gang var vanskeligheden, at databasen ifølge planerne skulle vokse med omkring +- 100 MB om dagen. Selvfølgelig vil ønsket om at tage backup af alt med pgdump efter et par uger forsvinde. Det er her inkrementelle sikkerhedskopier kommer til undsætning.

Interessant? Velkommen til kat.

Inkrementel sikkerhedskopiering er en type sikkerhedskopiering, når ikke alle kildefiler kopieres, men kun nye og dem, der er ændret siden oprettelsen af ​​den forrige kopi.

Som enhver udvikler, der var ABSOLUT uvillig (på det tidspunkt) til at forstå forviklingerne ved postgres, ville jeg finde den grønne knap. Nå, du ved, ligesom i AWS, DigitalOcean: du trykkede på en knap - du fik replikering, du trykkede på den anden - du satte sikkerhedskopier, den tredje - du rullede alt et par timer tilbage. Jeg fandt ikke en knap eller et smukt GUI-værktøj. Hvis du kender en (gratis eller billig), så skriv om den i kommentarerne.

Efter at have googlet fandt jeg to værktøjer pgbarman и pg ryglæn. Det lykkedes simpelthen ikke med den første (meget sparsom dokumentation, jeg forsøgte at finde ud af alt i henhold til gamle manualer), men med den anden viste dokumentationen sig at være på niveau, men ikke uden fejl. For at forenkle arbejdet for dem, der står over for en lignende opgave, blev denne artikel skrevet.

Efter at have læst denne artikel vil du lære, hvordan du laver trinvise sikkerhedskopier, gemmer dem på en fjernserver (lager med sikkerhedskopier) og gendanner dem i tilfælde af datatab eller andre problemer på hovedserveren.

Træning

For at gengive manualen skal du bruge to VPS. Den første vil være lageret (depotet, som sikkerhedskopierne vil blive gemt på), og det andet, faktisk serveren selv med postgres (i mit tilfælde version 11 af postgres).

Det antages, at du på serveren med postgres har root, sudo user, postgres user og selve postgres er installeret (postgres brugeren oprettes automatisk ved installation af postgresql), og på repository serveren er der root og sudo bruger (i manualen brugernavnet pgbackrest vil blive brugt).

For at du får færre problemer med at gengive instruktionerne, skriver jeg i kursiv hvor, med hvilken bruger og med hvilke rettigheder udførte jeg kommandoen mens du skriver og tjekker artiklen.

Montering af pgryglæn

Repository (bruger pgbackrest):

1. Download arkivet fra pgbackrest og overfør dets indhold til mappen /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. Installer de nødvendige afhængigheder til montering:

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

3. Samling af pgryglæn:

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

4. Kopier den eksekverbare fil til mappen /usr/bin:

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

5. Pgryglæn kræver perl. Installere:

sudo apt-get install perl

6. Opret mapper til logfiler, giv dem visse rettigheder:

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

pgbackrest version

Postgres-server (sudo-bruger eller root):

Processen med at installere pgbackrest på en server med postgres ligner installationsprocessen på repository (ja, pgbackrest skal være installeret på begge servere), men i 6. afsnit befaler anden og sidste:

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

Erstat med:

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

Opsætning af interaktion mellem servere via adgangskodefri SSH

For at pgbackrest skal fungere korrekt, er det nødvendigt at konfigurere interaktionen mellem postgres-serveren og repository ved hjælp af nøglefilen.

Repository (bruger pgbackrest):

Opret et nøglepar:

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

Advarsel! Vi kører ovenstående kommandoer uden sudo.

Postgres-server (sudo-bruger eller root):

Opret et nøglepar:

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-bruger):

Kopier postgres-serverens offentlige nøgle til lagerserveren:

(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

På dette trin bliver du bedt om adgangskoden til root-brugeren. Du skal indtaste adgangskoden til root-brugeren på postgres-serveren!

Postgres-server (sudo-bruger):

Kopier den offentlige nøgle til lageret til serveren med 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

På dette trin bliver du bedt om adgangskoden til root-brugeren. Du skal indtaste nøjagtigt adgangskoden til rodbrugeren af ​​depotet!

Vi tjekker:

Repository (rodbruger, for eksperimentets renhed):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres-server (rodbruger, for eksperimentets renhed):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Vi sørger for, at vi får adgang uden problemer.

Opsætning af en postgres-server

Postgres-server (sudo-bruger eller root):

1. Lad os tillade at banke på postgres-serveren fra eksterne IP'er. For at gøre dette skal du redigere filen postgresql.conf (placeret i /etc/postgresql/11/hovedmappen), tilføjer linjen til den:

listen_addresses = '*'

Hvis en sådan linje allerede eksisterer, skal du enten fjerne kommentarer til den eller indstille parameterværdien som '*'.

I fil pg_hba.conf (findes også i mappen /etc/postgresql/11/main) tilføje følgende linjer:

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

hvor:

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

2. Lad os foretage de nødvendige indstillinger i postgresql.conf (det er i mappen /etc/postgresql/11/main) for at pgryglænet fungerer:

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

3. Lad os foretage de nødvendige indstillinger i pgbackrest-konfigurationsfilen (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Genindlæs postgresql:

sudo service postgresql restart

Opsætning af en lagerserver

Repository (pgbackrest-bruger):

Lad os foretage de nødvendige indstillinger i konfigurationsfilen pg ryglæn
(/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

Oprettelse af et lager

Repository (pgbackrest-bruger):

Opret et nyt lager til klyngen main:

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

inspektion

Postgres-server (sudo-bruger eller root):

Vi tjekker på postgres-serveren:

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

Repository (pgbackrest-bruger):

Vi tjekker på lagerserveren:

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

Vi sørger for, at vi i outputtet ser linjen "check command end: completed successfully".

Træt? Lad os gå videre til den mest interessante del.

At lave en sikkerhedskopi

Repository (pgbackrest-bruger):

1. Udfør en sikkerhedskopi:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Sørg for, at der er oprettet en sikkerhedskopi:

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

Pgbackrest vil oprette den første fulde backup. Hvis du ønsker det, kan du køre backup-kommandoen igen og sørge for, at systemet opretter en trinvis backup.

Hvis du vil lave en fuld backup igen, skal du angive et ekstra flag:

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

Hvis du ønsker detaljeret konsoloutput, skal du også angive:

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

Gendannelse af en sikkerhedskopi

Postgres-server (sudo-bruger eller root):

1. Stop den kørende klynge:

sudo pg_ctlcluster 11 main stop

2. Gendannelse fra backup:

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

For at gendanne databasen til tilstanden for den sidste FULD sikkerhedskopi skal du bruge kommandoen uden at angive recovery_target:

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

Vigtig! Efter gendannelse kan det ske, at databasen sætter sig fast i gendannelsestilstand (der vil være fejl som ERROR: kan ikke udføre DROP DATABASE i en skrivebeskyttet transaktion). For at være ærlig har jeg endnu ikke forstået, hvad det hænger sammen med. Løsningen er som følger (du bliver nødt til at vente lidt efter kommandoen er udført):

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

Faktisk er det muligt at gendanne en specifik sikkerhedskopi ved dens navn. Her er jeg kun Jeg vil give et link til beskrivelsen af ​​denne funktion i dokumentationen. Udviklerne råder til at bruge denne mulighed med forsigtighed og forklare hvorfor. Jeg kan tilføje fra mig selv, at jeg brugte det. Hvis du virkelig har brug for det, skal du sørge for, at databasen afslutter gendannelsestilstanden efter gendannelse (vælg pg_is_in_recovery() skal vise "f") og, for en sikkerheds skyld, lav en fuld sikkerhedskopi efter gendannelse.

3. Start klyngen:

sudo pg_ctlcluster 11 main start

Efter gendannelse af sikkerhedskopien skal vi udføre en anden sikkerhedskopiering:

Repository (pgbackrest-bruger):

sudo pgbackrest --stanza=main backup

Det er alt. Afslutningsvis vil jeg minde om, at jeg på ingen måde forsøger at udgive mig for at være en senior dba og vil bruge skyerne ved den mindste lejlighed. I øjeblikket er jeg selv i gang med at studere forskellige emner som backup, replikering, overvågning mv. og jeg skriver små rapporter om resultaterne for at give et lille bidrag til fællesskabet og efterlade små snydeark til mig selv.

I de følgende artikler vil jeg forsøge at tale om yderligere funktioner - datagendannelse til en ren klynge, kryptering af sikkerhedskopier og udgivelse til S3, sikkerhedskopier via rsync.

Kilde: www.habr.com

Tilføj en kommentar