Incrementele postgresql-back-ups met pgbackrest - een cursus voor een jonge vechter van de ontwikkelaar

Disclaimer

Ik ben een ontwikkelaar. Ik schrijf code en communiceer alleen als gebruiker met de database. Ik pretendeer op geen enkele manier een systeembeheerder te zijn, laat staan ​​een dba. Maar…

Het gebeurde zo dat ik een back-up van de postgresql-database moest organiseren. Geen clouds - gebruik gewoon SSH en zorg ervoor dat alles werkt zonder om geld te vragen. Wat doen wij in zulke gevallen? Dat klopt, we pushen pgdump in cron, maken elke dag een back-up van alles naar het archief, en als we helemaal verdwaald zijn, sturen we dit archief ergens ver weg.

Deze keer was de moeilijkheid dat de database volgens de plannen met ongeveer +- 100 MB per dag zou moeten groeien. Natuurlijk zal na een paar weken de wens om van alles een back-up te maken met pgdump verdwijnen. Dit is waar incrementele back-ups te hulp komen.

Interessant? Welkom bij kat.

Incrementele back-up is een type back-up waarbij niet alle bronbestanden worden gekopieerd, maar alleen nieuwe en de bestanden die zijn gewijzigd sinds het maken van de vorige kopie.

Zoals elke ontwikkelaar die (op dat moment) ABSOLUUT niet bereid was de fijne kneepjes van postgres te begrijpen, wilde ik de groene knop vinden. Nou ja, net als in AWS, DigitalOcean: je drukte op één knop - je kreeg replicatie, je drukte op de tweede - je stelde back-ups in, de derde - je draaide alles een paar uur terug. Ik heb geen knop of een mooie GUI-tool gevonden. Als je er een kent (gratis of goedkoop), schrijf er dan over in de reacties.

Na googlen vond ik twee tools pgbarman ΠΈ pgrugleuning. Bij de eerste lukte het simpelweg niet (zeer schaarse documentatie, ik probeerde alles uit te zoeken volgens oude handleidingen), maar bij de tweede bleek de documentatie in orde, maar niet zonder gebreken. Om het werk te vereenvoudigen van degenen die met een soortgelijke taak worden geconfronteerd, is dit artikel geschreven.

Na het lezen van dit artikel leert u hoe u incrementele back-ups kunt maken, deze op een externe server (repository met back-ups) kunt opslaan en deze kunt herstellen in geval van gegevensverlies of andere problemen op de hoofdserver.

Opleiding

Om de handleiding te reproduceren heeft u twee VPS nodig. De eerste is de opslag (de repository waarop de back-ups worden opgeslagen), en de tweede, in feite, de server zelf met postgres (in mijn geval versie 11 van postgres).

Er wordt aangenomen dat je op de server met postgres root, sudo user, postgres user hebt en postgres zelf is geΓ―nstalleerd (de postgres gebruiker wordt automatisch aangemaakt bij het installeren van postgresql), en op de repository server is er root en sudo user (in de handleiding de gebruikersnaam pgbackrest zal worden gebruikt).

Om ervoor te zorgen dat u minder problemen ondervindt bij het reproduceren van de instructies, schrijf ik cursief waar, met welke gebruiker en met welke rechten heb ik het commando uitgevoerd tijdens het schrijven en controleren van het artikel.

Pgbackrest installeren

Repository (gebruiker pgbackrest):

1. Download het archief van pgbackrest en breng de inhoud over naar 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. Installeer de afhankelijkheden die nodig zijn voor montage:

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

3. Pgrugleuning monteren:

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

4. Kopieer het uitvoerbare bestand naar de map /usr/bin:

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

5. Pgbackrest vereist perl. Installeren:

sudo apt-get install perl

6. Maak mappen voor logs en geef ze bepaalde rechten:

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

pgbackrest version

Postgres-server (sudo-gebruiker of root):

Het installatieproces van pgbackrest op een server met postgres is vergelijkbaar met het installatieproces op de repository (ja, pgbackrest moet op beide servers worden geΓ―nstalleerd), maar in de 6e paragraaf het tweede en laatste commando:

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

vervangen door:

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

Interactie tussen servers opzetten via wachtwoordloze SSH

Om pgbackrest correct te laten werken, is het noodzakelijk om de interactie tussen de postgres-server en de repository te configureren met behulp van het sleutelbestand.

Repository (gebruiker pgbackrest):

Maak een sleutelpaar:

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

Waarschuwing! We voeren de bovenstaande opdrachten uit zonder sudo.

Postgres-server (sudo-gebruiker of root):

Maak een sleutelpaar:

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

Kopieer de openbare sleutel van de postgres-server naar de repository-server:

(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

Bij deze stap wordt u gevraagd om het wachtwoord voor de rootgebruiker. U moet het wachtwoord van de rootgebruiker van de postgres-server invoeren!

Postgres-server (sudo-gebruiker):

Kopieer de openbare sleutel van de repository naar de server 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

Bij deze stap wordt u gevraagd om het wachtwoord voor de rootgebruiker. U moet exact het wachtwoord van de rootgebruiker van de repository invoeren!

controleren:

Repository (rootgebruiker, voor de zuiverheid van het experiment):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres-server (rootgebruiker, voor de zuiverheid van het experiment):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Wij zorgen ervoor dat we zonder problemen toegang krijgen.

Een postgres-server opzetten

Postgres-server (sudo-gebruiker of root):

1. Laten we toestaan ​​dat externe IP-adressen op de postgres-server kloppen. Om dit te doen, bewerkt u het bestand postgresql.conf (bevindt zich in de map /etc/postgresql/11/main), en voegt er de regel aan toe:

listen_addresses = '*'

Als een dergelijke regel al bestaat, verwijdert u de opmerkingen of stelt u de parameterwaarde in als '*'.

In bestand pg_hba.conf (bevindt zich ook in de map /etc/postgresql/11/main) voeg de volgende regels toe:

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. Laten we de nodige instellingen maken postgresql.conf (het staat in de map /etc/postgresql/11/main) om pgbackrest te laten werken:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Π“Π΄Π΅ main - Π½Π°Π·Π²Π°Π½ΠΈΠ΅ кластСра. ΠŸΡ€ΠΈ установкС postgres автоматичСски создаСт кластСр main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Laten we de nodige instellingen maken in het pgbackrest-configuratiebestand (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Postgresql opnieuw laden:

sudo service postgresql restart

Een repositoryserver opzetten

Repository (pgbackrest-gebruiker):

Laten we de nodige instellingen maken in het configuratiebestand pgrugleuning
(/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 # ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ сколько Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹Ρ… бэкапов. Π’.Π΅. Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΠΏΠΎΠ»Π½Ρ‹Ρ… бэкапа ΠΈ Π²Ρ‹ создаСтС Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ - ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ вмСстС с ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. 
start-fast=y # НачинаСт Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΡƒΡ‚ https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Een repository maken

Repository (pgbackrest-gebruiker):

Maak een nieuwe opslag voor het cluster hoofd-:

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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°

Postgres-server (sudo-gebruiker of root):

We controleren op de postgres-server:

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

Repository (pgbackrest-gebruiker):

We controleren op de repositoryserver:

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

We zorgen ervoor dat we in de uitvoer de regel "controleer opdracht einde: voltooid" zien.

Moe? Laten we verder gaan met het meest interessante deel.

Een back-up maken

Repository (pgbackrest-gebruiker):

1. Voer een back-up uit:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Zorg ervoor dat er een back-up is gemaakt:

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

Pgbackrest maakt de eerste volledige back-up. Als u wilt, kunt u de opdracht backup opnieuw uitvoeren en ervoor zorgen dat het systeem een ​​incrementele backup maakt.

Als u opnieuw een volledige back-up wilt maken, geef dan een extra vlag op:

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

Als u gedetailleerde console-uitvoer wilt, specificeer dan ook:

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

Een back-up herstellen

Postgres-server (sudo-gebruiker of root):

1. Stop het actieve cluster:

sudo pg_ctlcluster 11 main stop

2. Herstellen vanaf een back-up:

sudo -u postgres pgbackrest --stanza=main --delta restore

3. Start het cluster:

sudo pg_ctlcluster 11 main start

Nadat we de back-up hebben hersteld, moeten we een tweede back-up uitvoeren:

Repository (pgbackrest-gebruiker):

sudo pgbackrest --stanza=main backup

Dat is alles. Tot slot wil ik u eraan herinneren dat ik op geen enkele manier probeer te doen alsof ik een senior dba ben en bij de minste gelegenheid gebruik zal maken van de clouds. Momenteel begin ik zelf verschillende onderwerpen te bestuderen, zoals back-up, replicatie, monitoring, enz. en ik schrijf kleine rapporten over de resultaten om een ​​kleine bijdrage te leveren aan de gemeenschap en kleine spiekbriefjes voor mezelf achter te laten.

In de volgende artikelen zal ik proberen te praten over extra functies: gegevensherstel naar een schoon cluster, versleuteling van back-ups en publiceren naar S3, back-ups via rsync.

Bron: www.habr.com

Voeg een reactie