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 # Параметр, указывающий сколько хранить полных бэкапов. Т.е. если у вас есть два полных бэкапа и вы создаете третий, то самый старый бэкап будет удален. Можно произносить как "хранить не более двух бэкапов" - по аналогии с ротациями логов. Спасибо @Aytuar за исправление ошибки.
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 --log-level-console=info --delta --recovery-option=recovery_target=immediate restore

Om de database te herstellen naar de staat van de laatste VOLLEDIGE back-up, gebruikt u de opdracht zonder recovery_target op te geven:

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

Belangrijk! Na herstel kan het gebeuren dat de database vastloopt in de herstelmodus (er zullen fouten optreden zoals ERROR: kan DROP DATABASE niet uitvoeren in een alleen-lezen transactie). Eerlijk gezegd begrijp ik nog niet waar dit mee te maken heeft. De oplossing is als volgt (u moet even wachten nadat de opdracht is uitgevoerd):

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

Het is zelfs mogelijk om een ​​specifieke back-up op naam te herstellen. Hier ben ik alleen Ik zal een link naar de beschrijving van deze functie in de documentatie verstrekken. De ontwikkelaars adviseren om deze optie met voorzichtigheid te gebruiken en leggen uit waarom. Ik kan van mezelf toevoegen dat ik het heb gebruikt. Als het echt nodig is, zorg er dan voor dat de database na het herstel de herstelmodus verlaat (selecteer pg_is_in_recovery() moet “f” tonen) en maak, voor het geval dat, een volledige back-up na het herstel.

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