Còpies de seguretat de postgresql incrementals amb pgbackrest: un curs de lluitador jove d'un desenvolupador

Exempció de responsabilitat

Sóc desenvolupador. Escric codi, interactuo amb la base de dades només com a usuari. De cap manera pretenc ser un administrador del sistema i, a més, un dba. Però…

Va passar que necessitava organitzar una còpia de seguretat de la base de dades postgresql. Sense núvols: mantingueu SSH i feu que tot funcioni i no demaneu diners. Què fem en aquests casos? Així és, introduïm pgdump a cron, fem una còpia de seguretat de tot a l'arxiu cada dia i, si ens dispersem completament, enviem aquest arxiu a un lloc llunyà.

Aquesta vegada, la dificultat va ser que, segons els plans, la base de dades havia de créixer uns + - 100 MB per dia. Per descomptat, després d'un parell de setmanes, el desig de fer una còpia de seguretat de tot amb pgdump desapareixerà. Aquí és on les còpies de seguretat incrementals són útils.

Interessant? Benvingut sota el gat.

Una còpia de seguretat incremental és una mena de còpia de seguretat quan no es copien tots els fitxers font, sinó només els nous i els modificats des que es va crear la còpia anterior.

Com qualsevol desenvolupador que no volia (en aquell moment) entendre les complexitats de postgres, volia trobar un botó verd. Bé, ja ho sabeu, com a AWS, DigitalOcean: vaig prémer un botó: vaig obtenir la rèplica, vaig prémer el segon; vaig configurar còpies de seguretat, el tercer, tot es va revertir fa un parell d'hores. No he trobat cap botó i una bella eina GUI. Si en coneixeu un (gratuït o barat), escriviu-ne als comentaris.

Buscant a Google he trobat dues eines pgbarman и pgbackrest. Amb el primer, simplement no ho vaig aconseguir (documentació molt pobra, vaig intentar recollir-ho tot segons manuals antics), però el segon va resultar ser a nivell de documentació, però no sense defecte. Per simplificar la feina d'aquells que s'enfronten a una tasca similar, es va escriure aquest article.

Després de llegir aquest article, aprendràs a fer còpies de seguretat incrementals, guardar-les en un servidor remot (repositori amb còpies de seguretat) i restaurar-les en cas de pèrdua de dades o altres problemes al servidor principal.

Entrenament

Necessitareu dos VPS per reproduir el manual. El primer serà el repositori (el repositori on es faran les còpies de seguretat), i el segon, de fet, el propi servidor amb postgres (en el meu cas, versió 11 de postgres).

Se suposa que al servidor amb postgres teniu instal·lats root, sudo user, postgres user i el mateix postgres (l'usuari de postgres es crea automàticament quan s'instal·la postgresql), i al servidor de repositoris teniu root i sudo user (nom d'usuari pgbackrest s'utilitzarà al manual).

Perquè tinguis menys problemes a l'hora de reproduir les instruccions -escric en cursiva on, amb quin usuari i amb quins drets he executat l'ordre mentre escriu i revisa l'article.

instal·lació de pgbackrest

Repositori (usuari de pgbackrest):

1. Baixeu l'arxiu de pgbackrest i transferiu-ne el contingut a la carpeta /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. Instal·leu les dependències necessàries per al muntatge:

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

3. Recollim pgbackrest:

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

4. Copieu el fitxer executable al directori /usr/bin:

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

5. Pgbackrest requereix perl. Instal·lar:

sudo apt-get install perl

6. Creeu directoris per als registres, doneu-los certs drets:

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

pgbackrest version

Servidor Postgres (usuari sudo o root):

El procés d'instal·lació de pgbackrest en un servidor postgres és similar a la instal·lació en un repositori (sí, pgbackrest s'ha d'instal·lar als dos servidors), però al sisè paràgraf, la segona i última ordre:

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

substituir per:

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

Configuració de la comunicació entre servidors mitjançant SSH sense contrasenya

Perquè pgbackrest funcioni correctament, cal configurar la interacció entre el servidor postgres i el repositori mitjançant el fitxer de claus.

Repositori (usuari de pgbackrest):

Crea un parell de claus:

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

Atenció! Les ordres anteriors s'executen sense sudo.

Servidor Postgres (usuari sudo o root):

Crea un parell de claus:

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

Repositori (usuari sudo):

Copieu la clau pública del servidor postgres al servidor del dipòsit:

(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

En aquest pas, demanarà la contrasenya a l'usuari root. Heu d'introduir exactament la contrasenya de l'usuari root del servidor de postgres!

Servidor Postgres (usuari sudo):

Copieu la clau pública del repositori al servidor amb 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

En aquest pas, demanarà la contrasenya a l'usuari root. Heu d'introduir la contrasenya de l'usuari root del repositori!

Comprovem:

Repositori (usuari root, per a la puresa de l'experiment):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Servidor Postgres (usuari root, per a la puresa de l'experiment):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Ens assegurem que tinguem accés sense problemes.

Configuració d'un servidor postgres

Servidor Postgres (usuari sudo o root):

1. Permetem "toc" al servidor postgres des d'una ip externa. Per fer-ho, editeu el fitxer postgresql.conf (situat a la carpeta /etc/postgresql/11/main) afegint-hi la línia següent:

listen_addresses = '*'

Si aquesta línia ja existeix, descomenta-la o defineix el valor del paràmetre a '*'.

A l'arxiu pg_hba.conf (també es troba a la carpeta /etc/postgresql/11/main) afegiu les línies següents:

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

on:

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

2. Fem la configuració necessària a postgresql.conf (és a la carpeta /etc/postgresql/11/main) perquè pgbackrest funcioni:

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

3. Feu els paràmetres necessaris al fitxer de configuració de pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Reinicieu postgresql:

sudo service postgresql restart

Configuració d'un servidor de repositoris

Repositori (usuari de pgbackrest):

Feu els paràmetres necessaris al fitxer de configuració 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

Crea una volta

Repositori (usuari de pgbackrest):

Creeu un emmagatzematge nou per al clúster principal:

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

inspecció

Servidor Postgres (usuari sudo o root):

Comproveu al servidor de postgres:

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

Repositori (usuari de pgbackrest):

Comproveu al servidor del repositori:

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

Ens assegurem que a la sortida veiem la línia "check command end: completed successfully".

Cansat? Passem al més interessant.

Fent una còpia de seguretat

Repositori (usuari de pgbackrest):

1. Fes una còpia de seguretat:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Ens assegurem que s'ha creat la còpia de seguretat:

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

pgbackrest crearà la primera còpia de seguretat completa. Si ho voleu, podeu tornar a executar l'ordre de còpia de seguretat i assegurar-vos que el sistema crea una còpia de seguretat incremental.

Si voleu tornar a fer una còpia de seguretat completa, especifiqueu una marca addicional:

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

Si voleu una sortida detallada de la consola, també especifiqueu:

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

Restauració d'una còpia de seguretat

Servidor Postgres (usuari sudo o root):

1. Atureu el clúster en execució:

sudo pg_ctlcluster 11 main stop

2. Restauració des d'una còpia de seguretat:

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

Per restaurar la base de dades a l'estat de la darrera còpia de seguretat COMPLETA, utilitzeu l'ordre sense especificar recovery_target:

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

Important! Després de la recuperació, pot resultar que la base de dades es penja en mode de recuperació (hi haurà errors com ERROR: no es pot executar DROP DATABASE en una transacció de només lectura). Per ser sincer, encara no entenc amb què està connectat. Es resol de la següent manera (caldrà esperar una mica després de l'execució de l'ordre):

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

De fet, és possible restaurar una còpia de seguretat específica pel seu nom. Aquí només estic Indicaré un enllaç a la descripció d'aquesta característica a la documentació. Els desenvolupadors aconsellen utilitzar aquest paràmetre amb precaució i expliquen per què. Des de mi mateix puc afegir que el vaig fer servir. Si realment ho necessiteu, assegureu-vos que la base de dades estigui fora del mode de recuperació després de la recuperació (seleccioneu pg_is_in_recovery() hauria de mostrar "f") i, per si de cas, feu una còpia de seguretat completa després de la recuperació.

3. Inicieu el clúster:

sudo pg_ctlcluster 11 main start

Després de restaurar la còpia de seguretat, hem de fer una segona còpia de seguretat:

Repositori (usuari de pgbackrest):

sudo pgbackrest --stanza=main backup

Això és tot. En conclusió, vull recordar-vos que de cap manera estic intentant fingir ser un dba sènior i utilitzaré els núvols a la menor oportunitat. Actualment, jo mateix estic començant a estudiar diversos temes com la còpia de seguretat, la rèplica, la supervisió, etc. i escric petits informes sobre els resultats per tal de fer una petita contribució a la comunitat i deixar petites trameses per a mi.

En els articles següents, intentaré parlar de funcions addicionals: restauració de dades a un clúster net, xifrat de còpies de seguretat i publicació a S3, còpies de seguretat mitjançant rsync.

Font: www.habr.com

Afegeix comentari